为什么({__ proto __:[]})在JavaScript中返回Array类型的结果

时间:2018-04-26 04:02:34

标签: javascript

在JavaScript中,以下结果为false:

({ a: [] } instanceof Array);
console.log(({ a: [] } instanceof Array));

以下结果为真:

({ __proto__: [] } instanceof Array);
console.log(({ __proto__: [] } instanceof Array));

为什么结果不同?

1 个答案:

答案 0 :(得分:0)

const data = [ { "Attributes": [ { "Name": "profile", "Value": "UI" }, { "Name": "phone_number", "Value": "+91123456789" }, { "Name": "email", "Value": "to_test@test.in" } ], "UserCreateDate": 1524465619.163, "Username": "neeraj" } ],
      result = data.map(({Attributes, UserCreateDate, Username}) => Object.assign({UserCreateDate, Username}, ...Attributes.map(({Name, Value}) => ({[Name] : Value}))));
console.log(result);

返回false,因为您询问使用属性为数组初始化的对象本身是否为数组。明显的答案,不,而且console.log是假的。

({ a: [] } instanceof Array);

询问是否使用对象初始化器创建的对象将其继承链中的第一个对象设置为空数组(通过将初始化对象的({ __proto__: [] } instanceof Array); 属性设置为空数组)是一个实例阵列。

答案是正确的,因为JavaScript __proto__运算符仅报告 如果instanceof X的原型属性(在本例中为X)位于Array.prototype运算符左侧的对象的继承链中。由于第二个示例对象在其继承链中包含一个Array对象,该对象本身继承自intanceof,因此答案为Array.prototype

JavasScript不是经典意义上的基于类的语言,true报告对象的继承链,在大多数情况下,但并非所有情况都反映了instance of的概念。经典的基于语言的语言。