ECMAScript6笔记(一)

一、let

1、let声明的变量拥有块级作用域。

2、解决了循环绑定事件等问题

for(let i = 0;i < 10;i ++){
    a[i] = function(){
        console.log(i);
    }    
}
a[5]();//  5

3、没有变量提升

块级作用域中有let和外部有var声明同一变量时,let生效,var不生效。

var tmp = 1;
if(a){
    tmp = 2;  // 报错
    let tmp;
    tmp = 3;  // tmp = 3
}
// tmp = 1

4、同级作用域不能重复声明同一变量

5、可用{}自定义块级作用域

6、块级作用域中的函数声明

在块级作用域中声明函数不能在作用域外调用,函数声明只提升到块级作用域的顶部,尽量块级作用域中少使用函数声明,可以用函数表达式

二、const

1、声明常量

声明必须和初始化一起,不允许先声明后初始化,如果仅仅声明也会报错。
只在声明的块级作用域中有效,不能重复声明,没有变量提升

2、声明复合类型变量

复合类型变量变量名不指向数据,而是指向地址,const只能保证变量的地址不会改变,不会保证地址的数据不会变,也就是说声明对象的时候,对象内的值可以改变,也可以添加新属性。可以通过Object.freeze({})冻结对象,这样对象的就不能添加新的属性了。可以通过如下函数将对象的属性也冻结

var constantize = (obj) => {
  Object.freeze(obj);
  Object.keys(obj).forEach( (key, value) => {
    if ( typeof obj[key] === 'object' ) {
          constantize( obj[key] );
    }
  });
};

三、全局变量

varfunction声明的变量可以成为全局变量的属性,letclassconst声明的变量不会成为全局变量的属性。也就是说

var a = 1;
window.a; // 1
let a = 2;
window.b; // undefined

四、解构赋值

1、数组的解构赋值

只要左右格式相似就可以实现解构赋值(右边必须是数组,如果不是会报错),如果左边有右边没有的则是undefined,letconst也可以。

var [a,[b],c] = [1,[2]];
//a = 1;b = 2;c = undefined;

数组解构复制的默认值是undefined

function f(){
    console.log('aa');
}
var [a,b = 'c',d = 'e',x = f(),y = x] = [1,undefined,null,1];
// a = 1,b = c,d = null,x = 1,y = 1(如果x右边没有值才会等于f())

2、对象的解构赋值

var {foo,bar,www} = {bar : "bbb",foo : "aaa"};
// foo = aaa,bar = bbb,www = undefined

var obj = {foo : "aaa",baz : "ccc"};
var {foo:one,baz:two} = obj;
// one = aaa,two = ccc

对象解析的内部机制是,先找到同名属性,然后赋值给后者变量(foo:baz,foo是同名属性是模式,baz是后者)。":"左边的都是模式,右边才是赋值,如果有嵌套,直到最后的”:“右边才是变量
let,const在同级作用域下声明和赋值必须是一起的。但是var没事,可以通过{}改变作用域来实现,但是避免如下情况

let foo;
let {foo} = {foo : "bbb"}// 报错

let baz;
(let {baz} = {baz : "bb"})// 成功

var a;
{a} = {a:"cc"}// 报错

var b;
({a} = {a : 1})// 成功

var let {sin,cos} = Math;//很方便的赋值

其他跟数组解构赋值相似

3、字符串解构赋值

let [a,b,c,d,e] = 'hello';
// a = 'h',b = 'e',c = 'l',d = 'l'.e = 'o'

let {length : len} = 'hello';
//len = 5,length是获取'hello'的length

4、数值和布尔值的解构赋值

会将等号右边是数值和布尔值转换为对象然后进行解构赋值,但是null和undefined无法转换,会报错

5、函数参数解构赋值

function a([foo,bar]){}
a([1,2]);
function b({foo,bar}){}
b({foo:1,bar:2});

6、圆括号

在解构非模式部分使用

7、用途

(1)交换变量的值
(2)从函数返回值

function f(){
    return [1,2,3];
}
let [a,b,c] = f();

(3)提取JSON数据

var json = {
    id : 12,
    name : ""123
}
let {a,b} = json;

(4)函数传参
(5)遍历Map结构

var map = new Map();
map.set('first','hello');
map.set('second','nihao');
for(let[key,value] of map){
    console.log(key + value);
}
// first hello
// second nihao
for(let[key] of map)
//遍历键值
for(let[,value] of map)
//遍历值
posted @ 2016-06-30 19:50  FEHammer  阅读(162)  评论(0)    收藏  举报