(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这个函数,还没执行完。在这就是暂停一下。