(1) let 用来声明块级作用域的变量,所以下面例子能打印出正确的数字,而不是像var一样全都是打印最后一个.
var _div = document.getElementsByTagName('div');for(let i=0;i<_div.length;i++){_div[i].onclick = function(){console.log(i)}}
(2) es5中,给prototype设置的属性或方法,可以在要调用时直接用.属性或.方法来调用
es6中直接用class声明方法实例,然后同样.方法来调用内部属性或方法:
class ObjFn{//构造器constructor(){this.name = '我是zzz,es6'console.log( this )}age(){console.log( this.name + ',今年18岁' );}}let _objFn = new ObjFn();_objFn.age();
(3) es6 子类继承父类,子类中的super()相当于在此实例化了一个父类对象。一般没有继承,就用不着super()
// 这是父类class ObjFn{constructor(){this.name = '我是zzz,es6'}age(){console.log( this.name + ',今年18岁' );}}// 这是子类class SubClassFn extends ObjFn{constructor(){//这super()就是先得到了父类的this,也就是父类的实例对象super();this.eat = '就是能吃';}}let _subClassFn = new SubClassFn();//调用父类的age()_subClassFn.age();console.log( _subClassFn.eat )
(4) destructuring,解构。
es6,可以按照一定的模式,从数组和对象当中去取值、赋值,
这个过程,被称为解构。
// es5的赋值写法var aa = 111;var bb = 222;var xxobj = {aa:aa,bb:bb};console.log( xxobj );// es6的赋值的写法:let a1 = 123;let a2 = 444;let obj = {a1,a2}console.log( obj );// es6的取值的写法:let _xxObj = {name:'我是zzz',age: '今年18'}//name和age就是定义的变量,注意命名要和_xxObj中的一样let {name, age} = _xxObj;console.log( name, age );
(5) generator函数,有yield值,分段执行。
// 定义Generator函数,// 现在这个函数里面的值,就有了四个阶段,// 每个阶段有不同的状态function* xxfn(){yield 'a';yield 'b';yield 'c';return 'd end.. '}// xxfn(),这种方式并不是执行xxfn函数// 返回的也不是xxfn函数的运行的结果var _xxfn = xxfn();// 打印出来的是,// 是一个指向其内部状态的指针对外 ,// 就是一个引用,是一个迭代器对象的引用console.log( _xxfn );
打印结果:
要一个个获取到每一次yield返回的值,就用next()
function* xxfn(){yield 'a11';yield 'b22';yield 'c333';return 'd end.. '}var _xxfn = xxfn();// 这是运行到第一个 yield语句console.log( _xxfn.next() );// 结果是Object {value: "a11", done: false}
/*’a11’,就是xxfn这个函数执行到了第一个yield语句之后得到的值;
关于done : false,这里的false,是说 xxfn这个函数,还没执行完。在这就是暂停一下。
