Javascript 为什么不是';在字符串连接操作中调用t Number.toString()?

Javascript 为什么不是';在字符串连接操作中调用t Number.toString()?,javascript,string,prototype,Javascript,String,Prototype,在尝试Object.toString()函数的默认行为时,我注意到下面这样的字符串连接可以预测地调用目标对象上的toString(): var x = { toString: () => "one" }; var y = { toString: () => "two" }; var output = 'x is ' + x + ' while y is ' + y; console.log(output); // writes "x is one while y is two" to

在尝试
Object.toString()
函数的默认行为时,我注意到下面这样的字符串连接可以预测地调用目标对象上的
toString()

var x = { toString: () => "one" };
var y = { toString: () => "two" };
var output = 'x is ' + x + ' while y is ' + y;
console.log(output); // writes "x is one while y is two" to the console
但是,例如,在
Number
Boolean
的原型中重写
toString()
时,没有观察到同样的情况。必须“强制”调用
toString()
以获得所需的输出:

Number.prototype.toString = () => "42";
Boolean.prototype.toString = () => "whatever you wish";

var a = 1;
console.log('The answer is ' + a); // writes "The answer is 1"
console.log('The answer is ' + a.toString()); // writes "The answer is 42"

var b = true;
console.log('Girl you know it\'s ' + b); // writes "Girl you know it's true"
console.log('Girl you know it\'s ' + b.toString()); // writes "Girl you know it's whatever you wish"
这在浏览器中是一致的(在Chrome、Firefox和Edge上测试),所以我认为这是标准行为。记录在哪里?是否有在字符串连接期间得到特殊处理的标准对象列表

    • 如果类型(lprim)为字符串或类型(rprim)为字符串,则
      • 让lstr去吧?ToString(lprim)
      • 让rstr去吧?ToString(rprim)
      • 返回lstr和rstr的字符串串联
  • 参数类型:Number=>returnnumbertoString(参数)

    • 如果m是NaN,则返回字符串“NaN”
    • 如果m为+0或-0,则返回字符串“0”
    • 如果m小于零,则返回“-”和!ToString(-m)
    • 如果m是+∞, 返回字符串“Infinity”

    • 。。。你明白了


  • JavaScript将在数字原语和数字对象之间自由转换

    如果你看一下,你会发现上面写着:

    7让lprim为上主元(lval)

    9设rprim为ToPrimitive(rval)

    因此,在处理
    +
    时,它将尝试在对象上使用原语

    然后,它可以将原语转换为字符串

    编号见7.1.12.1

    …然后描述


    简言之:

    它将值转换为原语,然后使用特殊的大小写规则将数字转换为字符串


    这意味着它不会将其视为对象,也不会调用通常可以覆盖此类规则的
    .toString
    方法。

    我有点惊讶,这种行为仍然发生在
    新数字(1)
    而不是
    1
    @user2357112 Yes me上,除了显式调用外,
    toString
    方法似乎在任何情况下都不会被调用。我也会感到惊讶,但我确保
    (1)。\uuuuu proto\uuuu
    返回
    Number