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"