首页 > 代码库 > 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之间的小数,取整以后等于-0repeat视同为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_INTEGERNumber.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+的常用内容