JavaScript 判断数据类型有哪些方法?
有四种方法:
方法一:typeof
typeof 运算符返回一个字符串,表示操作数的类型。下图是使用 typeof 判断类型的汇总:
可以看到,typeof 判断类型有两个缺点:
对 null 值的判断是 object,这个是历史遗留问题
对 object 的判断区分不出具体的对象类型
方法二: instanceof
instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。
// 定义构造函数
function C(){}
function D(){}
var o = new C();
o instanceof C; // true,因为 Object.getPrototypeOf(o) === C.prototype
方法三:Object.prototype.constructor
constructor 属性返回 Object 的构造函数(用于创建实例对象)。
注意:此属性的值是对函数本身的引用,而不是一个包含函数名称的字符串。
所有对象(使用 Object.create(null) 创建的对象除外)都将具有 constructor 属性。在没有显式使用构造函数的情况下,创建的对象(例如对象和数组文本)将具有 constructor 属性,这个属性指向该对象的基本对象构造函数类型。
const o = {}
o.constructor === Object // true
const o = new Object
o.constructor === Object // true
方法四:Object.prototype.toString
Object.prototype.toString 方法返回一个表示该对象的字符串。
const toString = Object.prototype.toString;
toString.call(new Date()); // [object Date]
toString.call(new String()); // [object String]
小练习:如何实现 instanceof?
答案:
function myInstanceof(left, right) {
let proto = Object.getPrototypeOf(left); // 获取对象的原型
let prototype = right.prototype; // 获取构造函数的 prototype 对象
// 判断构造函数的 prototype 对象是否在对象的原型链上
while (true) {
if (!proto) return false;
if (proto === prototype) return true;
proto = Object.getPrototypeOf(proto);
}
}
作者:LeetCode
链接:https://leetcode.cn/leetbook/read/javascript-interview-2/7mduie/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。