gpt4 book ai didi

javascript - 在 JavaScript 中替换 `String.prototype.valueOf`

转载 作者:数据小太阳 更新时间:2023-10-29 06:14:55 26 4
gpt4 key购买 nike

我正在构建一个 DSL这将受益于能够破解一些 JS 内部结构。我知道这在一般的 JS 用法中是一个非常糟糕的主意,但就我的目的而言,这没关系。以下代码工作正常:

var str = new String("blah");
str.valueOf = function() { return 10 }
console.log(str * 10); // outputs 100

但这不是:

var str = "blah";
str.valueOf = function() { return 10 }
console.log(str * 10); // outputs NaN (because str === "blah")

了解内部结构的人可以解释一下这里发生了什么吗?这两个示例之间的根本区别是什么?

现在如果我想更改字符串原型(prototype)本身怎么办,这样我就可以设置所有字符串valueOf方法,无论它们何时/何地/如何创造?这可能吗?不幸的是,这似乎不起作用:

String.prototype.valueOf = function() { return 10 }
console.log("blah" * 10); // NaN

尽管这样做:

String.prototype.valueOf = function() { return 10 }
console.log("blah".valueOf() * 10); // 100

还有这个:

String.prototype.valueOf = function() { return 10 }
console.log(new String("blah") * 10); // 100

为什么 JS 引擎对 "blah"new String("blah") 的处理方式不同?谢谢!

顺便说一下,here is a good article这让我开始探索这些东西。

最佳答案

当你这样做的时候

var str = "blah";

你正在创建一个字符串原始,但是当你这样做的时候

var str = new String("blah");

您正在调用构造函数并创建一个字符串对象

当你有一个对象时,javascript 在内部调用 valueOf当尝试在应该插入基元的地方使用该对象时。

对于基元则相反,为了能够链接方法,javascript 需要一个对象,并且在内部基元用 new String 包装在基元上调用对象方法时。

换句话说,当你有一个字符串原语,并且你尝试调用str.valueOf , javascript 将在内部执行 new String(str)在调用 valueOf 之前并返回值。
但是,当您尝试直接使用字符串时,您仍然只有原语,并且 valueOf不调用,直接插入原始值。

来自MDN

Note that JavaScript distinguishes between String objects and primitive string values. (The same is true of Boolean and Numbers.)

String literals (denoted by double or single quotes) and strings returned from String calls in a non-constructor context (i.e., without using the new keyword) are primitive strings.

JavaScript automatically converts primitives to String objects, so that it's possible to use String object methods for primitive strings.

In contexts where a method is to be invoked on a primitive string or a property lookup occurs, JavaScript will automatically wrap the string primitive and call the method or perform the property lookup.

关于javascript - 在 JavaScript 中替换 `String.prototype.valueOf`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41581409/

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