我们也许不需要了解所有未使用过的技术细节,但有必要掌握大而全的技术方向,在接触到时快速定位,深入思考。

本文是作者学习阮一峰老师的《ECMAScript入门》过程中,对es6新增特性的简要概括,其中有意忽略了es6中未确定但在es7中包含的标准、使用场景少、高深难理解的少数知识点。目的是使初学者对es新增特性的主要内容快速理解,方便建立知识库,日后查找时更有针对性。

 

目录:

。。。

 

一、let关键字

1.实现了块级作用域,let声明的变量只在代码块内有效。

2.let不像var会变量提升。

3.一个代码块内let会绑定变量。



var temp = 1;
{
   console.log(temp); //引用错误,未定义
   let temp =0;
   console.log(temp);  //0  
}



4.一个代码块里不能重复声明(var和let,let和let)

 

二、const关键字

就是不可改变的let关键字,同样块级作用域有效,不变量提升,不能重复声明。

在指向引用类型时,不可改变的是地址,对象本事是可以改变的。

 

三、解构

1.数组解构

  var [a,[b],d=5] =[1,[2,3],4]; //a=1,b=2,d=5

  左侧匹配不到右侧的变量为undefined;右侧匹配不到左侧没有关系;变量可以有默认值。

2.对象解构

  属性名需对应

3.字符串解构

  [a,b,c] = '123'; a='1',b='2',c='3'

4.函数解构



function add([a,b]){
  return a+b; 
}




四、字符串扩展

1.str.includes([i])

2.str.startsWith([i])

3.str.endsWith([i])

  以上三个返回值都是布尔类型,i是可选参数,表示起始位置

4.str.repeat(n) //字符串重复n次

5.字符串补全长度

  str.padStart(5,'a') //长度不足5,在头部用a补全

  str.padEnd(5,'b')  //长度不足5,在尾部用b补全

6.模板字符串,反引号``标识字符串,${name}嵌入变量

  `This is a ${name}.`

7.标签模板

8.String.raw() 反斜杠转义 \变成\\

 

五、正则扩展

1.y修饰符,必须从头开始匹配
2.sticky属性 ReExp.sticky表示是否使用了y修饰符
3.flags 返回修饰符

 

六、数值扩展

1.二进制:0b或0B
八进制:0o或0o
2.Number对象的扩展

  • Number.isFinite(),
  • isNaN(),
  • Number.parseInt(),
  • Number.parseFloat(),
  • Number.isInteger() 是否是整数,3.0是整数
  • Number.EPSILON() 浮点数可接受误差范围常量
  • Number.isSafeInteger()

3.Math对象的扩展

  • Math.trunc() 返回数值的整数部分 Math.trunc(2.1) //2
  • Math.sign() 返回值 +1 正数;-1负数;0 0;-0 -0
  • Math.cbrt() 计算一个数的立方根
  • Math.clz32()
  • Math.imul()
  • Math.fround()
  • Math.hypot() 平方和的平发根
  • Math.expm1(),Math.log1p(),Math.log10(),Math.log2()
  • Math.sinh(),Math.cosh(),Math.tanh(),Math.asinh(),Math.acosh(),Math.atanh()

 

七、数组的扩展

1.Array.from(obj, fn)

  将类数组、可遍历对象转化为数组,理解成只要有length属性就可以转为数组。fn是转化成数组时对元素的映射处理。

2.Array.of(1,3,5) //[1,3,5]

  将一组值转换成数组。

3.[].find(fn)

  数组实例的方法,返回该元素or undefined

4.[].findIndex(fn)

  返回该元素index  or -1

5.[].fill(7) //以7填充数组

   [].fill(value,begin,end) //以value填充指定位置

 

八、对象的扩展

1.属性简写



{
 name : 'Amy',
 age, //等价于age: age
 hi(){...} //等价于 hi: function(){...}
}



2.属性定义支持[表达式]

  obj[value1] = obj['color'+'blue']

3.Object.is() 

  判断是否相等,类似===,区别是+0!=-0,NaN==NaN

4.Object.assign(target, obj1, obj2, ...)

  将obj参数的所有属性依次添加到target上,返回target。

5.Object.setPrototypeOf(obj,prototype对象) 

  设置obj的prototype对象,类似的方法有Object.getPrototypeOf()。

 

九、新的原始数据类型——Symbol

产生原因:

  es5中对象的属性名是字符串类型,易重名,Symbol类型的每个值都是唯一的,可使用在一些可能重名的情形种。

定义和使用:

  因为Symbol是原始数据类型,所以不是对象,不需要new。

  var s1 = Symbol(); //不在全局登记

  var s2 = Symbol('foo'); //登记在全局下

  var s3 = Symbol('foo');

  s2 === s3 ; //false Symbol类型的值都不相等,用同一个标记登记了也不相等

  obj[s1]; //使用时不可以obj.s1,这就成了字符串,等价于obj['s1']

遍历:

  不能被keys()、for、Object.getOwnNames()等遍历到,只可以被Object.getOwnSymbols()遍历到。

方法:

  Symbol.for('a') 是否有以'a'为参数的全解决登记的Symbol值,有就返回,没有就创建一个全局登记的Symbol值。

  Symbol.keyFor('a') 返回全局登记过的Symbol值对应的key,即创建时的参数。

 

十、Proxy代理

I Proxy对象

使用示例,创建一个代理时,第一个参数是要代理的对象,第二个参数是要监控的操作:



var myProxy = new Proxy(target, {
      get: function(target, propKey, receiver){...}, //参数依次是被代理对象,属性名,this。下面操作的参数略
      set: function(target, propKey, value, receiver){...},
      has: function(target, propKey), //in操作
      deleteProperty: ...,
      enmuerate: ..., //for遍历
      hasOwn: ...,
      apply: ...,
      ... 
});



方法:Proxy.revocable() 返回带有revoke()方法的Proxy实例,这样实例一执行revoke(),代理就可以取消。

II Reflect对象

Reflect对象有Object和Proxy的多数方法,作用是让更多操作方法化,更可控。

III Object对象

Object.observe(obj, fn, ['事件类型']) ,这种功能不禁联想要双向绑定的实现。



Object.observe(obj, function(changes){
   add:
     update: 
   delete:
     setPrototype:
     reconfigure:
     proventExtensions:
}) ;



还有一种方式和代理的监听功能类似,就是set/get访问器,详见作者的《es5新增特性》。

 

未完待续...