微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ES6学习笔记:var、let、const三种声明变量方式的区别

var 、let、const三种声明变量方式的区别

简述:

命令varletconst
变量有效区域全局有效块级作用域内块级作用域内
是否允许重定义变量允许同一作用域内不允许同一作用域内不允许
是否有变量提升
变量声明之前是否可用可用不可用(暂时性死区)不可用(暂时性死区)
声明只读变量(常量)且必须立即初始化
声明复合对象时,数据地址不可修改,对象成员变量可以修改
使用freeze冻结数据

1 let关键字

1.1 基本方法

​ ES6新增块级作用域。

​ ES5有两种声明变量的方法:var、function命令。

​ ES6有六种声明变量的方法:var、function、let、const、import、class命令。

​ let命令,用于声明变量。用法类似var,但所声明的变量只在let命令所在的代码块内有效。

{
    let a =10;
    var b = 20;
}
console.log(a);		//[引用错误] ReferenceError:a is not defined
console.log(b);		//20

代码在let声明的块级作用域以外使用会报错,var却不会,所以let只能所定义的块级作用域内部使用

{
	var a = 10;
    var a = 20;
    console.log(a);		//20
}
{
    let b = 10;
    let b = 20;
    console.log(b);		//[语法错误] SyntaxError:Indentifier 'a' has already been declared
}

var声明的变量可以重新定义覆盖,而let不允许在同一作用域内重复声明变量。

​ let命令适合在for循环中使用。

​ ES6块级作用域可以无限嵌套,可替代ES5的匿名函数IIFE。

{
    let a = 10;
    console.log(a);			//10
    {
        let b = 20;
    	console.log(b);		//20
    }
}

​ ES5严格模式下,函数不能再块级中声明,ES6明确规定可以在块级作用域中声明函数。但在块级作用域以外不能调用。(浏览器可以忽略此规则,但尽量避免在块级作用域内声明函数

1.2 不存在变量提升

​ 变量提升即在定义变量之前使用变量会显示var为undefined,并不会报错;而let所定义的变量没有变量提升的问题

console.log(a);		//undefined
var a = 10;
console.log(b);		//[引用错误] ReferenceError: a is not defined
let b = 20;

1.3 暂时性死区

​ ES6明确规定,若区块内存在let或const命令,则此区块对这些命声明命的变量从一开始就形成封闭作用域。

代码块内,变量在let命令声明之前不可用,只能在声明之后才能使用,此区域被称为“暂时性死区”。

{
    var a = 10;
    if(true){
        concole.log(a);		//[引用错误] ReferenceError: Cannot access 'a' before initialization
        let a;
	}
}

2 const关键字

2.1 基本方法

​ 声明一个只读的常量,一旦声明,其值不能改变且必须立即初始化。除此之外,用法与let一致。

​ 当const声明的不是普通类型的值,而是数据的地址(复合对象)的时候。数据的地址不可变,复合对象的成员变量可以更改;若要冻结数据,可以使用freeze。

{
    const obj1 = {
        x:10,
    };
    obj1.y = 20;		//更改成员变量
    obj1.z = 30;
    console.log(obj1.y);	
    const obj2 = Object.freeze({});
    obj2.x = 10;		//常规模式下,该行代码无效,严格模式下会报错
    console.log(obj2.x);//undefined
}

总结:

命令varletconst
变量有效区域全局有效块级作用域内块级作用域内
是否允许重定义变量允许同一作用域内不允许同一作用域内不允许
是否有变量提升
变量声明之前是否可用可用不可用(暂时性死区)不可用(暂时性死区)
声明只读变量(常量)且必须立即初始化
声明复合对象时,数据地址不可修改,对象成员变量可以修改
使用freeze冻结数据

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐