JavaScript中var、const、let三个声明变量的关键字有何区别?
1.const定义的变量类似于指针指向某个引用,不可以修改(但并非一成不变),而且必须初始化,不指定初始值编译报错。
const x;//编译报错,常量值丢失Missing initializer in const declaration // x = 20;//编译报错,常量不可赋值Assignment to constant variable. const y = 10;//定义并初始化,正确 //y = 30;//编译报错,常量不可赋值 console.log(y);//打印->10 const ARR = [5,6];//定义常量数组 ARR.push(7);//压值 console.log(ARR); // 可以打印[5,6,7]
2.var定义的变量可以修改,如果不初始化会输出undefined,不会报错,会在编译时提升执行。
var x;//声明变量 console.log(x);//可以打印undefined,不会报错 console.log(str);//不会报错,会打印undefined,因为var变量提升 var str = 10;//声明并且初始化 console.log(str);//打印->10 str = 30;//修改变量 console.log(str);//打印->30 function test(){ y = 10;//不指定关键字默认全局变量,方法外可以访问 console.log(y);//可以打印->10 } test();//执行方法 console.log(y);//打印->10
3.let定义的变量是块级作用域并且不允许在同一作用域中定义相同的变量,函数内部使用let定义后,对函数外部无影响(编译报错后面部分不执行)。
首先var变量可以重复声明,后边定义的将会覆盖之前定义的变量。
var str = 10;//声明并且初始化 var str = 123;//直接覆盖 console.log(str);//打印->123
而let变量不可重复声明,编译不通过。
let sts = 10; let sts = 20;//已有初始值,编译报错Identifier 'sts' has already been declared console.log(sts);
let为块级作用域。
{ let s = 20; var x = 30; } if(true){ var y = 40; let q = 50; } let arr = [1,2,3,4]; for (let i = 0; i <arr.length; i++) { var sum = arr[i]; let sums = arr[i]; } console.log(sum);//打印->4//可以访问var变量 // console.log(sums);//编译报错sums is not defined console.log(y);//打印->40,说明var声明的变量外部可以访问 // console.log(q);//编译报错 is not defined console.log(x);//打印->30 // console.log(s);//编译报错s is not defined
总结
1.var变量声明将会提升,如果是必须要全局的变量可以考虑用var来声明,不建议使用。
2.let变量声明不会提升,由于作用域小性能也会更好一些,所以推荐使用let声明变量,长远来看,JavaScript可能会有多线程的实现(比如Intel的River Trail那一类的项目),这时let
表示的变量,只应出现在单线程运行的代码中,不能是多线程共享的,这样有利于保证线程安全。。
3.常量,固定不变的用来表示某些特定的值,用const来声明,尤其是在全局环境,不应该设置变量,只应设置常量,并且编译器会对const进行优化,有利于效率和性能的提升。