var、let和const声明变量的区别

一、var 的使用

1.1、var 声明变量的作用域

var可以在全局范围声明或者函数范围内声明

1、当在最外层函数的外部用var声明,作用域是全局的。
这意味着在最外层函数的外部用var声明的任何变量都可以在windows中使用。

2、当在函数中声明var时,作用域是局部的。
这意味着它只能在函数内访问

示例

var greeter = 'hey hi'; //都可以在windows中

function newFunction() {
    var hello = 'hello'; //只能在函数内访问
}

这里,greeter是全局范围的,因为它存在于函数外部
而hello是函数范围的。因此,我们无法在函数外部访问变量hello。

1.2、var 变量可以重新声明和修改

这意味着我们可以在相同的作用域内执行下面的操作,并且不会出错

var greeter = 'hey hi';
var greeter = 'say Hello instead';

又比如

var greeter = 'hey hi';
greeter = 'say Hello instead';

1.3、var 的变量提升

变量提升是 JavaScript 的一种机制:在执行代码之前,变量和函数声明会移至其作用域的顶部。这意味着如果我们这样做:

console.log(greeter); // greeter is undefined
var greeter = 'say hello';

变量提升后--代码会被解释为

var greeter;
console.log(greeter); // greeter is undefined
greeter = 'say hello';

因此,将var声明的变量会被提升到其作用域的顶部,并使用 undefined 值对其进行初始化

二、let 的使用

2.1、let 是块级作用域

块是由{}界定的代码块,大括号中有一个块。大括号内的任何内容都包含在一个块级作用域中,因此,在带有let的块中声明的变量仅可在该块中使用。让我用一个例子解释一下:

if (times > 3) {
    let hello = 'say Hello instead';
    console.log(hello); // "say Hello instead"
}
console.log(hello); // hello is not defined

我们看到在其代码块(定义它的花括号)之外使用hello会返回错误。这是因为let变量是块范围的

2.2、let 可以被修改但是不能被重新声明

就像var一样,用 let声明的变量可以在其范围内被修改。但与var不同的是,let变量无法在其作用域内被重新声明。 来看下面的例子:

let greeting = 'say Hi';
let greeting = 'say Hello instead'; // error: Identifier 'greeting' has already been declared

但是,如果在不同的作用域中定义了相同的变量,则不会有错误:

let greeting = 'say Hi';
if (true) {
    let greeting = 'say Hello instead';
    console.log(greeting); // "say Hello instead"
}
console.log(greeting); // "say Hi"

这个事实说明:使用let,是比var更好的选择。当使用let时,你不必费心思考变量的名称,因为变量仅在其块级作用域内存在。

同样,由于在一个块级作用域内不能多次声明一个变量,因此不会发生前面讨论的var出现的问题。

2.3、let 的变量提升

就像var一样,let声明也被提升到作用域顶部。

但不同的是:

1、用var声明的变量会被提升到其作用域的顶部,并使用 undefined 值对其进行初始化。

2、用let声明的变量会被提升到其作用域的顶部,不会对值进行初始化。
因此,如果你尝试在声明前使用let变量,则会收到Reference Error。

image.png

三、const 的使用

3.1、const 声明的变量在块级作用域内

像let声明一样,const声明只能在声明它们的块级作用域中访问。

3.2、const 不能被修改并且不能被重新声明

这意味着用const声明的变量的值保持不变。不能修改或重新声明。因此,如果我们使用const声明变量,那么我们将无法做到这一点:

const greeting = 'say Hi';
greeting = 'say Hello instead'; // error: Assignment to constant variable.

或者这个这样:

const greeting = 'say Hi';
const greeting = 'say Hello instead'; // error: Identifier 'greeting' has already been declared

因此,每个const声明都必须在声明时进行初始化。

当用const声明对象时,这种行为却有所不同。虽然不能更新const对象,但是可以更新该对象的属性。 因此,如果我们声明一个const对象为

const greeting = {
    message: 'say Hi',
    times: 4,
};

同样不能像下面这样做:

const greeting = {
    words: 'Hello',
    number: 'five',
}; // error:  Assignment to constant variable.

但我们可以这样做:

greeting.message = 'say Hello instead';

这将更新greeting.message的值,而不会返回错误。

3.3、const 的变量提升

就像let一样,const声明也被提升到顶部,但是没有初始化。

四、var、let、const 区别总结

1、var声明是全局作用域或函数作用域,而let和const是块作用域。

2、var变量可以重新赋值和重新声明;
let变量可以重新赋值但不能重新声明;
const变量既重新赋值也不能重新声明。

3、它们都被提升到其作用域的顶端
但是,虽然使用变量undefined初始化了var变量,但未初始化let和const变量
因此let const 如果先使用后声明会报错。

4、var和let声明可以不初始化,const在声明期间必须初始化

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,270评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,489评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,630评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,906评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,928评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,718评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,442评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,345评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,802评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,984评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,117评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,810评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,462评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,011评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,139评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,377评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,060评论 2 355

推荐阅读更多精彩内容