我希望一个对象在数字上下文中返回一个值,在字符串上下文中返回一个完全不同的值.以下不起作用.
foo = {
toString: function() { return "string" },
valueOf: function() { return 123 }
}
console.log(foo * 2) // got 246, fine
console.log("hi " + foo) // got "hi 123", want "hi string"
Run Code Online (Sandbox Code Playgroud) 谁能告诉我之间的确切差异join()和toString()和valueOf()在Javascript.何时以及在什么情况下我们需要使用它们?
我在地址栏中尝试了这段代码:
javascript: alert({} + [])
结果是:[object Object].
javascript: alert(typeof ({} + []))
结果是:字符串.
有人可以向我解释发生了什么吗?
我在使用JavaScript中的+运算符进行隐式强制时遇到了麻烦.即valueOf和toString的优先级顺序.
var obj = {};
obj.toString(); >'[object Object]"
obj.valueOf(); =>对象{}
'Hello ' + obj; >"Hello [object Object]"
所以obj被隐式强制转换为使用toString()方法而不是valueOf()的字符串;
var obj2 = {
toString: function() {
return "[object MyObject]";
},
valueOf: function() {
return 17;
}
};
Run Code Online (Sandbox Code Playgroud)
obj2.toString(); >'[object MyObject]"
obj2.valueOf(); => 17
'Hello ' + obj2; >"你好17"
因此,当我覆盖toString和valueOf方法时,+运算符将强制使用valueOf.
我错过了什么?谢谢.
当我减去两个Date对象时,如下所示:
const startTime = new Date();
await someAsyncStuff();
const endTime = new Date();
const elapsedTime = endTime - startTime;
console.log(`The async stuff took ${elapsedTime} ms`);
Run Code Online (Sandbox Code Playgroud)
为什么Date对象最终被强制转换为毫秒,然后被减去?我知道他们这样做了,但我无法弄清楚导致这种情况的实际事件顺序是什么.
v = {
toString: function () { return 'foo' },
valueOf: function () { return 5 }
}
console.log('' + v); //5
console.log(v); // { [Number: 5] toString: [Function], valueOf: [Function] }
Run Code Online (Sandbox Code Playgroud)
为什么v对象的值为5?