Let Var Const的区别

it2024-03-25  77

Let Var Const 的区别

1.作用域

ES5 中作用域有:全局作用域、函数作用域。没有块作用域的概念。 ES6 中新增了块级作用域。块作用域由 { } 包括,if语句和 for语句里面的{ }也属于块作用域。

2. var、let、const的区别

①var定义的变量,没有块的概念,它可以跨块访问,但是不能跨函数访问。 ②let定义的变量,只能在块作用域访问 ,不能跨块也不能跨函数访问。 ③const 定义常量,使用时必须初始化(就是要赋值),只能在块作用域访问,不能跨块也不能跨函数访问,而且它的值不能修改* (第三点说明可以改的情况)*。 下面代码效果;

<script type="text/javascript"> { var a = 1; console.log(a); // 1 } console.log(a); // 1 // 通过var定义的变量可以跨块作用域访问到。 (function A() { var b = 2; console.log(b); // 2 })(); // console.log(b); // 报错, // 可见,通过var定义的变量不能跨函数作用域访问到 if(true) { var c = 3; } console.log(c); // 3 for(var i = 0; i < 4; i ++) { var d = 5; }; console.log(i); // 4 (循环结束i已经是4,所以此处i为4) console.log(d); // 5 // if语句和for语句中用var定义的变量可以在外面访问到, // 可见,if语句和for语句属于块作用域,不属于函数作用域。 </script> <script> //块级作用域 { var a=1; let b =2; const c =3; var aa; let bb; const cc;//报错 console.log(a);//1 console.log(b);//2 console.log(c);//3 console.log(aa);//undefinde console.log(bb);//undefinde } console.log(a);//1 console.log(b);//报错 console.log(c);//报错 //不能跨跨作用域 //函数作用域function(){ var a=4; let b=5; const c=6; console.log(a);//4 console.log(b);//5 console.log(c);//6 }(); console.log(a);//报错 console.log(b);//报错 console.log(c);//报错 //不能跨函数 </script>

3. const定义的对象属性可以改变的情况

有一个问题,上面说到 const 是不能修改的,但是实际测试后发现挺特殊的,在此记录一下。

<script> const Person = { name : 'XiaoMing', sex : '男' } person.name = 'XiaoHong' console.log(Person.name) </script>

运行上述代码,可以发现Person对象的name属性确实被修改了,这是咋回事?

因为对象是引用类型的,Person中保存的仅是对象的指针,这就意味着,const仅保证指针不发生改变,修改对象的属性不会改变对象的指针,所以是被允许的。也就是说const定义的引用类型只要指针不发生改变,其他的不论如何改变都是允许的。

然后我们试着修改一下指针,让Person指向一个新对象,会发现它果然报错

<script> const person = { name : 'XiaoMing', sex : '男' } person = { name : 'XiaoHong', sex : '女'} console.log(Person)// 报错 </script>
最新回复(0)