前语:
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
有所帮助,若有遗漏的地方,欢迎指正!