在 JavaScript 中,判断一个变量的类型尝尝会用 typeof 运算符,在使用 typeof 运算符时采用引用类型存储值会出现一个问题,无论引用的是什么类型的对象,它都返回 "object"。ECMAScript 引入了另一个 Java 运算符 instanceof 来解决这个问题。instanceof 运算符与 typeof 运算符相似,用于识别正在处理的对象的类型。与 typeof 方法不同的是,instanceof 方法要求开发者明确地确认对象为某特定类型。
▍typeof
typeof能够输出的结果有六种:undefined、object、boolean、number、string、function。
console.log(typeof undefined); // undefined
console.log(typeof null); // object
console.log(typeof {a: "w",3: 2}); // object
console.log(typeof [1, 2, 3]); // object
console.log(typeof true); // boolean
console.log(typeof 1); // number
console.log(typeof 1.0); // number
console.log(typeof "null"); // string
console.log(typeof "1"); // string
console.log(typeof foo); // function
function foo() {
console.log("foo()")
}
▍instanceof
参考网址:instanceof-JavaScript | MDN
语法:
object instanceof constructor
object:要检测的对象。
constructor:某个构造函数。
示例:instanceof
运算符用来检测 constructor.prototype
是否存在于参数 object
的原型链上。
// 定义构造函数
function C() {}
function D() {}
var o = new C();
console.log(o instanceof C); // true,因为 Object.getPrototypeOf(o) === C.prototype
console.log(o instanceof D); // false,因为 D.prototype不在o的原型链上
console.log(o instanceof Object); // true,因为Object.prototype.isPrototypeOf(o)返回true
console.log(C.prototype instanceof Object) // true,同上
C.prototype = {};
var o2 = new C();
console.log(o2 instanceof C); // true
console.log(o instanceof C); // false,C.prototype指向了一个空对象,这个空对象不在o的原型链上.
D.prototype = new C(); // 继承
var o3 = new D();
console.log(o3 instanceof D); // true
console.log(o3 instanceof C); // true 因为C.prototype现在在o3的原型链上
示例:下面的代码使用了instanceof
来证明:String和
Date
对象同时也属于Object
类型(他们是由Object
类派生出来的)。
var simpleStr = "This is a simple string";
var myString = new String();
var newStr = new String("String created with constructor");
var myDate = new Date();
var myObj = {};
console.log(simpleStr instanceof String); // 返回 false, 检查原型链会找到 undefined
console.log(myString instanceof String); // 返回 true
console.log(myString instanceof Object); // 返回 true
console.log(newStr instanceof String); // 返回 true
console.log(myObj instanceof Object); // 返回 true, 尽管原型没有定义
console.log(({}) instanceof Object); // 返回 true, 同上
console.log(myDate instanceof Date); // 返回 true
console.log(myDate instanceof Object); // 返回 true
console.log(myDate instanceof String); // 返回 false