在ES5.1到ES6经历了较大改动,时间也是最长的
let
<script>
{
var a = 111
let b = 222
var c = 333
}
console.log(a)
console.log(b)
console.log(c)
alert(123123)
</script>
控制台结果为:
111
Uncaught ReferenceError: b is not defined
let 是在代码块内有效,var 是在全局范围内有效
<script>
var a = 111
var a = 222
let b = 333
let b = 444
var c = 555
var c = 666
console.log(a) // 222
console.log(b) //Identifier 'b' has already been declared
console.log(c) // 666
alert(123123)
</script>
控制台结果为
Uncaught SyntaxError: Identifier 'b' has already been declared
let只能声明一次,多次声明会直接报错不会输出任何其他代码;var可多次声明
console.log(a); //undefined
var a = "aaa";
console.log(b); //ReferenceError: a is not defined
let b = "bbb";
console.log(c); //undefined
var c = "ccc";
输出结果为
undefined
Uncaught ReferenceError: Cannot access 'b' before initialization
let 不存在变量提升,var 会变量提升;var js内部会声明为undefined,let不会
const
<script>
/*
const定义常量与使用let 定义的变量相似:
二者都是块级作用域
都不能和它所在作用域内的其他变量或函数拥有相同的名称
两者还有以下两点区别:
const声明的常量必须初始化,而let声明的变量不用
const定义常量的值不能通过再赋值修改,也不能再次声明。而 let 定义的变量值可以修改。
*/
const A = 123//正确,若为常量(其值不可变,若为对象,对象中的属性可变)
let b = '456'
/*
const A
A = 123
错误,必须初始化(必须赋值或对象等)
*/
//创建常量对象
const person = {name:'Mary',sex:'female',age:22,A,b}
//修改属性
person.name = 'Sara'
person.age = 23
person.A = 321
person.b = 654
//添加属性
person.height = 170
console.log(person)
console.log('a=' + A)
console.log('b=' + b)
const cars = ["Tesla", "Jeep", "BMW"]
//修改元素
cars[0] = 'Benz'
//添加元素
// 添加元素
cars.push("Audi")
//cars = ["Toyota", "Volvo", "Audi"] // 错误,不能重新对cars赋值
console.log(cars)
</script>