js 面试难点: let const var 的区别;
前言:
js
的属性声明形式有四种,分别是let、const、var
以及直接声明
,在面试过程中,他们的区别也经常被问到的。很多人都是可以说个大概的,但是有些模糊的概念可能不太了解,本文将尽量用简单的方式来讲解这些知识点,希望对你有所帮助。
四种声明方式及其区别
let
let 是我们目前最常用的一种声明方式,也就是变量,它的作用域是块级作用域,也就是仅作用于其所处的大括号内。let并不强制要求变量初始化。
const
const
简称为常量,它的作用域也是块级作用域,要求必须初始化,否则就会报错。如果是原始数据类型(数字、字符串等)是不能修改的,如果是引用数据类型(数组、对象)可以修改其内部属性。我个人理解是它的指针指向是锁死的,不能对其进行修改。到这可能有些没有学过c语言
的同学有点懵,所以简单说一下js
里面指针的概念,想进一步了解的同学可以后续关注一下这方面的知识,这里就不多赘述。举个例子:
// 这段代码只是改变了obj1的指向,并不是将它原来的对象替换为 obj2 所指向的对象,
//{a: 1, b: 2} 仍然存在,只是obj1的指针并不指向他了
let obj1 = {a: 1, b: 2}
let obj2 = {name: '张三', age: 18}
console.log(obj1)
obj1 = obj2
简单来说就是在堆内存里分配两个空间,分别存储
{a: 1, b: 2}
和{name: '张三', age: 18}
,obj1
和obj2
分别指向他们,而我们只是改变了obj1
的指向,{a: 1, b: 2}
仍然存储在堆内存里。当然,后续垃圾回收机制会对他们进行一个回收.
var
var
是在ES6
之前最常用的变量声明方式,它的作用域是函数作用域,如果是全局定义则直接绑定在window
对象上,可以对他进行重定义,同时也有一个特性是会触发变量提升。话不多说,直接上代码:
// 定义在 window 对象上
var b = 1;
console.log(window.b) // 1
function test() {
// 变量提升,所以并不会报错
console.log(a);// undefined
var a = 1;
// 重定义
var a = 2;
if (true) {
// 函数作用域,这里的重定义仍然作数
var a = 3;
}
console.log(a); // 3
}
test();// undefined 3
什么是变量提升?
如上代码所示,它其实就是将
var
所定义的变量的变量声明提到函数的第一行,在所有代码的最前面执行,其他不变,比如上面的代码正确的执行顺序其实是:var a; console.log(a);
同时我们也要注意一点,在js
中函数也是一种数据类型,所以它也存在变量提升。变量提升的优先级是var Function>var 其他
,这里也引申出一个新的概念叫暂时性死区,虽然没什么大用但有些钻牛角尖的面试哥可能会问,因此也说一下暂时性死区:相对于
var
的变量提升,它是指在使用const
、let
的时候,如果在他们声明之前调用(比如打印)则会报错。
直接定义
这种定义方式很少见,但大家多多少少应该也见过,就是不带var
、let
、const
,直接就定义,无论是否在函数里面定义他都是直接绑定在 window
对象上,可以理解为它的作用域是整个 window
窗口,案例如下:
function testFunc() {
c=1;
}
testFunc()
console.log(window.c) // 1
总结:
声明方式 | 作用域 | 是否存在变量提升 | 是否必须初始化 | 是否可以重定义 | 是否可以重新赋值 |
---|---|---|---|---|---|
let | 块级作用域 | 否 | 否 | 否 | 是 |
const | 块级作用域 | 否 | 是 | 否 | 否 |
var | 函数作用域 | 是 | 否 | 是 | 是 |
直接声明 | window窗口 | 否 | 否 | 是 | 是 |
以上就是js
属性声明方式的全部相关内容,希望对你进一步了解js
有所帮助,若有疏漏的地方,欢迎指正!
转载自:https://juejin.cn/post/7302261593316016147