定义一个实用程序函数来检查对象的原型链(在Chrome中),我得到了数组。
所以看来
[].__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
答案 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目前不会导出此符号,因此很难测试