1.let和const 与 var 在变量提升上的区别
let和const与var一样都存在变量提升(在编译阶段变量会被提升至作用域的顶部,但不会被赋值,类似:let a),而const和let存在暂时性死区( 从变量进入作用域的那一刻,到变量被声明并初始化的那一行代码执行完之前)在声明之前不能被访问- // 输出为undefined,
- // 原因是var 变量的声明被提升到作用域顶部,但不会赋值,因此访问时是 undefined
- console.log(a);
- var a = 10;
- // 输出报错:Cannot access 'b' before initialization
- // 因为b变量的声明被提升到作用域顶部,但不会赋值,且存在暂时性死区,不能被访问,所以报错
- console.log(b);
- let b = 20;
复制代码
2.let和const 与 var 在作用域上的区别
var的作用域:在函数内部则是函数作用域,在函数外部则是全局作用域,
let和const的作用域是块级作用域, 即它只在 {} 内可访问 - if (true) {
- var c = 10;
- let c1 = 10;
- }
- // 输出c = 10
- // var 声明的变量,如果在块级作用域(如 if 或 for)内部声明,
- // 它也会被提升到全局作用域,注意:var在函数作用域内则在函数作用域内声明
- console.log(c);
- // 输出c1 is not defined,
- // 因为c1在test函数外面,不在块级作用域里面
- console.log(c1);
复制代码 特例:let和const不会污染全局作用域,var 的 i 是一个全局变量,因此所有函数引用的都是最终的 i- var arr = [];
- for (var i = 0; i < 10; i++) {
- arr[i] = function () {
- return i;
- };
- }
- // 输出10
- console.log(arr[5]());
- var arr = [];
- for (let i = 0; i < 10; i++) {
- arr[i] = function () {
- return i;
- };
- }
- // 输出5
- console.log(arr[5]());
复制代码
3.let和const 与 var 在声明变量上的区别
var能重复被声明,let和const不能被重复声明- var d = 10;
- var d = 20;
- // 输出d = 20
- console.log(d);
- let e = 10;
- // let e = 20;
- // 输出Identifier 'e' has already been declared
- // 因为e已经声明过了
- // console.log(e);
复制代码
4.let和const在值改变上的区别
let声明后的变量能重新被赋值,const声明后的值是一个常量不能重新被赋值(ps:const定义的对象内部的属性可以被改变)- let f = 10
- f = 20
- // 输出f为20
- console.log(f)
- const g = 10
- g = 20
- // 输出g为Assignment to constant variable
- // 原因是g不能重新被赋值,g被声明为一个常量
- console.log(g)
- const obj = { name: "Tom" };
- // 允许修改对象内部属性
- obj.name = "Jerry";
- // 输出Jerry
- console.log(obj.name);
复制代码
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |