let/const变量

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值