Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/410.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 什么';使用instanceof和检查构造函数之间的区别是什么?_Javascript - Fatal编程技术网

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
    属性的原因。