instanceof在Node 4中为true但在Node 6中不为true。

4
当我在Node 4中执行此命令时,最后一个语句的结果为true,而在Node 6中则为false。为什么?
F = () => {};
F.prototype = {};
Object.create(F.prototype) instanceof F;
1个回答

2

这很可能是Node 6.x中的一个bug。请考虑以下内容:

const Foo = () => {};
Foo.prototype = {};
const foo = Object.create(Foo.prototype);
// false in Node 6, true in Chrome
console.log(foo instanceof Foo);
// true in Node 6, true in Chrome
console.log(Foo[Symbol.hasInstance](foo));

前两个日志应该返回相同的值,因为instanceof运算符被定义为调用并返回Foo的@@hasInstance方法(如果存在) (§12.9.4)。更有趣的是,在以下情况下,node会抛出TypeError,而期望的是false,因为Foo不可调用 (§7.3.19):

const Foo = {
  "prototype": {},
  [Symbol.hasInstance]: Function.prototype[Symbol.hasInstance]
};
const foo = Object.create(Foo.prototype);
// throws in Node 6, false in Chrome
console.log(foo instanceof Foo);
// false in Node 6, false in Chrome
console.log(Foo[Symbol.hasInstance](foo));

PS

测试使用的是Node v6.2.2 (64位)在Windows系统上进行的。


感谢您验证了这个问题。我在这里打开了一个Node问题:https://github.com/nodejs/node/issues/7592 - wprl
@wprl我认为他们可能只是实现了旧版本的规范,或者混合了ES5和ES6的行为。只是好奇:你真的依赖这种行为吗? - Tamas Hegedus
我并不经常使用 instanceof,但有时候会用到... 我希望我编写的一个混入模块 deco 的下一个版本能够继续支持这种使用 instanceof 的方式。 - wprl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接