关于let和const

块级作用域

let所声明的变量,只在let命令所在的代码块内有效。很适合for循环,真是一大利器啊,经典案例选项卡走起

for (let i=0;i

此时的aBox[i]中的i用的就是第一层let声明的i,简直爽翻天啊~

for循环还有一个特别之处,就是设置循环变量的那部分是一个父作用域,而循环体内部是一个单独的子作用域。

for (let i = 0; i < 3; i++) {
   console.log(i);  ReferenceError
   let i = 'abc';
   console.log(i);//打印三次abc
}

此时的子作用域已经被i=abc占有,第一次console.log(i)的时候,明显就犯了变量提升的问题,所以会报错,个人建议如果不是太需要,不要用这个特性,好像貌似平时也用不上,呵呵哒~

不存在变量提升

console.log(a);//报错ReferenceError
let a=10;

let跟val不一样,不存在变量提升,这样会直接报错

不允许重复声明

var c=8;
let c=8;//Identifier 'c' has already been declared

let d=6;
let d=6;////Identifier 'd' has already been declared

用let声明的变量不允许重复声明,否则会报错

暂时性死区

var b=9;
 if (true){
   b=0;  //ReferenceError
   let b;
 }

只要块级作用域内存在let命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。



const拥有let的特性,另外还具备别let不具备的特性,下面让我们剖析一下

const声明一个只读的常量。一旦声明,常量的值就不能改变。

const a=10;
a=0;//Assignment to constant variable.

果断报错,毋庸置疑

const声明的对象和数组的数据结构是可以改变的

const c={};
c.name='张三';
console.log(c);//{"name":"张三"}
c={};//Assignment to constant variable.

const d=[];
d.push('c');
console.log(d)//['c']
d=[1,2];//Assignment to constant variable.

const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址不得改动。对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,因此等同于常量。但对于复合类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指针,const只能保证这个指针是固定的,至于它指向的数据结构是不是可变的,就完全不能控制了。因此,将一个对象声明为常量必须非常小心。




今天就分享这些内容吧,不多,能大概了解下let和const常用的特性,希望对大家有所帮助谢谢~

万年不变的国际惯例:
如果大家想看更详细的资料,请狠狠的点击这里



你可能感兴趣的:(关于let和const)