var、let、const的区别以及用法

以写博客的形式记录学习JavaScript高级程序设计的过程,也就是自己的笔记,以及理解。若有错请及时纠正我!

var关键字:

定义变量可以使用var,后面跟变量名,如var a = 1;这样就是将1赋值给a;当然a可以保存任何类型的值。我们还可以改变a保存的值,也可以改变值的类型,如var a=1;==> a ='hello';

var的作用域

在使用var定义一个变量的时候,它会成为包含它的函数的局部变量,

如:

function txt(){
    var a = 1;//局部变量
}
txt();
console.log(a)//会报错

若想将var定义的变量成为全局变量,则可以这样:

function txt(){
    a =1;//全局变量
}
txt();
console.log(a)//1

在去掉var关键字之和,a就成为了全局变量,只要调用了txt()这个函数,就会定义这个变量,并且会在外部访问到。

(注:虽然可以通过省略var来实现定义全局变量,但不推荐这么做,因为这在维护起来会很难维护,容易看代码的时候看迷。而且在严格模式下,这样省略就会造成给为声明的变量赋值,就会报错。)

如果你觉得你定义多个变量的时候就要写多次var,其实你可以这样:

var a=1,b=2,c=3;

这样你就一次性定义了三个变量。

var声明提升

function foo() { 
 console.log(age); 
 var age = 26; 
} 
foo(); // undefined

这样写是不会报错的,因为在使用这个关键字声明的变量会自动提升到函数作用域的顶部,也就是这样:

function foo() { 
 var age; 
 console.log(age); 
 age = 18; 
} 
foo(); // undefined

这个变量提升也就可以实现多次使用var声明同一个变量也没啥问题,通常可以说最后声明的变量将前面的变量覆盖掉了,如:

function foo() { 
 var age = 16; 
 var age = 9; 
 var age = 18; 
 console.log(age); 
} 
foo(); // 18

let关键字 

let和var的作用是差不多的,都是用来声明变量的,最大的区别就是,let声明的范围是块级作用域,而var是函数作用域。

(注:块级作用域:即在 {}花括号内的域,由 { }包括,比如if {}块、for () {}块。 函数作用域:变量在声明它们的函数体以及这个函数体嵌套的任意函数体都是有定义的。)

如:

if (true) { 
 var name = '伍叁'; 
 console.log(name); // 伍叁 
} 
console.log(name); // 伍叁
if (true) { 
 let age = 21; 
 console.log(age); // 21
} 
console.log(age); // Error: age 没有定义

这里的age在if块外了,所以不能被引用。

var可以声明一个变量多次,而let就不行了,let是不允许在同一个块级作用域中出现冗余声明的哈。如:

var name; 
var name; 

let age; 
let age; // Error;标识符 age 已经声明过了

但是JavaScript引擎会记录用于变量声明的标识符及其所在的块级作用域,所以嵌套使用相同的标识符不会报错,这是因为在块级作用域中没有重复声明。如:

var name ='伍叁';
consloe.log(name); //伍叁

if(true){
var name='嗨嗐';
console.log(name);//嗨嗐
}
//-----------

let age =18;
consloe.log(age)//18
if(true){
let age = 21;
consloe.log(age)//21
}

对申明冗余报错不会因为混用let和var而受影响,这两个声明的并不是不同的变量,它们只是指出变量在作用域中是如何存在的。如:

 let name = "111"
    var name = 'aaa'
    console.log(name)

暂时性死区 

上面说了var会有变量提升,而let却没有。如:

// name 会被提升
console.log(name); // undefined 
var name = '伍叁'; 

//------------------
// age 不会被提升
console.log(age); // ReferenceError:age 没有定义
let age = 18;

这就说明了,在log的时候,age还没有声明,这就会出现暂时性死区。

全局变量 

在使用var这个关键字的时候,它会成为window对象的属性,而let则不会。如:

var name = '伍叁'; 
console.log(window.name); // '伍叁' 

//------------
let age = 18; 
console.log(window.age); // undefined

虽然let也是在全局声明的,但是为了避免出现error,所以要确保整个页面不能重复声明同一个变量。(注:要知道函数作用域和块级作用域的区别)

 for循环中的let

在let没有出现之前,for循环定义的迭代变量会渗透出去,也就是渗透到循环体外部。如:

for (var i = 0; i < 5; ++i) { 
 // 循环逻辑 
} 
console.log(i); // 5

在let出现之后这个问题就没了,因为let有块级作用域,如:

for (let i = 0; i < 5; ++i) { 
 console.log(i)// 会输出 0、1、2、3、4
} 
console.log(i); // ReferenceError: i 没有定义

const声明 

const与let基本相同,区别是const是用来定义常量的,尝试修改const声明的变量会导致运行上报错。const也不可以重复声明,const也是块级作用域。如:

//赋值
const name = '伍叁'
name='阿巴阿巴'//error

//重复声明
// const 也不允许重复声明
const name = 'tt'; 
const name = 'Nice'; // Error

//块级作用域
const name = '伍叁'; 
if (true) { 
 const name = '嘿哈'; 
} 
console.log(name); // 伍叁

const变量如果引用的是一个对象,修改这个对象内部的属性则不会报错。

const data = {}; 
data.name = '伍叁'; // 没问题的啦老铁

但const不能像let一样用来声明迭代的变量,如for循环,因为迭代的变量会自增。当然这样对于for...in和for...of这种循环意义就不一样了。如:

for (const key in {a: 1, b: 2}) { 
 console.log(key); 
} 
// a, b 


for (const value of [1,2,3,4,5,6,7,8]) { 
 console.log(value); 
} 
// 1, 2, 3, 4, 5, 6, 7, 8

小结: 

1.不使用var

出现了let和const之后,会发现在定义变量的时候有了明确的作用域、声明位置(当初刚学JavaScript的时候为了搞明白变量提升熬了好久)和不变的值。

2.const优先,let次之

(这个是作者说的跟我伍叁没啥关系,因为我喜欢用let,我暂时没有那么好业务逻辑)

按作者的意思就是使用const声明可以让浏览器知道这个变量是不会被改变,会让代码分析工具知道有哪些不合法的赋值操作(就是减少骚操作)。所以很多开发者认为优先使用const,在要修改的时候,再改为let。

  • 13
    点赞
  • 85
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
### 回答1: js中,letvarconst都是用来声明变量的关键字,它们的区别如下: 1. var:在ES5中,var是声明变量的关键字,它的作用域是函数级别的,即在函数内部声明的变量只在函数内部有效,而在函数外部声明的变量则在全局范围内有效。在ES6中,var仍然可以使用,但是推荐使用letconst。 2. let:在ES6中,let是声明块级作用域变量的关键字,它的作用域是块级别的,即在块内部声明的变量只在块内部有效。let声明的变量可以被重新赋值,但是不能被重复声明。 3. const:在ES6中,const是声明常量的关键字,它的作用域也是块级别的,与let相同。const声明的变量不能被重新赋值,也不能被重复声明。常量一旦被赋值,就不能再次修改。 总之,letconst是ES6中新增的关键字,它们的作用域是块级别的,比var更加安全和灵活。而const声明的变量是常量,一旦被赋值就不能再次修改。 ### 回答2: JavaScript 是一种动态类型的编程语言,拥有多种变量声明方式,其中包括 letvarconst。下面将对它们各自的特点进行比较。 var 在 ES6 之前,varJavaScript 中最常用的变量声明方式之一。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声明的变量值不可修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

J伍叁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值