1、var声明的变量有预解析(变量提升),造成 逻辑混乱,可以先使用,后声明
2、var可以重复定义同一个变量,逻辑错误,第二次应该是修改变量(覆盖上一个变量),而不是定义
3、var用在for循环条件中,造成for 循环的污染的问题(var在定义时生成了一个全局变量,for循环结束变量依旧存在,且变量值一直在内存中开辟空间造成污染)
4、var 声明的变量没有块级作用域(ES5中的作用域:全局和局部)
// 1、var声明的变量有解析,造成 逻辑混乱,可以先使用,后声明 // var a = 10; // console.log(a); // 2、var可以重复定义同一个变量,逻辑错误,第二次应该是修改变量,而不是定义 // var a = 10; // var a = 30; // console.log(a); // 3、var用在for循环条件中,造成for 循环的污染的问题 // for(var i=0; i<10; i++){ // console.log(i); // } // console.log("====================="); // console.log(i); // 4、var 声明的变量没有块级作用域(ES5中的作用域:全局和局部) // { // var b = 200; // } // console.log(b);
上面这些弊端,都在 ES6中的let关键字中得到解决:
// console.log(a); //报错 // let a = 10; // let a = 10; // let a = 30; //报错 // for(let i=0; i<10; i++){ // console.log(i); // } // console.log("====================="); // console.log(i); //报错 { let b = 200; } console.log(b); //报错
所以,let的特点:
1、let声明的变量没有预解析,不会有变量提升
2、let不可以重复定义同一个变量
3、let用在for循环条件中,不会造成for 循环的污染的问题
4、let声明的变量有块级作用域(ES6中的作用域:全局和局部还有块级作用域)
1、const用来定义常量,修改就会报错
2、我们约定俗成地把常量都命名为大写
3、对象型常量中的属性可以修改
4、数组型常量中的每一项数据的引用类型可以修改
// var PI = 3.141592653; // // console.log(PI); // // PI = 3.5; //不符合我们认知,因为π是个定值 // console.log(PI); //---------------------------------------------------- // const PI = 3.141592653; //定义PI常量 // PI = 3.5; //报错 //---------------------------------------------------- // const OBJ = { // name: "nodejs", // age:11, // email:"nodejs@163.com" // }; // // // OBJ = {}; //报错 // // OBJ.job = "nodejs@qq.com"; //可以修改成功 // console.log(OBJ); //{ name: 'nodejs', age: 11, email: 'nodejs@qq.com' } //---------------------------------------------------- const ARR = [10, 0, 30]; ARR[1] = 20; console.log(ARR); //[ 10, 20, 30 ]