为什么以下两行返回不同的结果?

("test" instanceof String) // returns false
("test".constructor == String) // returns true

在Chrome版本28.0.1500.95 m的控制台中测试

对于 native 类型,它的工作方式是否略有不同?

最佳答案

constructor只是内部[[prototype]]属性的一个属性,可以轻松地对其进行操作:

function A(){}
function B(){}
A.prototype.constructor = B;

var a = new A();

console.log(a.constructor); //B

但是,即使您更改了构造函数的完整instanceof属性,prototype运算符也会检查内部原型(prototype)链,并且很难被愚弄:
function A(){}
function B(){}
A.prototype = B.prototype;

var a = new A();

console.log(a instanceof A); //true
console.log(a instanceof B); //false

那么,为什么"test" instanceof String === false而不是("test".constructor == String) === true呢?

首先,"test"是一个基元,而基元绝不是任何实例。使用instanceof时实际发生的情况是,使用可能的实例作为参数来调用构造函数的内部[[HasInstance]]方法。因此a instanceof A大致翻译为:
`A.[[HasInstance]](a)`

ECMA规范对[[HasInstance]]说:http://www.ecma-international.org/ecma-262/5.1/#sec-15.3.5.3



换句话说:如果instanceof的左侧不是对象,则运算符将返回false。
("test".constructor == String) === true起作用的原因有所不同:如果尝试访问基元的属性,则该基元将被临时转换为对象。因此"test".constructor大致等于:
(new String("test")).constructor

在这种情况下,您实际上是在使用构造函数创建对象,然后再请求constructor属性。因此,它将返回String并不奇怪。

关于javascript - 使用instanceof和检查构造函数有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18055980/

10-13 00:38