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的字符串串联
- 如果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
。