为什么以下两行返回不同的结果?
("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/