JS中let、var、const的区别

JS中let、var、const的区别

先看let和var:

console.log(a); // undefined
var a = 3;

console.log(a); // Uncaught ReferenceError: Cannot access 'a' before initialization
let a = 3;

在当前代码执行之前,首先会把所有带var关键字的进行声明(带function关键字的也会提前声明并且定义),即所谓的变量提升,let则不存在这种情况。
ps:项目中创建函数,一般都是基于函数表达式来实现,这样防止其提前变量提升,如:

let fn = function () {};
var x = 3;
console.log(window.x); // 3

let y = 3;
console.log(window.y); // undefined

用var进行全局变量声明的时候,也会给全局对象(浏览器中即window)增加一个对应的属性;但是用let声明的变量不存在这个特点。
仅限于全局变量创建时有这个特点,属于私有的执行上下文中创建的私有变量没有这个特点。

function fn() {
    var x = 1;
    y = 2;
    console.log(fn.x); // undefined
    console.log(fn.y); // undefined
}
fn();
console.log(window.x); // undefined
console.log(window.y); // 2
var y = 21;
var y = 24;
console.log(y); // 24

console.log('OK'); // Uncaught SyntaxError: Identifier 'x' has already been declared
let x = 21;
console.log(x);
let x = 24;
console.log(x);

可以看到,用var声明同一个变量多次,前边声明的会被覆盖以最后一次赋值为准,而用let声明同一个变量多次时,并不是在let声明同一变量第二次时报错,浏览器显示在代码第一行就有报错。
因为一段代码在浏览器执行时,大体需要经过编译阶段和代码解析阶段,用var的可以重复声明,是因为在编译阶段中的词法解析阶段可以审核过,执行阶段遇到已经声明过的,不会再重新声明;但是用let的不可以,是因为在词法解析阶段都过不去,所以也就不存在引擎去执行代码的阶段了。

if (1 === 1) {
let x = 3;
console.log(x);
}
console.log(x); // Uncaught ReferenceError: x is not defined

let a = 1;
switch (a) {
    case 1:
        let x = 2;
        break;
}
console.log(x); // Uncaught ReferenceError: x is not defined
try {
    let x = 100;
    console.log(x); // 100
    console.log(a);
} catch (e) {
    let y = 200;
    console.log(y); // 200
}
console.log(x);// Uncaught ReferenceError: x is not defined
try {
    let x = 100;
    console.log(x); // 100
    console.log(a);
} catch (e) {
    let y = 200;
    console.log(y); // 200
}
console.log(y); // Uncaught ReferenceError: y is not defined

从上可以看出,let存在块级作用域,var则没有。

再看let(var)和const

let x = 10;
x = 20;
console.log(x); // 20

const y = 10;
y = 20; // Uncaught TypeError: Assignment to constant variable.
console.log(y);

const obj = {a: 10};
obj.b = 20;
console.log(obj);  // {a: 10, b: 20}

let创建的变量是可以更改指针指向的,也就是可以重新赋值的,但是const声明的变量是不允许改变指针指向的。
ps:之前有人说const创建的是常量,常量即不可更改,但从代码示例可以看出,const声明的基本类型值确实不允许改变,但若声明的是存储对象的地址指针,还是可以操作该对象的,像数字100这种才是真正的常量。

### 回答1: jsletvarconst都是用来声明变量的关键字,它们的区别如下: 1. var:在ES5var是声明变量的关键字,它的作用域是函数级别的,即在函数内部声明的变量只在函数内部有效,而在函数外部声明的变量则在全局范围内有效。在ES6var仍然可以使用,但是推荐使用letconst。 2. let:在ES6let是声明块级作用域变量的关键字,它的作用域是块级别的,即在块内部声明的变量只在块内部有效。let声明的变量可以被重新赋值,但是不能被重复声明。 3. const:在ES6const是声明常量的关键字,它的作用域也是块级别的,与let相同。const声明的变量不能被重新赋值,也不能被重复声明。常量一旦被赋值,就不能再次修改。 总之,letconst是ES6新增的关键字,它们的作用域是块级别的,比var更加安全和灵活。而const声明的变量是常量,一旦被赋值就不能再次修改。 ### 回答2: JavaScript 是一种动态类型的编程语言,拥有多种变量声明方式,其包括 letvarconst。下面将对它们各自的特点进行比较。 var 在 ES6 之前,var 是 JavaScript 最常用的变量声明方式之一。var 在声明时没有必要显式表明变量类型,在函数内部声明的变量的作用域范围会自动提升至函数顶部,并在函数外部声明的变量,在全局作用域范围内,都会被认为是 window 对象的属性。 然而,var 存在一些问题:它的作用域是函数级别的。这就意味着,在函数内部声明的变量,在函数体内都可访问,但在函数体外却无法访问。同时,如果重复声明同一个变量名,后续声明会覆盖前面的声明。这可能会导致意外的行为。 let ES6 引入了 let 声明变量的方式,这使得变量的作用域在声明的块级范围内。这意味着,let 声明的变量在声明它的块级作用域范围内可见,但在块级作用域之外不可见。与 var 类似,let 声明的变量是可变的,可以在被声明之后被重新赋值。 let 关键字在 for 循环的使用也是常见的,因为它可以很容易解决传统的 JavaScript 闭包的问题。在 for 循环let 声明的变量在每次循环都有新的实例,因此它不会受到循环外任何其他代码的影响。 const const 关键字声明的变量通常被称为常量,常量是一种不能被重新赋值的变量类型。与 let 类似,const 下,变量作用域同样在声明它的块级作用域。 因此,使用 const 关键字声明的变量只能赋值一次,而且这个值在后续代码也不能改变。但是,如果一个 const 变量是对象类型,那么它里面的属性可以更改。这是因为 const 变量只是防止变量被重新分配,而不阻止变量内部状态的更改。 总的来说,letconst 相比起 var,更加安全和稳定。使用 letconst 可以让代码更清晰和易于理解,也可以避免出现不可预料的问题。在实际的开发环境,开发人员可以根据实际需求选择使用何种变量类型。 ### 回答3: JavaScript有四种声明变量的方式:letvarconst和class。其letvarconst是ES6(ECMAScript 2015)引入的新特性,在ES6之前只有var一种变量声明方式。下面来详细介绍这三种声明方式的区别。 1. var声明 var是ES6之前用来声明变量的方式。使用var声明的变量是全局或函数作用域,可以在其声明范围内随意访问。 var a = 'global variable'; function func() { var b = 'local variable'; } console.log(a); // 'global variable' console.log(b); // ReferenceError: b is not defined 2. let声明 let是ES6引入的新的块级作用域声明变量的方式,在声明变量的代码块内生效。 let a = 'global variable'; if (true) { let a = 'local variable'; console.log(a); // 'local variable' } console.log(a); // 'global variable' 在if语句块使用let声明了变量a,因此在if语句块可以访问到该变量,而在if语句块外部,变量a指向的是全局变量。 3. const声明 const也是ES6引入的一个新的声明变量的方式,与let一样,const声明的变量也有块级作用域。 const a = 'constant variable'; a = 'new value'; // TypeError: Assignment to constant variable. const声明的变量值不能被修改,因此在上面的代码尝试修改变量a的值会抛出一个TypeError错误。 总结: var声明的变量是全局或函数作用域,在声明范围内随意访问。 letconst声明的变量都是块级作用域,在声明变量的代码块内生效。let声明的变量可以赋值,而const声明的变量值不可修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值