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方法
基本类型和数据类型判断先写到这有时间在添加。