1.let和var的区别:
(1). let 不存在变量提升、没有预解析
let a = 1;
var b = 2;
console.log(c)//会报错 因为let 不存在变量提升、没有预解析
(2).同一个作用域内不能重复定义同一个名称
let x = 1;
let x = 2;
console.log(x) //报错 原因x被重复定义
var x = 1;
let x = 2;
console.log(x) //报错 原因x被重复定义
var x = 1;
x = 2;
console.log(x) //结果为2
x = 1;
let x = 2;
console.log(x) //报错 原因x被重复定义
(3).作用域 块级作用域 {}
function fun {
var s = 123; //一个作用域
if(true) {
let s = 456; //另一个作用域
console.log(s) //结果为456
}
console.log(s) //结果为123
}
fun();
暂时性死区
b = 100;
if(true) {
b = 200;
let b; //在同一个作用域下, 不能声明同样的名称(只要有let)
}
console.log(b);//报错
当函数的形参与函数内的let定义的变量名一样时 会报错
function fun3(i) {
//i = 999; //形参相当于这个
let i = 100;
console.log(i); //报错
}
fun3(999)
for循环
for(var i = 0; i < 6; i++) {}
console.log(i); //结果为 6 i全局变量 i最后一次的结果
for(let j = 0; j < 6; j++) {}
console.log(i); //报错 j没有定义
2.const声明一个只读的常量
const a = 1;
a = 100; //报错
const b;//报错 一但声明,必须进行初始化赋值
如果是对象或者数组是可以改变的
原因: 对于简单类型的数据 值就保存在指向的那个内存地址
对于复合类型数据来说 保存的是一个指向实际数据的指针
const只能保证这个指针是固定的
//常量obj存储的是一个地址,这个地址指向一个对象 不可变的是这个地址 但不能把obj指向另一个地址 但对象本身是可变的 所以可以为这个对象添加属性
const obj = {};
obj.name = '郑建';
obj.age = 18;
obj = {id: 1};//不能把obj指向另一个地址
常量arr是一个数组, 数组本身是可写的 如果另一个数组赋值给arr就会报错
const arr = []
arr.push(1);
arr[1] = 2;
arr = ['a'] //报错