目录
前言
在ES6出现之前,JavaScript中声明变量就只有通过 var 关键字,函数声明是通过 function 关键字,而在ES6之后,声明变量的方式有 var 、 let 、 const 等多种声明变量的方式,那么这三种声明变量有什么区别呢?如果三种声明变量应该如何使用呢?
变量声明
- 变量声明有三个 var let 和const
- 我们应该用哪一个呢?
- 首先排除var,老派写法,问题很多,不严谨,可以淘汰掉...
- 那么先用哪一个呢? let or const?
- 建议:const优先,尽量使用const,原因事:
- const语义化更好
- 很多变量我们声明的时候就知道他不会改变了,那为什么不用const呢?
- 实际开发中也是如此,比如react框架,基本都是const
- 请问以下代码是否可以将let改为const?
<script> // 简单数据类型 let num1 = +prompt('请输入第一个数字') let num2 = +prompt('请输入第二个数字') alert(`两个数字相加的结果为${num1 + num2}`) /* console.log(我叫' + '刘德华') // 我叫刘德华 let uname = '刘德华' let song = '忘情水' console.log(uname + song) // 刘德华忘情水 */ // 复杂数据类型 数组和对象 let arr = ['red','blue'] arr.push('pink') console.log(arr) let obj = { uname: '张三', age: '18岁', } obj.sex = '男' console.log(obj) </script>
<script> let num = 1 num=num + 1 conlose.log(num) // 2 for(let i = 0; i<num.length;i++){ document.write(num[i]) } </script>
第一个代码块中是可以的,因为它们的值都是没有变过的(没有重新赋值),其中,复杂数据类型是由堆和栈组成的,数组和对象只改变了数组内的值(堆),但数组和对象的地址没有改变(栈),只是在原来基础上增加一个元素,数组没有改变,改变的只是数组内的值,所以是可以用const来声明的(举个例子,比如今天天冷了,我套了一个马甲,我本身是没有任何改变的(栈),只是添加了一个马甲(堆),其中这个马甲就相当于数组或对象中新增的元素,对于我来说,我自己并没有改变(栈),改变的只是衣服而已(堆))
第二个代码块中是不可以的,因为它们的值会做重新赋值的操作(变量中值会改变,进行重新赋值操作)
- const声明的值不能改变,而且const声明变量的时候需要里面进行初始化
- 对于引用数据类型,const声明的变量,里面存的不是值,是地址
区别
综上所述,现在的ES6中,var的老派写法,问题很多,不严谨,等多种因素,已经被淘汰掉了,let一般用于基本数据类型的值或者引用类型的地址发生变化的时候,需要用let,比如一个变量进行加减运算(for循环中的i++),const一般用于不修改栈里的值时就可以使用,也就是说,let通常声明的为变量(栈里的地址会改变,进行重新赋值操作),const通常声明的为常量(栈里的地址不会改变,没有重新赋值)