let
1. 不能重复声明变量
用var: 后者覆盖前者:
var a=0;
var a=1;
console.log(a)//打印1;
用let: 重复声明变量直接报错
let b=0;
let b=1;
//Uncaught SyntaxError: Identifier 'b' has already been declared
2. let不存在变量提升,必须声明后才使用
console.log(c) //打印:undefined; var 可以提升变量到作用域的最前面;
var c=0;
console.log(n) //直接报错:Uncaught ReferenceError: n is not defined;
let n=0; //let 没有提升变量的能力,
3. 使用let会形成块级作用域,即:一对大括号形成的作用域
也就是说:if,for,while等语句,在语句里边有let声明的变了,在语句外边访问不到;
//形成块级作用域,在{}外访问不到;
if(true){
var qin = 0;
let jing=0;
}
console.log(qin)//打印:undefined;
console.log(jing)//直接报错:Uncaught ReferenceError: n is not defined
//在for循环中用let声明了变量,在外面不能使用;
<body>
<ul>
<li>放放风方法</li>
<li>反反复复</li>
<li>是生生世世</li>
<li>人人人人</li>
</ul>
<script>
let lis = document.getElementsByTagName('li');
//用let声明i,形成父级作用域;每循环一次重新定义i,i的初始值为上次i++后的值;
for( let i = 0; i < lis.length; i++ ){
lis[i].onclick = function(){//子级作用域
console.log(i);//分别点击每一个li打印:0,1,2,3;i如果是用var声明的,此时打印为最终在3
}
}
console.log(i);
// 在for循环中用let声明了变量,在外面不能使用;报错:Uncaught ReferenceError: i is not defined
例子1:
{
let a = 10;
{
let a = 100;
console.log(a)//打印:100
}
console.log(a)//打印:10
}
console.log(a)//直接报错;
例子2:
{
let a = 10;
{
console.log(a)//打印:10
}
console.log(a)//打印:10
}
例子3:
window.abc = 1;
var abc = 'miaov'//用var声明的变量会直接挂在window上;
console.log(window.abc)//打印:miaov
例子4:
window.abc = 1;//用let声明的变量不会挂在window上;
let abc = 'miaov'
console.log(window.abc)//打印:1
</script>
</body>
4. 暂时性死区;
定义:在代码块内,使用let命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称 TDZ)。
例子1:
console.log(window.n); // 不报错,打印undefined
console.log( typeof n );// 不报错,打印undefined
例子2:
// 判断变量有没有定义,不考虑:只声明未定义的这种情况;
if( typeof n !== 'undefined' ){
console.log('定义了');
}else{
console.log("没定义");
}
例子3:
console.log(typeof m);
//直接报错:let形成块级作用域,声明这个变量之前的区域就是这个变量的“死区”,在这个区域内只要使用就报错;
let m = 10;
const:声明常量
特性:一但定义了值不能改变;但是值存的是引用类型的数据,还是可以改变的(引址)
1.用const声明的变量,不能再次赋值,会直接报错
const apple = 9;
apple = 90;
//用const声明的变量,不能再次赋值,会直接报错
console.log(apple) //直接报错:Uncaught TypeError: Assignment to constant variable;
2.值存的是引用类型的数据,还是可以改变的
数组:
const arr = [1,2,3];//赋址
//变量的值不能改变;
arr = 1; //直接报错:Uncaught TypeError: Assignment to constant variable;
arr.push(4);
console.log(arr)//打印:1,2,3,4;引用的数组可以改变
对象:
const miao = {
a:'ketang'
};
miao.a = 2;
console.log(miao.a)//打印:2