功能和var
相似,却去掉了不少var
身上的坏毛病javascript
块状做用域java
{ var a = '123'; } { let b = '456' } // 若是在浏览器环境执行的时候 console.log(a);// '123' console.log(b);// b is not defined
不会往全局变量上面绑定,防止全局变量的污染es6
var a = '123'; let b = '456'; // 直接结果 console.log(window.a);// '123' console.log(window.b);// undefined;
相同做用域中不容许重复声明相同变量浏览器
let a = '123'; let a = '456'; // 执行结果 console.log(a);// 抛出语法错误:SyntaxError: Identifier 'me' has already been declared
经典的例子app
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
在es6
以前并无很好的办法进行常量的声明,常量:这是一个只读的变量,es6
中给出了const
这个特性,专门用来处理这类问题代理
const a = '123'; a = '456'; // 抛出异常 SyntaxError: "a" is read-only
须要注意下,常量的对象,其中的属性是能够被改变的code
const obj = { name:'hello' } obj.name = 'hello 2'; // 这个地方是合法的
这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 }
这是es6
提供的一个强大的特性,能够经过非侵入的方式,修改对象的默认行为ip
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:... }