● 我们所说的ES5和ES6其实就是在js语法的发展过程中的一个版本而已
● ECMAScript就是js的语法,ES6新增了一些功能
● 我们以前都是使用var关键字来声明变量的
● 在ES6的时候,多了两个关键字let和const,也是用来声明变量的
● 只不过和var有一些区别:
(1)let和const不允许重复声明变量
// 使用var的时候重复声明变量是没问题的,只不过就是后面会把前面覆盖掉
var num = 100 var num = 200
// 使用let重复声明变量的时候就会报错了
let num = 100 let num = 200 //这里就会报错了
// 使用const重复声明变量的时候就会报错
const num = 100 const num = 200 //这里就会报错了
(2)let和const声明的变量不会在预解析的时候解析(也就是没有变量提升)
// 因为预解析(变量提升)的原因,在前面是有这个变量的,只不过没有赋值
console.log(num)//undefined var num = 100
// 因为let不会进行预解析(变量提升),所以直接报错了
console.log(num)//undefined let num = 100
// 因为const不会进行预解析(变量提升),所以直接报错了
console.log(num)//undefined const num = 100
(3)let和const声明的变量会被所有代码块限制作用范围
// var声明的变量只有函数能限制其作用域,其他的不能限制
if (true){ var num = 100 } console.log(num)//100
// let声明的变量,除了函数可以限制,所有的代码块都可以限制其作用域
(if/while/for/...) if (true) { let num = 100 console.log(num) // 100 } console.log(num) // 报错
// const声明的变量,除了函数可以限制,所有的代码块都可以限制其作用域
(if/while/for/...) if (true) { let num = 100 console.log(num) // 100 } console.log(num) // 报错
(1)let声明的变量的值可以改变,const声明的变量的值不可以改变
let num = 100 num = 200 console.log(num)//200
const num = 100 num = 200 //这里就会报错了,因为const声明的变量值不可以改变(我们也叫做常量)
但是对于改变用const定义的对象,当对象内容重新赋值时,不会报错
<script> const obj = { name:"yiyi" } obj.name = "linlin" //允许 obj = {name:"linlin"} //不允许,会报错 </script>
那代码中obj.name = "linlin",给name重新赋值,是允许的不会报错;但是obj = {name:“linlin”},给对象重新赋值就报错了,原因是当你给name重新赋值,只是这个对象的内容改变了,这个对象内容存储在堆里面,obj只是等于一个地址而已,现在地址没变,所以就是obj没被重新赋值,但是obj={name:“linlin”}是从新给obj负值了,这个const就不允许了,就报错。
(2)let声明的时候可以不赋值,const声明的时候必须赋值
let num num = 100 console.log(num)//100
const num //这里就会报错了,因为const声明的时候必须赋值