let是ES6新增的,它主要是彌補var的缺陷,你也可以把let看做var的升級版。下面我就來詳細講講var和let的區別
var和let的區別
不同點:
(1)var是全局作用域,let不是
var 和 let 聲明的變量在全局作用域中被定義時,兩者非常相似。但是,被let聲明的變量不會作為全局對象window的屬性,而被var聲明的變量卻可以
let a = 'aaa; var b = 'bbb'; console.log(window.a); // undefined console.log(window.b); //'bbb'
(2)var沒有塊級作用域,let有塊級作用域
let有塊級作用域,而var沒有塊級作用域,這是二者最明顯的區別。例如:
var func; if(1 == 1){ var name = "LHS" func = function(){ console.log(name) } } name = "ljq"; func();//輸出的:ljq
一般情況我們都希望把塊級內的與塊級內數據區分,但var沒有塊級作用域,只有函數作用域
如果大家還不理解,我再舉例子:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>閉包</title> <style type="text/css"> div { width: 100px; height: 100px; background: lightgreen; float: left; margin: 20px; font: 30px/100px "microsoft yahei"; text-align: center; } </style> </head> <body> <div>a</div> <div>b</div> <div>c</div> <div>d</div> <div>e</div> <div>f</div> <div>g</div> <div>h</div> <div>i</div> <div>j</div> </body> <script type="text/javascript"> var divs=document.getElementsByTagName("div"); for (var i=0;i<divs.length;i++) { divs[i].onclick=function(){ alert(i);//都是輸出:10 } } </script> </html>
運行結果,點擊輸出都是10
以上問題就是var沒有塊級作用域,我們可以把函數作用域代替了塊級作用域,用閉包解決問題:
var divs=document.getElementsByTagName("div"); for (var i=0;i<divs.length;i++) { (function(i){ divs[i].onclick=function(){ alert(i); } })(i) }
閉包寫起來有點麻煩,但使用let的話就可以一步到位:
var divs=document.getElementsByTagName("div"); for (let i=0;i<divs.length;i++) { divs[i].onclick=function(){ alert(i); } }
結果跟使用閉包一樣,但比閉包簡單
(3)var屬於ES5規范,let屬於ES6規范
相同點:
(1)var和let都有函數級作用域
const
(1)const定義的值不可以修改,而且必須初始化
(2)const是常量,var和let是變量
(3)常量的含義是指對象不能修改,但是可以改變對象內部的屬性,如:
const app = { id:1, name:"lhs" } app.name="ljq"; console.log(app.name);//輸出:ljq
es6對象字面量增強
相對於ES5,ES6的對象字面量得到了很大程度的增強。這些改進我們可以輸入更少的代碼同時語法更易於理解。那就一起來看看對象增強的功能。
屬性增強寫法
//屬性增強寫法 const id = 1; const name = "LHS"; const age = 20 const app = { id, name, age, } console.log(app);
函數增強寫法
//函數增強寫法 const ipp = { msg(){ console.log("函數增強寫法"); } } ipp.msg();