Javascript []。\uuuuu proto\uuuu===Array.prototype/===[Symbol(Symbol.uncopables):对象]?
定义一个实用函数来检查对象的原型链(在Chrome中),我为数组得到了这个函数 看来Javascript []。\uuuuu proto\uuuu===Array.prototype/===[Symbol(Symbol.uncopables):对象]?,javascript,google-chrome,prototype,ecmascript-6,Javascript,Google Chrome,Prototype,Ecmascript 6,定义一个实用函数来检查对象的原型链(在Chrome中),我为数组得到了这个函数 看来 [].__proto__ === Array.prototype // === [Symbol(Symbol.unscopables): Object] 我理解第一个等式。我不知道第三个术语是什么,尽管我听说ES6将有符号 这和Array.prototype一样吗?为什么它是那样打印的 编辑:chrome://version 资料: Google Chrome 40.0.2214.111 (Offi
[].__proto__ === Array.prototype // === [Symbol(Symbol.unscopables): Object]
我理解第一个等式。我不知道第三个术语是什么,尽管我听说ES6将有符号
这和Array.prototype一样吗?为什么它是那样打印的
编辑:chrome://version 资料:
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
2014年4月14日评论
Chrome的控制台。log
打印所有符号类型键,下面是一个示例:
var o = {};
o[Symbol.iterator] = function () {};
o[Symbol.unscopables] = {};
var s = Symbol('s');
o[s] = 3;
console.log(o);
其中打印:
对象{Symbol(Symbol.uncopables):对象,Symbol(Symbol.iterator):函数,Symbol(s):3}
我不知道为什么chrome会这样,是为了调试还是其他什么
通常,它不会影响toString()
结果,因此所有代码都是安全的
似乎
console.log
会特别打印符号。不可编辑的键在console中,我们可以有一个简单的对象来执行如下操作:
var o = {};
o[Symbol.unscopables] = {};
console.log(o);
哪些产出:
对象{Symbol(Symbol.uncopables):对象}
Symbol.uncopables
符号是ES6中定义为@@uncopables
的特殊符号,当此对象在和环境中工作时,用于排除某些属性,官方解释如下:
一种对象值属性,其自身的属性名称是与关联对象的绑定一起从环境中排除的属性名称
一个简单的例子:
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.uncopables]
查找在环境中无法使用的所有键
然而,Array.prototype
的输出与带有Symbol的普通对象并不完全相同。uncopables
键,它输出[Symbol(Symbol.uncopables):object]
,这是一种更像数组的格式
我无法确切解释原因,这可能与符号有关。toStringTag
控制对象应如何格式化为字符串,但Chrome目前没有导出此符号,因此很难测试最起码的例子是console.log([.\uu proto\uuu)
,它告诉您正在使用的浏览器,它可能是Chrome,现在用新的符号类型内部定义了数组。我错过了这个,因为我刚刚输入了作为[]打印的[.\uuu proto\uuuu
。请注意,在控制台中输入{}
会打印未定义的
,输入{x:3}
会输出3
,这很奇怪。请看一下这里的代码检查:,尤其是这一次“其属性为不应包含在with语句中的对象属性名称的对象”