面试问的比较细的JS数据类型

78 阅读2分钟

JS中的数据类型及区别

包括值类型(基本对象类型)和引用类型(复杂对象类型)

基本类型(值类型): Number(数字),String(字符串),Boolean(布尔),Symbol(符号),bigint,null(空),undefined(未定义)在内存中占据固定大小,保存在栈内存中

引用类型(复杂数据类型):Object(对象)、Function(函数)。其他还有Array(数组)、Date(日期)、RegExp(正则表达式)、特殊的基本包装类型(String、Number、Boolean) 以及单体内置对象(Global、Math)等 引用类型的值是对象 保存在堆内存中,栈内存存储的是对象的变量标识符以及对象在堆内存中的存储地址。

JS中的数据类型检测方案

1.typeof

console.log(typeof 1); // number

console.log(typeof NaN); // number

console.log(typeof BigInt("9007199254740995")); // bigint

console.log(typeof true); // boolean

console.log(typeof 'aa'); // string

console.log(typeof Symbol) // function

console.log(typeof function(){}); // function

console.log(typeof console.log()); // undefined

console.log(typeof []); // object

console.log(typeof {}); // object

console.log(typeof null); // object

console.log(typeof undefined); // undefined

优点:能够快速区分基本数据类型

缺点:不能将Object、Array和Null区分,都返回object

2.instanceof

console.log(1 instanceof Number); // false

console.log(true instanceof Boolean); // false

console.log('str' instanceof String); // false

console.log([] instanceof Array); // true

console.log(function(){} instanceof Function); // true

console.log({} instanceof Object); // true

instanceof 原理

function instance_of(leftVaule, rightVaule) {

let rightProto = rightVaule.prototype; // 取右表达式的 prototype 值

leftVaule = leftVaule.__proto__; // 取左表达式的__proto__值

while (true) {

if (leftVaule === null) {

return false;

}

if (leftVaule === rightProto) {

return true;

}

leftVaule = leftVaule.__proto__

}

}

优点:能够区分Array、Object和Function,适合用于判断自定义的类实例对象

缺点:Number,Boolean,String基本数据类型不能判断

3.Object.prototype.toString.call()

因为Object.prototype.toString()返回的是调用者的类型。不论你toString()本身的入参写的是什么,在Object.prototype.toString()中,他的调用者永远都是Object.prototype;所以,在不加call()情况下,我们的出来的结果永远都是 [object Object]

call(),是为了改变Object.prototype.toString这个函数都指向。让Object.prototype.toString这个方法指向我们所传入的数据**。

var toString = Object.prototype.toString;

Object.prototype.toString(1); //[object object] 不加call

console.log(toString(1)); //[object Undefined] 不加call

console.log(toString.call(1)); //[object Number]

console.log(toString.call(true)); //[object Boolean]

console.log(toString.call('aa')); //[object String]

console.log(toString.call([])); //[object Array]

console.log(toString.call({})); //[object Object]

console.log(toString.call(function(){})); //[object Function]

console.log(toString.call(undefined)); //[object Undefined]

console.log(toString.call(null)); //[object Null]