引子:
JS 有 8 种数据类型,那我们如何判断不同的数据类型,进行对应的数据处理呢?
常见的有 typeof, instanceof, constructor, Object.prototype.toString.call,Reflect.apply(Object.prototype.toString, val, [])。
第一种常用于检测 基本类型和 Function,除 null 外。
第二三种常用于检测 引用类型,无法区分基本类型。
第四五种常用于检测 基本类型和引用类型。
同时,我们扩展延伸一下,深浅拷贝的相关知识:定义,如何实现一个深浅拷贝,什么时候用深拷贝、什么时候用浅拷贝。
1. typeof 关键字
1-1.语法
typeof operand typeof(operand)
operand: 一个表示对象或原始值的表达式,其类型将被返回。
返回值:字符串
1-2.优点
用于区分基本数据类型,但无法区分null
1-3.缺点
无法区分引用数据类型,但能区分function
1-4.代码实践
// 基本数据类型
console.log(typeof undefined) // 'undefined'
console.log(typeof 2) // 'number'
console.log(typeof true) // 'boolean'
console.log(typeof 'str') // 'string'
console.log(typeof Symbol('a')) // 'symbol'
console.log(typeof 1n) // 'bigint'
console.log(typeof null) // 'object'
// 引用数据类型
console.log(typeof []) // 'object'
console.log(typeof {}) // 'object'
console.log(typeof new Date()) // 'object'
console.log(typeof function () {}) // 'function'
// 有趣的,要注意
console.log(typeof Infinity) // 'number'
console.log(typeof NaN) // 'number'
console.log(typeof Math.LN2) // 'number'
console.log(typeof new Number(1)) // 'object'
console.log(typeof Number('1')) // 'number'
console.log(typeof typeof 1) // 'string'
// typeof 一个不存在的变量,不会报错,只会返回'undefined'
console.log(typeof smallAJ) // 'undefined'
typeof Object // 'function'
const fn = () => {}
typeof fn // 'function'
1-5.原理
// 第一版JS实现
if (JSVAL_IS_VOID(v)) { // (1)判断是否为 undefined
type = JSTYPE_VOID;
} else if (JSVAL_IS_OBJECT(v)) { // (2)判断是否为对象
obj = JS