5. 数字扩展
进制表示
es6 中,二进制的表示方法都是以 0b 开头
console.log(0b111101110); // 494
es6 中,八进制的表示方法都是以 0o 开头
console.log(0o767); //503
数值判断
判断是否为有效数值
console.log("15", Number.isFinite(15)); //true console.log("NaN", Number.isFinite(NaN)); //false console.log("1/0", Number.isFinite(1 / 0)); // false
判断是不是数
console.log("NaN", Number.isNaN(NaN)); //false console.log("0", Number.isNaN(0)); //true
判断是否整数
console.log(Number.isInteger(25)); //true console.log(Number.isInteger(25.0)); //true 25.0 等于 25 console.log(Number.isInteger(25.1)); //false 25.1 不等于 25 console.log(Number.isInteger("25")); //false 参数必须是数
数的边界
console.log(Number.MAX_SAFE_INTEGER); //9007199254740991 console.log(Number.MIN_SAFE_INTEGER); //-9007199254740991
判断安全范围内的整数
console.log(Number.isSafeInteger(10)); //true console.log(Number.isSafeInteger(10.4)); //false
返回一个小数的整数部分
console.log(Math.trunc(4.11)); //4 console.log(Math.trunc(4.9)); //4
判断一个数 正数 负数 零
console.log(Math.sign(-5)); //-1 console.log(Math.sign(0)); //0 console.log(Math.sign(5)); //1 console.log(Math.sign("ffd")); //NaN
计算立方根
console.log(Math.cbrt(-1)); //-1 console.log(Math.cbrt(8)); //2 console.log(Math.cbrt("gf")); //NaN
6. 数组扩展
数组转换
一组数据转换成数组
let arr = Array.of(3, "sd", 7, 9, 11); console.log("arr=", arr); //[3, "sd", 7, 9, 11]
类数组转真数组
// 把元素集合转义成数组 let p = document.querySelectorAll("p"); let pArr = Array.from(p); pArr.forEach(item => { console.log(item.textContent); //ES6 //慕课网 //学习教程 }); //映射关系 console.log(Array.from([1, 3, 5], item => item * 2)); // [2,6,10]
填充数组
console.log([1, "a", undefined].fill(7)); // [7,7,7] // 后两个参数 起始位置 终止位置 console.log(["a", "b", "c", "d", "e"].fill(7, 1, 3)); //['a',7,7,'d','e']
打印值
返回数组索引
for (let index of ["1", "c", "ks"].keys()) { console.log(index); //0 //1 //2 }
返回索引与值, 配合解构使用
for (let [index, value] of ["1", "c", "ks"].entries()) { console.log(index, value); //0 '1' //1 'c' //2 'ks' }
从第 3 个位置开始读到 4 之前,放到第 0 个位置
console.log([1, 2, 3, 4, 5].copyWithin(0, 3, 4)); //[4, 2, 3, 4, 5]
找到符合条件的第一个数值
console.log([1, 2, 3, 4, 5, 6].find(item => item > 3)); //4
找到符合条件的第一个索引
console.log([1, 2, 3, 4, 5, 6].findIndex(item => item > 3)); //3
这个数组中是否包括 目标值
console.log([1, 2, NaN].includes(1)); //true console.log([1, 2, NaN].includes(NaN)); //true
7. 函数扩展
参数
参数默认值
function test(x, y = "world") { console.log("默认值", x, y); } test("hello"); //hello world
是取得参数中的值
let x = "test"; function test2(x, y = x) { console.log("作用域", x, y); } test2("kaka"); // kaka kaka
如果参数中没有x 就朝外取值
let x = "test"; function test2(c, y = x) { console.log("作用域", c, y); } test2("kaka"); // kaka test
rest 参数, 扩展运算符
// 把一些离散的值转换成了数组 function test3(...arg) { for (let v of arg) { console.log("rest", v); // 1 // 5 // a } } test3(1, 5, "a"); // 把数组转成离散的值 console.log("a", ...[1, 2, 4]); //a 1 2 4
箭头函数
// this 绑定 // es5: 函数被调用时的对象 // es6: 定义时候的对象 let arrow = v => v * 2; console.log(arrow(3)); //6 let arrow2 = () => 5; console.log(arrow2()); //5
尾调用
function tail(x) { console.log("tail", x); } function fx(x) { return tail(x); } fx(123); // 123
8. 对象扩展
简洁表达
let o = 1; let k = 2; let es5 = { o: o, k: k }; let es6 = { o, k }; console.log(es5); console.log(es6); // {o: 1, k: 2} let es5_method = { hello: function() { console.log("hello es5"); } }; let es6_method = { hello() { console.log("hello es6"); } }; es5_method.hello(); es6_method.hello();
属性表达式
let a = "b"; let es5_obj = { a: "c" }; // 中括号包起变量,a 是变量,变量的值是b let es6_obj = { [a]: "c" }; console.log(es5_obj); //{a: "c"} console.log(es6_obj); //{b: "c"}
新增api
// 判断相等,等同 === console.log(Object.is("abc", "abc")); //true // 引用类型 引用两个不同地址 console.log(Object.is([], [])); //false // 浅拷贝 属性有限制 ,拷贝自身属性的地址 console.log("拷贝", Object.assign({ a: "a" }, { b: "b" })); //{a: "a", b: "b" let test = { k: 123, o: 456 }; for (let [key, value] of Object.entries(test)) { console.log([key, value]); // ["k", 123] // ["o", 456]
扩展运算符 (es7特性, 支持度不高)
//扩展运算符 (es7特性) //let { a, b, ...c } = { a: "test", b: "kill", c: "ddd", d: "ccc" }; // c= { // c:ddd, // d:ddd // }
9. symbol 类型
symbol 作用
提供一个独一无二的值
//声明 let a1 = Symbol(); let a2 = Symbol(); console.log(a1 === a2); //false // 设定key值,同key 的值是相等的 let a3 = Symbol.for("a3"); let a4 = Symbol.for("a3"); console.log(a3 === a4); //true
使用场景
// 同键值不会造成冲突 let a1 = Symbol.for("abc"); let obj = { [a1]: "123", abc: 345, c: 456 }; console.log(obj); //{abc: 345, c: 456, Symbol(abc): "123"} /** * 对象中有用到symbol作key值时,for in 和 let of 是拿不到属性的 */ for (let [key, value] of Object.entries(obj)) { console.log(key, value); // abc 345 // c 456 } for (let key in obj) { console.log(key, obj[key]); // abc 345 // c 456 } // 这时候就需要一个api了,得到一个数组 Object.getOwnPropertySymbols(obj).forEach(item => { console.log(obj[item]); // 123 (只取到symbol) }); // 所有都要那到要使用Reflect, 返回symbol变量作为key值的属性 Reflect.ownKeys(obj).forEach(item => { console.log(item, obj[item]); // abc 345 // c 456 // Symbol(abc) '123' });