功能和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:... }