Js中的var、let、const有什么区别?

简介: Js中的var、let、const有什么区别?

网络异常,图片无法展示
|



1、前言


在前面的学习中,我们用到过var、let、const去定义变量,那么它们定义的变量之间到底有什么区别呢?今天我们就一起来看看。


2、快速开始


2.1、关于作用域


首先,var定义的变量是没有作用域的;但let和const定义的变量只能在当前块中使用。


{var a=1,b=2} // 块,块中var定义的变量可以在其他块和块外使用
function adds(a,b){
    return a+b
}
console.log(adds(a,b))
// 输出:3
复制代码


{let a=1,b=2} // 块,块中let定义的变量只能在当前块中使用
function adds(arg1,arg2){
    return arg1+arg2
}
console.log(adds(a,b))
// 输出:ReferenceError: a is not defined
复制代码


{const a=1,b=2} // 块,块中const定义的变量只能在当前块中使用
function adds(arg1,arg2){
    return arg1+arg2
}
console.log(adds(a,b))
// 输出:ReferenceError: a is not defined
复制代码


2.2、关于是否可以重复声明的


var声明的变量是可以重复声明的,新的值会覆盖掉旧的值。但是let和const声明的变量是不能重复声明的。


var a=0,b=1
var a=1
console.log(a+b)
// 输出:2
复制代码


let a=0,b=1
let a=1
console.log(a+b)
// 输出:SyntaxError: Identifier 'a' has already been declared
复制代码


const a=0,b=1
const a=1
console.log(a+b)
// 输出:SyntaxError: Identifier 'a' has already been declared
复制代码


2.3、是否可以变量提升


var声明的变量是可以变量提升的,但是let和const声明的变量是不能变量提升的。


变量提升就是先用变量后声明变量,变量提升的原理就是:Js在运行前会先将var和function的对象提前进行声明和定义,所以就算声明在后也不影响代码的自上而下执行。


var b=2
a=2
console.log(a+b)
var a
// 输出:4
复制代码


3、var的缺点


从上面的对我们有种错觉,var比let和const更好?并不是,你会发现实际开发中,let和const的使用频率比var高,这是为什么呢?因为var存在一些缺点,我们一起来看看。


3.1、没有作用域


这个特点在某个角度来看是优点,但也是缺点。现代化的编程思想中对变量的作用域要求比较严格,一般都是遵循小范围原则。所以var声明的变量没有作用域是其较大的缺点。


3.2、自动添加为window属性


var声明的变量会自动添加为window的属性,这在开发者看来属于对window属性的侵入,是不被提倡的,所以这也是var的缺点。


> window.Cache
< ƒ Cache() { [native code] }
> var Cache='phyger';
< undefined
> window.Cache
< 'phyger'
复制代码


如上,使用var定义的变量修改了window的Cache属性,将原本的Cache方法替换成了一个字符串,这是很不好的。


3.3、提前装载


因为var定义的变量会在代码运行前提前装载,这就导致块中的同名变量会覆盖掉var定义的全局变量,这也是非常糟糕的。


var name = '大马猴';
console.log(name);
function sayhi() {
    console.log('hi-1', name) // name在这个块中生效,所以此时name还未定义
    let name = 'phyger'; // let定义的变量在代码执行到这里的时候才会装载,而且let定义的name会覆盖var定义的name
    console.log('hi-2', name)
};
sayhi()
console.log(name);
复制代码


输出:


大马猴
console.log('hi-1', name)
                    ^
ReferenceError: Cannot access 'name' before initialization
复制代码


3.4、重复定义


var可以重复定义变量,这就导致了数据的冗余和代码不可读性提升。

相关文章
|
1天前
|
存储 JavaScript 索引
js开发:请解释什么是ES6的Map和Set,以及它们与普通对象和数组的区别。
ES6引入了Map和Set数据结构。Map的键可以是任意类型且有序,与对象的字符串或符号键不同;Set存储唯一值,无重复。两者皆可迭代,支持for...of循环。Map有get、set、has、delete等方法,Set有add、delete、has方法。示例展示了Map和Set的基本操作。
11 3
|
2天前
|
JavaScript 前端开发
js开发:请解释同步和异步编程的区别。
同步编程按顺序执行,易阻塞;异步编程不阻塞,提高效率。同步适合简单操作,异步适合并发场景。示例展示了JavaScript中同步和异步函数的使用。
12 0
|
6天前
|
算法
Swiper库和Glide.js库的性能有何区别
Swiper和Glide.js是两个流行的响应式轮播图库。Swiper功能强大且灵活,支持多方向滑动,拥有丰富的配置和切换效果,适合复杂需求,其高性能得益于优化的算法和惰性加载。Glide.js则轻量级、快速,专注于基础功能,适合简洁需求。两者各有侧重,选择应基于项目具体需求和性能考虑。
|
10天前
|
存储 JavaScript 前端开发
JavaScript DOM 操作:解释一下 cookie、sessionStorage 和 localStorage 的区别。
Cookie是服务器发送至客户端的文本信息,会随每个请求发送回服务器,适合控制会话状态但可能暴露隐私。SessionStorage仅在当前会话中存储数据,关闭浏览器后清除,适合临时存储如登录状态。LocalStorage则持久保存数据,即使关闭浏览器也不会清除,适用于存储长期设置。三种方式各有侧重,应按需求选择。
15 0
|
13天前
|
JavaScript 前端开发
JQuery和JS的区别有哪些?
JQuery和JS的区别有哪些?
12 0
|
13天前
|
JavaScript 前端开发
js中浅拷贝和深拷贝的区别
js中浅拷贝和深拷贝的区别
19 1
|
16天前
|
JavaScript 前端开发 算法
JavaScript 中前置自增与后置自增:区别、应用场景
【4月更文挑战第6天】JavaScript中的前置自增`++a`先增后用,返回新值,适合复合赋值和循环计数;后置自增`a++`先用后增,返回原值,适用于保留变量原值的操作。二者差异在于运算时机和返回值,选择时要考虑递增时机和表达式中使用的值。在复杂表达式中应避免混用,注重代码清晰度和一致性。理解这些差异能提高代码效率,避免逻辑错误。
18 1
|
2月前
|
JavaScript
Node.js【GET/POST请求、http模块、路由、创建客户端、作为中间层、文件系统模块】(二)-全面详解(学习总结---从入门到深化)
Node.js【GET/POST请求、http模块、路由、创建客户端、作为中间层、文件系统模块】(二)-全面详解(学习总结---从入门到深化)
27 0
|
2月前
|
消息中间件 Web App开发 JavaScript
Node.js【简介、安装、运行 Node.js 脚本、事件循环、ES6 作业队列、Buffer(缓冲区)、Stream(流)】(一)-全面详解(学习总结---从入门到深化)
Node.js【简介、安装、运行 Node.js 脚本、事件循环、ES6 作业队列、Buffer(缓冲区)、Stream(流)】(一)-全面详解(学习总结---从入门到深化)
77 0
|
2天前
|
JavaScript 前端开发 测试技术
学习JavaScript
【4月更文挑战第23天】学习JavaScript
10 1