javascript中的类型协同
以下代码的输出将是什么:javascript中的类型协同,javascript,Javascript,以下代码的输出将是什么: console.log({}.valueOf()+15);//Output:[object Object]15 在上面的代码中,.valueOf()方法的返回值是字符串还是仅仅是一个对象,因为.toString()将产生相同的结果,但使用此方法返回的值无论如何都是字符串。我只是想知道.valueOf()在上面的代码中返回的值的类型。如果返回值是字符串,除了[新字符串(“abc”)]valueOf之外,valueOf()方法将返回字符串值。到底什么类型的基元值取决于对象
console.log({}.valueOf()+15);//Output:[object Object]15
在上面的代码中,.valueOf()方法的返回值是字符串还是仅仅是一个对象,因为.toString()将产生相同的结果,但使用此方法返回的值无论如何都是字符串。我只是想知道.valueOf()在上面的代码中返回的值的类型。如果返回值是字符串,除了[新字符串(“abc”)]
valueOf
之外,valueOf()方法将返回字符串值。到底什么类型的基元值取决于对象
证明:
typeof Number(0).valueOf(); // number
typeof Boolean(0).valueOf(); // boolean
关键是,无论它返回什么,它都是一个原始值<另一方面,code>toString,总是返回一个字符串
在
{}
的情况下,除了根Object.prototype.valueOf
之外,没有valueOf
方法,它与Object.prototype.toString
相同,返回的字符串形式为[ObjectConstructor
。如果是字符串,则会与15
串联以获取JS中对象的类型,您可以使用typeof函数:
typeof({}) // outputs 'object'
typeof({}.valueOf()) // outputs 'object'
typeof({}.valueOf()+15) // outputs 'string'
这表示在尝试“添加”15时发生了值强制,这被解释为字符串连接。普通对象的.valueOf()
将是同一个对象。(这与它的.toString()
方法不同。)
+
运算符发现第一个操作数没有使用数字,因此它不进行加法,而是进行字符串串联,并调用两个操作数的.toString()
值
这就是为什么会得到[object object]15
您可以通过更改
toString()
输出来测试这一点
var o = {};
o.toString = function() { return "foobar" }
o.toString(); // "foobar"
o + 15; // "foobar15"
o.valueOf() + 15; // "foobar15"
但是我用一个数字相加will number也被强制为StringYes,因为在本例中,
+
的第一个操作数是一个字符串。现在我已经开始了解Javascript中的类型转换最后一个问题valueOf()方法返回StringValueOf()方法返回普通对象,它是一个string@Maizere:否,.valueOf()
对象返回一个非字符串的普通对象。它只是同一个物体。+
操作符返回一个字符串,原因我在下面的第一个代码示例的回答中解释过。请参见Kling post中的注释above@Maizere:Kolink的回答和评论是错误的。.valueOf()
与.toString()
不同,并且不返回字符串。@请将此o==o.valueOf()紧急退出代码>可能并不总是正确的。根据ECMA-262具体实施。谁想关闭此帖子????
var o = {};
o.toString = function() { return "foobar" }
o.toString(); // "foobar"
o + 15; // "foobar15"
o.valueOf() + 15; // "foobar15"