首页 > 代码库 > es6+的常用内容
es6+的常用内容
一.let,const
1.因为块级的作用域,这样打印01234,循环外打印i会报错
for (let i = 0; i < 5; i++) { setTimeout(console.log(i), 0);}
用es6以后,可以用块级作用域代替闭包
2.不存在变量提升
var tmp = 123;if (true) { tmp = ‘abc‘; // ReferenceError let tmp;}
一个大括号就是一个作用域,let tmp使该作用域绑定了tmp,let前赋值就报错。
3.不能重复声明
4.块级作用域内声明的函数类似于let
,对作用域之外没有影响
function f() { console.log(‘I am outside!‘); }(function () { if (false) { // 重复声明一次函数f function f() { console.log(‘I am inside!‘); } } f();}());
这种方式在es5中if里面的f声明会提前,在es6中,if条件不满足就不执行函数声明,因为这个声明类似let。
5.const 声明后不能修改变量内容
二.变量的解构赋值
var [a, b, c] = [1, 2, 3];
let [ , , third] = ["foo", "bar", "baz"];third // "baz"let [x, , y] = [1, 2, 3];x // 1y // 3let [head, ...tail] = [1, 2, 3, 4];head // 1tail // [2, 3, 4]
下面代码的写法会报错,因为JavaScript引擎会将{x}
理解成一个代码块,从而发生语法错误。只有不将大括号写在行首,避免JavaScript将其解释为代码块,才能解决这个问题。
var a; { a} = {a:1}console.log(a );//error
解构赋值需要等号右边具有Iterator接口,比如generator函数。
1.解构赋值允许指定默认值。
var [foo = true] = [1];foo // 1
es6会用全等判断 foo对应的值 ===undefined,相等就会用默认值。不等就用它对应的值。
以上相当于 1?(foo=1):(foo=true);就是说,如果默认值foo=函数,如果后面不是undefined这个函数就不会执行。
2.关于解构赋值中的圆括号
变量声明语句中,不能带有圆括号。
// 全部报错var [(a)] = [1];var {x: (c)} = {};var ({x: c}) = {};var {(x: c)} = {};var {(x): c} = {};var { o: ({ p: p }) } = { o: { p: 2 } };
赋值语句中,不能将整个模式,或嵌套模式中的一层,放在圆括号之中。
// 全部报错({ p: a }) = { p: 42 };([a]) = [5];
可以使用圆括号的情况只有一种:赋值语句的非模式部分,可以使用圆括号。
[(b)] = [3]; // 正确({ p: (d) } = {}); // 正确[(parseInt.prop)] = [3]; // 正确
三.字符串拓展
这里只写常用的方法
1.ES6为字符串添加了遍历器接口,使得字符串可以被for...of
循环遍历。
2.at
方法,可以识别Unicode编号大于0xFFFF
的字符,返回正确的字符。
‘abc‘.at(0) // "a"‘??‘.at(0) // "??"
3.字符串的方法
- includes():返回布尔值,表示是否找到了参数字符串。
- startsWith():返回布尔值,表示参数字符串是否在源字符串的头部。
- endsWith():返回布尔值,表示参数字符串是否在源字符串的尾部。
这三个方法都支持第二个参数,表示开始搜索的位置。
var s = ‘Hello world!‘;s.startsWith(‘world‘, 6) // trues.endsWith(‘Hello‘, 5) // trues.includes(‘Hello‘, 6) // false
4.repeat方法
‘x‘.repeat(3) // "xxx"‘hello‘.repeat(2) // "hellohello"‘na‘.repeat(0) // ""
参数如果是小数,会被取整。如果参数是0到-1之间的小数,则等同于0,这是因为会先进行取整运算。0到-1之间的小数,取整以后等于-0
,repeat
视同为0。如果repeat
的参数是字符串,则会先转换成数字。
5.ES7推出了字符串补全长度的功能。如果某个字符串不够指定长度,会在头部或尾部补全。padStart
用于头部补全,padEnd
用于尾部补全。
‘x‘.padStart(5, ‘ab‘) // ‘ababx‘‘x‘.padStart(4, ‘ab‘) // ‘abax‘‘x‘.padEnd(5, ‘ab‘) // ‘xabab‘‘x‘.padEnd(4, ‘ab‘) // ‘xaba‘
第一个参数用来指定字符串的最小长度,第二个参数是用来补全的字符串。
四.数值扩展
1.ES6提供了二进制和八进制数值的新的写法,分别用前缀0b
(或0B
)和0o
(或0O
)表示。
2.ES6在Number对象上,新提供了Number.isFinite()
和Number.isNaN()
两个方法。Number.isFinite()
用来检查一个数值是否为有限的(finite)。
3.ES6将全局方法parseInt()
和parseFloat()
,移植到Number对象上面,行为完全保持不变。
4.Number.isInteger()
用来判断一个值是否为整数。
5.ES6在Number对象上面,新增一个极小的常量Number.EPSILON
Number.EPSILON// 2.220446049250313e-16
6.ES6引入了Number.MAX_SAFE_INTEGER
和Number.MIN_SAFE_INTEGER
这两个常量,用来表示这个范围的上下限。Number.isSafeInteger()
则是用来判断一个整数是否落在这个范围之内。
五.Math对象的扩展
1.Math.trunc
方法用于去除一个数的小数部分,返回整数部分。
2.Math.sign
方法用来判断一个数到底是正数、负数、还是零。
它会返回五种值。
- 参数为正数,返回+1;
- 参数为负数,返回-1;
- 参数为0,返回0;
- 参数为-0,返回-0;
- 其他值,返回NaN。
3.Math.cbrt
方法用于计算一个数的立方根。
4.ES7新增了一个指数运算符(**
)
let a = 2;a **= 2;// 等同于 a = a * a;
es6+的常用内容