typeof与instanceof

版权声明:本文为博主原创文章,转载时请注明出处。 https://blog.csdn.net/i_dont_know_a/article/details/82893686

在 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

猜你喜欢

转载自blog.csdn.net/i_dont_know_a/article/details/82893686