gpt4 book ai didi

javascript - 计算属性查找似乎会改变类/子类型

转载 作者:行者123 更新时间:2023-12-03 02:00:01 25 4
gpt4 key购买 nike

给出以下代码(与较大的程序分离):

class Sum extends Number {} {
const Sum_ = Sum;

Sum = function(n) {
return new Sum_(n);
};

Sum.prototype = Sum_.prototype;
}

Sum.prototype[Symbol.toStringTag] = "Sum";

const dispatcher = (...args) => args.map(arg => {
const tag = Object.prototype.toString.call(arg);
return tag.slice(tag.lastIndexOf(" ") + 1, -1);
}).join("/");

const VALUE = Symbol("VALUE");

const foo = x => y => {
if (x && x[VALUE] && (VALUE in x))
x = x(y);

else if (y && y[VALUE] && (VALUE in y))
y = y(x);

return dispatcher(x, y);
};

const bar = x => y => {
if (typeof x === "function" && (VALUE in x)) // deviates
x = x(y);

else if (typeof y === "function" && (VALUE in y)) // deviates
y = y(x);

return dispatcher(x, y);
};

console.log("bar:", bar(Sum(2)) (Sum(3))); // "Sum/Sum"
console.log("bar:", bar(Sum(2)) (Sum(3))); // "Sum/Sum"
console.log("foo:", foo(Sum(2)) (Sum(3))); // "Sum/Sum"
console.log("foo:", foo(Sum(2)) (Sum(3))); // "Number/Number"
console.log("bar:", bar(Sum(2)) (Sum(3))); // "Number/Number"

如您所见,foo/bar几乎相同。然而第一次调用foo有点变异Sum的原型(prototype)使得Object.prototype.toString dispatcher内的调用产生不同的标签。

计算属性查找 x[VALUE]似乎是导致突变的决定性部分。我不知道这里发生了什么。也许...

  • 问题很明显,但是在盯着代码一个小时后我再也没有机会看到它了
  • 突变是由 Sum 引起的类
  • 这是一个与 chromium/chrome 相关的错误

据我了解,Sum声明一个类,下面的 block 作用域创建一个引用副本,并使用最终使用 new 调用该类的函数重新绑定(bind)类名。 ,这样new在调用方可以省略。但是,我看不出这与突变有什么关系。

最佳答案

是的,这绝对是一个错误。我可以写的最小重现案例是

class Sum extends Number {}
Sum.prototype[Symbol.toStringTag] = "Sum";

const VALUE = Symbol("VALUE");

function foo(x) {
console.log("x.value", x[VALUE]);
return Object.prototype.toString.call(x);
}

console.log("foo:", foo(new Sum(2))); // "[object Sum]"
console.log("foo:", foo(new Sum(2))); // "[object Number]"

我不知道这里出了什么问题,但我只能建议不要扩展原生原始包装器:-)
我确实提交了https://bugs.chromium.org/p/v8/issues/detail?id=7706 .

关于javascript - 计算属性查找似乎会改变类/子类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50077831/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com