前语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

js 面试难点: let const var 的差异;
简略来说便是在堆内存里分配两个空间,分别存储 {a: 1, b: 2}{name: '张三', age: 18},obj1obj2分别指向他们,而咱们仅仅改变了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的变量提高,它是指在使用constlet的时候,如果在他们声明之前调用(比方打印)则会报错。

直接界说

这种界说方法很少见,但我们多多少少应该也见过,便是不带varletconst,直接就界说,无论是否在函数里边界说他都是直接绑定在 window目标上,能够理解为它的效果域是整个 window窗口,案例如下:

function testFunc() {
    c=1;
}
testFunc()
console.log(window.c) // 1

总结:

声明方法 效果域 是否存在变量提高 是否有必要初始化 是否能够重界说 是否能够重新赋值
let 块级效果域
const 块级效果域
var 函数效果域
直接声明 window窗口

以上便是js特点声明方法的悉数相关内容,期望对你进一步了解js有所帮助,若有遗漏的地方,欢迎指正!