[] .__ proto__ === Array.prototype // === [Symbol(Symbol.unscopables):Object]?

时间:2015-03-22 14:57:52

标签: javascript google-chrome prototype ecmascript-6

定义一个实用程序函数来检查对象的原型链(在Chrome中),我得到了数组。

array prototype chain

所以看来

[].__proto__ === Array.prototype  // === [Symbol(Symbol.unscopables): Object] 

我理解第一个平等。我不知道第三个词是什么,虽然我听说ES6会有符号。

这件事与Array.prototype相同吗?为什么这样打印?

编辑:chrome://版本信息:

Google Chrome   40.0.2214.111 (Official Build) 
Revision    6f7d3278c39ba2de437c55ae7e380c6b3641e94e-refs/branch-heads/2214@{#480}
OS  Linux 
Blink   537.36 (@189455)
JavaScript  V8 3.30.33.16

1 个答案:

答案 0 :(得分:2)

评论于2014-04-14

Chrome的console.log似乎打印了所有符号类型键,下面是一个示例:

var o = {};
o[Symbol.iterator] = function () {};
o[Symbol.unscopables] = {};
var s = Symbol('s');
o[s] = 3;
console.log(o);

打印:

  

Object {Symbol(Symbol.unscopables):Object,Symbol(Symbol.iterator):function,Symbol(s):3}

我不知道为什么chrome会以这种方式运行,是用于调试还是其他什么?

幸运的是,它不会影响toString()结果,因此所有代码都是安全的。


似乎console.log会特别在控制台中打印Symbol.unscopable键,我们可以像这样执行一个普通对象:

var o = {};
o[Symbol.unscopables] = {};
console.log(o);

输出:

  

Object {Symbol(Symbol.unscopables):Object}

Symbol.unscopables符号是ES6中定义为@@unscopables的特殊符号,用于在with环境中使用此对象时排除某些属性,官方解释为:

  

对象值属性,其属性名称是从关联对象的环境绑定中排除的属性名称。

一个简单的例子:

var o = {x: 1, y: 2};
o[Symbol.unscopables] = {
    y: true
};

console.log(o.x); // 1
console.log(o.y); // 2

with(o) {
    console.log(x); // 1
    console.log(y); // ReferenceError: y is not defined
}

您可以使用Array.prototype[Symbol.unscopables]查找with环境中无法使用的所有密钥

然而,Array.prototype的输出与具有Symbol.unscopables键的普通对象不完全相同,它输出[Symbol(Symbol.unscopables): Object],这是一种更像数组的格式

我无法准确解释原因,这可能与控制如何将对象格式化为字符串的Symbol.toStringTag相关,但Chrome目前不会导出此符号,因此很难测试