let和const聲明的變量只在代碼塊內有效
{ let a = 10; var b = 1; } a // ReferenceError: a is not defined. b // 1
不存在變量提升
變量一定要在聲明後使用,否則報錯
var tmp = 123; if (true) { tmp = 'abc'; // ReferenceError let tmp; }
不允許重復聲明
// 報錯 function () { let a = 10; var a = 1; }
塊級作用域
function f() { console.log('I am outside!'); } (function () { if(false) { // 重復聲明一次函數f function f() { console.log('I am inside!'); } } f(); }()); //I am inside! ES5 函數提升 //I am outside! ES6 塊級作用域
const命令
聲明一個只讀的常量,一旦聲明,常量的值就不能改變
一旦聲明變量,就必須立即初始化,不能留到以後賦值
let命令、const命令、class命令聲明的全局變量,不屬於全局對象的屬性
var a = 1; // 如果在Node的REPL環境,可以寫成global.a // 或者采用通用方法,寫成this.a window.a // 1 let b = 1; window.b // undefined
下面再單獨給大家介紹ES6之const命令
一直以來以ecma為核心的js始終沒有常量的概念,es6則彌補了這一個缺陷;
const foo='foo'; foo='bar';//TypeError: Assignment to constant variable.
上例聲明了一個基本類型的常量,如過試圖修改初始值則會報錯;如果是引用類型的值同樣適用,但是有一點需要注意,舉例說明:
const foo=[]; foo=[1];//Assignment to constant variable.
正常報錯,沒毛病,再看:
const foo=[1,2,3]; foo[1]=4; console.log(foo)//[1, 4, 3]
這怎麼沒報錯?而且還能修改成功? 這兩個例子不一樣的地方在於前者是修改了指針(需熟悉js 引用類型)對應的內容改變了,後者則不是指向依然沒變 但是指向對象的內容發生改變了,對於foo而言我只是一個指針負責指向對應的對象 至於對象內容是什麼就不管我的事了所以可以修改;如果不想讓內容也改變也行使用另一個方法;
const foo=Object.freeze([1,2,3]); foo[1]=4; console.log(foo)//[1, 2, 3]
這樣就不用擔心被修改了;