JS中const、let、var之间的区别

博客介绍了ES6新特性中,let/const与var的主要不同。let/const使用区块作用域,var使用函数作用域。还阐述了const声明赋值、修改、重复定义的规则,var定义变量的特点,let的块级作用域特性,以及let/const存在的暂时性死区问题。

在ES6的新特性中,最容易看到TDZ作用就是在let/const的使用上,let/const与var的主要不同有两个地方:

let/const是使用区块作用域;var是使用函数作用域

const

当声明时不赋值报错

const a;

当试图改变const常量时报错

const a=1;
a=2;

在同一作用域中重复定义报错

const a=1;
const a=2;

不会被声明提前(与var有区别)

console.log(a)
const a=2;

var

var定义的变量可以修改,如果不初始化会输出undefined,不会报错

var a
console.log(a) // undefined
var a = 1;
// var a;//不会报错
console.log('函数外var定义a:' + a);//可以输出a=1
function change(){  
    a = 4;
    console.log('函数内var定义a:' + a);//可以输出a=4
}
change();
console.log('函数调用后var定义a为函数内部修改值:' + a);//可以输出a=4

let

let是块级作用域,函数内部使用let定义后,对函数外部无影响
let 声明的变量只在 let 命令所在的代码块 {} 内有效,在 {} 之外不能访问。
在let/const声明之前就访问对应的变量与常量,会抛出ReferenceError错误

funcon console.log(a) // ReferenceError: a is not defined
let a
let c = 3;
console.log('函数外let定义c:' + c);//输出c=3
function change(){   
    let c = 6;
    console.log('函数内let定义c:' + c);//输出c=6
}
change();
console.log('函数调用后let定义c不受函数内部定义影响:' + c);//输出c=3

暂时性死区

let 块级作用域内let又声明了一个局部变量tmp,导致后者绑定这个块级作用域,所以在let声明变量前,对tmp赋值会报错

var tmp = 123;
if (true) {
  tmp = 'abc'; // ReferenceError
  let tmp;
}
在 JavaScript 中,`const`、`let` `var` 是用于声明变量的关键字,它们在作用域、提升、可变性等方面存在明显区别: - **作用域**: - `var` 具有函数作用域。在函数内部使用 `var` 声明的变量,在整个函数内都可以访问,在函数外部则无法访问。如果在函数外部使用 `var` 声明变量,则该变量具有全局作用域。例如: ```javascript function example() { var x = 10; console.log(x); // 输出 10 } example(); console.log(x); // 报错,x 未定义 ``` - `let` `const` 具有块级作用域。块级作用域由花括号 `{}` 界定,如 `if` 语句、`for` 循环等。在块级作用域内使用 `let` 或 `const` 声明的变量,只能在该块内访问。例如: ```javascript if (true) { let y = 20; const z = 30; console.log(y); // 输出 20 console.log(z); // 输出 30 } console.log(y); // 报错,y 未定义 console.log(z); // 报错,z 未定义 ``` - **变量提升**: - `var` 存在变量提升。变量提升是指在 JavaScript 中,使用 `var` 声明的变量会被提升到当前作用域的顶部,可以在声明之前访问,但此时变量的值为 `undefined`。例如: ```javascript console.log(a); // 输出 undefined var a = 10; ``` - `let` `const` 不存在变量提升。使用 `let` 或 `const` 声明的变量必须先声明后使用,否则会报错,这被称为暂时性死区(TDZ)。例如: ```javascript console.log(b); // 报错,Cannot access 'b' before initialization let b = 20; ``` - **可变性**: - `var` `let` 声明的变量可以重新赋值。例如: ```javascript var num1 = 1; num1 = 2; console.log(num1); // 输出 2 let num2 = 3; num2 = 4; console.log(num2); // 输出 4 ``` - `const` 声明的常量必须在声明时进行初始化,并且一旦初始化后,其引用地址不能被修改。如果 `const` 声明的是对象或数组,可以修改对象的属性或数组的元素,但不能重新赋值为新的对象或数组。例如: ```javascript const PI = 3.14; // PI = 3.1415; // 报错,Assignment to constant variable const obj = { name: 'John' }; obj.name = 'Jane'; console.log(obj.name); // 输出 'Jane' ``` ### 使用建议 - **优先使用 `const`**:声明常量或不需要重新赋值的变量,避免意外修改[^4]。 - **其次使用 `let`**:需要重新赋值的场景(如循环计数器)[^4]。 - **避免使用 `var`**:易导致作用域污染变量提升问题[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值