大厂js基础面试-深挖到底系列1-数据类型

321 阅读2分钟

js数据类型

js类型分为基本类型和引用类型(这是字节跳动一面第一个问题,我都给忘了,当时肯定脑子进什么东西了),基本类型有以下六种

null
undefined
boolean
string
number
symbol(es6)

引用类型也有以下6种

object(以下为)
array
function
Regexp
Data
Error

typeOf(类型判断)

一小段 JS 历史

带着这个问题,我们来看一点 JavaScript 的历史。 大家都知道 "typeof null" 的 bug,它是在 JavaScript 的第一版就存在的。在这个版本中,值以 32 位的单位存储,包括一个小型类型标记(1-3 位)和值的实际数据。类型标记存储在单元的较低位上。一共有 5 种类型:

000: object,表示这个数据是一个对象的引用。

1: int,表示这个数据是一个 31 位的有符号整型。

010: double,表示这个数据是一个双精度浮点数的引用。

100: string,表示这个数据是一个字符串的引用。

110: boolean,表示这个数据是一个布尔值。

两个值比较特殊:

undefined (JSVAL_VOID) 的值是 −2^30 整型(一个超出整型范围的数)。

null (JSVAL_NULL) 是机器码空指针。或者是:一个对象类型标记加上一个为零的引用。详情参考下面的源码。

现在应该很清楚为什么 typeof 认为 null 是一个对象了:它检查了类型标记和类型标记表示的对象。

1、判断基本类型时是什么就是什么

2、null为Object()

3、Function为function

4、除以上其余的都是object 附一个很详细的链接:juejin.cn/post/684490…

instanceof

定义:从当前引用的proto一层一层顺着原型链往上找,能否找到对应的prototype

附instanceof底层原理:

function instance_of(L, R) {//L 表示左表达式,R 表示右表达式 

    var O = R.prototype;   // 取 R 的显示原型 

    L = L.__proto__;  // 取 L 的隐式原型

    while (true) {    

        if (L === null)      

             return false;   

        if (O === L)  // 当 O 显式原型 严格等于  L隐式原型 时,返回true

             return true;   

        L = L.__proto__;  

    }

}

Object.prototype.toString.call()

原理:toString方法将值转换为字符串,toString()定义在Object.prototype上

注意1:JavaScript原生的Array类型、Date类型、RegExp类型以及Number、Boolean、String这些包装类型都是Object的子类型(也解决了nul的问题)

注意2:此方法不可用于判断自定义类型,判断自定义类型要使用instanceof(19年12月字节笔试题实现自定义类型的深拷贝?当时我蒙了,有时间我来给补上)

Object.prototype.toString.call()方法精准是因为这些子类型都重写了toString方法

基本类型和数据类型判断先写到这有时间在添加。