【问题标题】:[].__proto__ === Array.prototype // === [Symbol(Symbol.unscopables): Object]?[].__proto__ === Array.prototype // === [Symbol(Symbol.unscopables): Object]?
【发布时间】:2015-05-25 14:14:33
【问题描述】:

定义一个实用函数来检查对象的原型链(在 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

【问题讨论】:

  • 一个最小的例子是console.log([].__proto__),它告诉你你正在使用的浏览器,可能是Chrome,现在在内部用新的符号类型定义了Array.__proto__
  • 是的。我错过了,因为我刚刚输入了[].__proto__,它打印为 []。我猜控制台不会 console.log 它的结果。
  • 在那个注释中,奇怪的是,在控制台中输入{} 会输出undefined 并输入{x: 3} 输出3
  • "一个对象,其属性是不应包含在 with 语句中的对象属性的名称"

标签: javascript google-chrome prototype ecmascript-6


【解决方案1】:

2014-04-14 发表评论

看来 Chrome 的 console.log 打印所有 Symbol-type-keys,这里是一个例子:

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 环境中工作时排除某些属性,官方解释是:

一个对象值属性,其自身的属性名称是从关联对象的 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 目前不导出此符号,因此很难测试

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-16
    • 2016-02-09
    • 1970-01-01
    • 2017-08-10
    • 1970-01-01
    • 2020-11-06
    • 2020-12-14
    • 1970-01-01
    相关资源
    最近更新 更多