JS 基础知识点及常考面试题(一)

248 阅读3分钟

本文已参与「掘力星计划」,赢取创作大礼包,挑战创作激励金。

Js 对于每个前端开发都是必备技能, 首先先来熟悉下 Js 的一些常考和容易混乱的基础知识点

原始(Primitive)类型

涉及面试题: 原始类型有哪几种? null是对象么?

在JS 中, 存在着6种原始值,分别是:

  • boolean
  • null
  • undefined
  • number
  • string
  • symbol

首先原始类型存储的都是值,是没有函数可以调用的, 比如 undefined.toString()

此时你肯定会有疑问, 这不对劲儿,明明 '1'.toString() 是可以使用的。其实在这种情况下, '1'已经不是原始类型了,而是被强制转换成了 String 类型也就是对象类型了, 所以可以调用 toString() 函数。

除了会在必要的情况下强转类型以外,原始类型还有一些坑。

其中 JS 的number类型是浮点类型的, 在使用中会遇到某些bug,比如 0.1+0.2 !== 0.3

string类型是不可变的, 无论你在string类型上调用何种方法, 都不会对值有改变.

另外对于 null来说,很多人会认为他是个对象类型,其实这是不严谨的。虽然 typeof null 会输出object, 但是这只是JS存在的一个悠久的bug。在JS 的最初版本中使用的是32位系统,为了性能考虑使用地位存储变量的类型信息。 000开头代表的是对象, 然而null表示为全零,所以将它错误的判断为 object。虽然现在的内部类型判断代码已经改变了,但是对于这个bug确实一直流传下来。

对象 (Object) 类型

涉及面试题: 对象类型和原始类型的不同之处? 函数参数是对象会发生什么问题?

在JS中,除了原始类型那么其他的都是对象类型了。队形类型和原始类型不同的是,原始类型存储的是值,对象类型存储的是地址(指针)。当你创建了一个对象类型的时候,计算机会在内存中帮我们开辟一个空间来存放值,但是我们需要找到这个空间,这个空间会拥有一个地址(指针)。

const list = []

对于常量 list来说,假设内存地址(指针)为 #001,那么#001的位置存放了值[], 常量 list存放了地址(指针)#001, 再看以下代码

const list = []
const listA = list
listA.push(1)

当我们将变量赋值给另外一个变量时,赋值的是原本变量的地址(指针),也就是说当前变量listA存放的地址(指针)也是 #001,当我们进行数据修改的时候,就会修改存放在地址(指针)#001上的值,也就导致了两个变量的值都发生了改变。

接下来我们来看函数参数是对象的情况

function test (person) {
    person.age = 26;
    person = {
        name: 'wzy',
        age: 29
    }
    return person
    
};

const p1 = {
    name:'bryant',
    age: 42
};
const p2 = person(p1);
console.log(p1) // -> ?
console.log(p2) // -> ?

对于以上代码, 你是否能正确的写出结果呢? 接下来让我为你解析一番:

  • 首先,函数传参是传递对象指针的副本
  • 到函数内部修改参数的属性这步, 当前 p1的值也被修改了
  • 但是当我们重新为person分配了一个对象时就出现了分歧

image.png