gpt4 book ai didi

javascript - String(number) 是否在内部调用 number.toString?

转载 作者:行者123 更新时间:2023-11-29 19:08:41 25 4
gpt4 key购买 nike

我刚刚尝试了一些东西并发现了这个:

如果您在自定义 toString 中调用 String(n),它会调用自身并抛出错误 Maximum Call Stack exceeded

JSFiddle

Number.prototype.toString = function() {
return String(this)
}

var a = 10;
try {
a.toString()
} catch (err) {
console.log(err.message)
}

但是如果你直接调用var b = String(a),它不会调用toString函数。

JSFiddle

Number.prototype.toString = function(){
console.log(this);
return '' + this;
}

var a = 10;
a.toString();

注意:我知道上面的代码片段也会抛出同样的错误,但我已经检查了 Nodechrome - JSFiddle Firefox - JSFiddle 并且它是一致的。 var b = String(a) 不调用 number.toString()'' + this 也是如此。这是 Stack 片段中的一些优化,即在 ''+this 上调用 number.toString()

所以我的问题是,我错过了什么?为什么会出现这种奇怪的行为?

最佳答案

实际数字调用内部方法将它们转换为字符串,并且它们的输出不受 valueOftoString 的影响,除非它们被显式调用。

那么为什么首先调用 toString 呢?

这是因为在“草率”(非严格)模式下,this 的值将被转换为其对象形式(即等同于 new Number(10)) 在传递给 String(this)'' + this 之前。

(因此,在使用严格模式的普通应用程序中,您可能看不到这两种方式之间的区别。)

因为 this 是一个对象,String()+ 加法运算符都会尝试将对象转换为字符串。这通常通过调用 obj.toStringobj.valueOf 来完成。

至于为什么String(this)会失败而'' + this不会,String函数调用了toString 在调用 valueOf 之前在对象上。

但是,当您使用加法 (+) 运算符时,valueOftoString 的顺序会颠倒。

关于javascript - String(number) 是否在内部调用 number.toString?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40838458/

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