es6特性介绍(中)

声明变量 let

功能和var类似,却去掉了很多var身上的坏毛病

  1. 块状作用域

    {
        var a = '123';
    }
    {
        let b = '456'
    }
    // 如果在浏览器环境执行的时候
    console.log(a);// '123'
    console.log(b);// b is not defined
  2. 不会往全局变量上面绑定,防止全局变量的污染

    var a = '123';
    let b = '456';
    // 直接结果
    console.log(window.a);// '123'
    console.log(window.b);// undefined;
  3. 相同作用域中不允许重复声明相同变量

    let a = '123';
    let a = '456';
    // 执行结果
    console.log(a);// 抛出语法错误:SyntaxError: Identifier 'me' has already been declared
  4. 经典的例子

    for(var i=1;i<10;i++){
    }
    console.log(i); // 输出10,一不小心就污染了全局环境
    // 使用let,就不会有这个问题
    for(let j=1;j<10;j++){
    }
    console.log(j); // 抛出引用异常:ReferenceError: j is not defined

声明常量 const

es6之前并没有很好的办法进行常量的声明,常量:这是一个只读的变量,es6中给出了const这个特性,专门用来处理这类问题

    const a = '123';
    a = '456'; // 抛出异常 SyntaxError: "a" is read-only

需要注意下,常量的对象,其中的属性是可以被改变的

    const obj = {
        name:'hello'
    }
    obj.name = 'hello 2'; // 这个地方是合法的

for…of

es6提供的一个新的迭代器,功能类似for...in,只是前者返回的是value,而后者返回的是脚标

    let data = ['a','b','c'];
    for(let i in data){
        console.log(i);// 输出 0,1,2
    }
    
    for(let j of data){
        console.log(j);// 输出 a,b,c
    }

代理 Proxies

这是es6提供的一个强大的特性,可以通过非侵入的方式,修改对象的默认行为

    var obj = {
        name:'dog'
    };
    var handler = {
        get:function(target,key){
            return target[key].replace('dog','cat');
        }
    };
    // 设置代理
    var proxy = new Proxy(obj,handler);
    console.log(proxy.name);

可以进行代理的属性还有很多:

var handler = {
  get:...,
  set:...,
  has:...,
  deleteProperty:...,
  apply:...,
  construct:...,
  getOwnPropertyDescriptor:...,
  defineProperty:...,
  getPrototypeOf:...,
  setPrototypeOf:...,
  enumerate:...,
  ownKeys:...,
  preventExtensions:...,
  isExtensible:...
}
    原文作者:糟老头
    原文地址: https://segmentfault.com/a/1190000012654646
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞