js----var const let的区别

本文探讨了JavaScript中var、const和let声明变量的区别。var存在变量提升,let和const则没有,它们有块级作用域。const声明的常量必须在声明时赋值且其值不可变,但若为引用类型,对象的属性仍可修改。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先出现的次序是不一样的,var是ES5提出的,而const和var是ES6提出的。


var 和 let声明的都是变量,声明完之后,可以对变量进行更改,也可以声明的时候不赋值。

const声明的是常量,声明的时候必须赋值,否则会报错。且只能赋值一次,不能更改。

var a;  //var先声明不赋值
let b;  //let先声明不赋值
const c;  //const先声明不赋值,报错

那既然var和let都可以先声明后赋值,这两个之间又有什么区别呢?

var a = 6; 
var a = 7;  //正确,var允许重复声明变量,且后一个变量覆盖前一个变量


let b = 9;
    b = 10; //而let声明一次,能在后续进行赋值,但是不能重复声明

如果前面对var有过一定了解,可以知道,var有变量提升。

console.log(a); //输出underfind
var a = 10;   //变量声明提升了,但是没有赋值



//上面这个语句等同于以下顺序
var a;
console.log(a);  //underfind
a = 10;

而let和const是没有变量提升的,所以如果上面例子中的var改成let或者const ,都会报错。

console.log(a); //报错
let a = 10;


console.log(b);  //报错
const b = 10;

let 暂时性死区

只要块级作用域内存在let命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。

var a = 10;

//块级作用域
{
console.log(a);//报错
let a = 9;
}

而且var不存在块级作用域  let和const存在块级作用域

// {}里面的为块级作用域

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

最后一点值得一提的是,我们说const不能修改值,

如果const定义的是基本数据类型,则基本数据类型的值不能被修改。

如果定义的是引用类型,则const定义的变量指向的指针地址值不能被修改,但是指向的对象属性值可以被修改。

举个栗子~

const a = 10 ;
 a = 20; //报错。这里的const定义的是基本数据类型,不能修改


const b = {
    age:18;
}
b.age = 20; //这里修改是可以的,因为修改的是属性值

b = {
 num:20;  //报错,这里是不能被修改的,因为b的指向的地址值不能修改
}

<think>嗯,用户想了解JavaScriptvarletconst区别。我之前学过一点JavaScript,但可能记太清楚,得仔细想想。首,我记得这三个都是用来声明变量的,但具体区别是什么? 首varES5就有的,而letconstES6新增的。那作用域方面,var应该是函数作用域,而letconst是块级作用域。比如在函数内部用var声明的话,变量在整个函数里都有效,但如果在if块或者for循环里用let,就只在那个块里有效。对吗? 然后是变量提升的问题。var声明的变量会被提升到作用域的顶部,也就是说在声明之前访问会得到undefined,而letconst会提升,如果在声明前访问会报错,也就是暂时性死区。这点需要注意。 接下来是重复声明var允许重复声明同一个变量,后面的会覆盖前面的,而letconst允许在相同作用域内重复声明,否则会报错。比如用var声明两次a变量没问题,但用let的话就会报错。 关于赋值const声明的是常量,一旦赋值能重新赋值。但是如果const声明的是对象,对象的属性是可以修改的,只是能重新指向另一个对象。这点容易混淆,比如const obj = {},然后obj.name = 'test'是可以的,但obj = {}就会报错。 然后要参考用户给的引用内容,看看有没有补充。引用[1]提到var有全局和函数作用域,而letconst有块级作用域。引用[2]说建议用letconst避免变量提升问题,引用[4]提到声明const>let>var,应该优使用const,然后是let,最后是var。 可能用户在实际编码中遇到变量作用域的问题,或者变量被意外覆盖的情况。比如在循环中使用var可能导致意外的结果,而用let可以解决这个问题。例如for循环中用var的话,循环结束后变量i的值会是循环结束后的值,而用let的话每次迭代都是新的绑定。 需要把这些点整理清楚,分点说明,可能还要举例说明。比如作用域的区别,变量提升的表现,重复声明的错误,以及const的使用注意事项。然后生成相关问题,帮助用户深入理解。</think>### JavaScriptvarletconst区别对比 #### 1. **作用域范围** - **var**:具有**函数作用域**或**全局作用域**,在非函数代码块(如`if`、`for`)中声明的变量会泄漏到外部作用域[^1][^4]。 ```javascript function example() { if (true) { var a = 10; } console.log(a); // 输出10(变量泄漏到函数作用域) } ``` - **let/const**:具有**块级作用域**,仅在当前代码块(如`{}`)内有效[^4]。 ```javascript if (true) { let b = 20; const c = 30; } console.log(b); // 报错:b未定义 console.log(c); // 报错:c未定义 ``` #### 2. **变量提升** - **var**:存在**变量提升**,声明会被提升到作用域顶部,但赋值会。未赋值前值为`undefined`[^2]。 ```javascript console.log(d); // 输出undefined var d = 5; ``` - **let/const**:**存在变量提升**,声明前访问会触发**暂存性死区**(Temporal Dead Zone)导致报错。 ```javascript console.log(e); // 报错:Cannot access 'e' before initialization let e = 6; ``` #### 3. **重复声明** - **var**:允许**重复声明同名变量**,后声明的覆盖前者[^3]。 ```javascript var f = 1; var f = 2; // 合法 ``` - **let/const**:**禁止重复声明**,否则会报错。 ```javascript let g = 1; let g = 2; // 报错:Identifier 'g' has already been declared ``` #### 4. **赋值限制** - **var/let**:声明后可**重新赋值**。 ```javascript let h = 10; h = 20; // 合法 ``` - **const**:声明时必须初始化,且**禁止重新赋值**(基本类型)。但对象或数组内部属性可修改。 ```javascript const i = { name: "Tom" }; i.name = "Jerry"; // 合法 i = {}; // 报错:Assignment to constant variable ``` #### 5. **使用优级建议** -用`const`声明常量,其次用`let`声明变量,避免使用`var`以减少意外错误。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值