Javascript 什么';使用instanceof和检查构造函数之间的区别是什么?
为什么下面两行返回不同的结果Javascript 什么';使用instanceof和检查构造函数之间的区别是什么?,javascript,Javascript,为什么下面两行返回不同的结果 ("test" instanceof String) // returns false ("test".constructor == String) // returns true 在chrome版本28.0.1500.95 m的控制台中测试 对于本机类型,它的工作方式是否略有不同?主要区别在于instanceof检查对象的原型链,而检查构造函数只检查它是否是从同一个构造函数创建的 例如: function MyObject() { this.sayHi
("test" instanceof String) // returns false
("test".constructor == String) // returns true
在chrome版本28.0.1500.95 m的控制台中测试
对于本机类型,它的工作方式是否略有不同?主要区别在于
instanceof
检查对象的原型链,而检查构造函数只检查它是否是从同一个构造函数创建的
例如:
function MyObject() {
this.sayHi = function() { alert('Hi!'); }
}
var x = new MyObject();
alert(x.constructor === Object);
alert(x instanceof Object);
constructor
只是内部[[prototype]]
属性的一个属性,可以轻松操作:
function A(){}
function B(){}
A.prototype.constructor = B;
var a = new A();
console.log(a.constructor); //B
然而,instanceof
操作符检查内部原型链,即使您更改构造函数的完整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的一个实例
大致翻译为:
`A.[[HasInstance]](a)`
ECMA规范对[[HasInstance]]
这样说:
[[HasInstance]](V)
假设F是一个函数对象
当使用值V调用F的[[HasInstance]]内部方法时,
采取以下步骤:
如果V不是对象,则返回false
换句话说:如果instanceof
的左侧不是对象,则操作符将返回false
(“test.constructor==String)==true
的工作原理不同:如果尝试访问基元的属性,基元将临时转换为对象。所以“test”。构造函数大致等于:
(new String("test")).constructor
在这种情况下,您实际上正在使用构造函数创建一个对象,并随后请求构造函数
属性。因此,它将返回String
也就不足为奇了,我不认为它是重复的。“这实际上是一个更一般的问题。”我同意。此外,我认为对这个可能重复的问题本身的答案描述不足。我投票赞成重新讨论这个问题。为了让大家看一看下面的答案:您的答案很有趣,谢谢,本机类型有一个构造函数包装器
是对上述问题的解释。知道可以用第一个参数作为原语值初始化那些包装器类型也很有用。@Ally我认为解释是当您编写“test”
时,它实际上执行字符串(“test”)代码>得到一个基元(因此instanceof不起作用,因为它不是对象)。但是,当您尝试使用文本作为对象时,浏览器会将其转换为字符串
对象,这就是出现.constructor
属性的原因。