2 回答

TA貢獻1836條經驗 獲得超3個贊
new String創建一個String對象,它繼承自Object,但有自己的.toString和.valueOf方法,因此它將打印字符串內容。
var o = new Object();
var s = new String("foo");
console.log(o.toString === s.toString); // false
console.log(o.valueOf === s.valueOf); // false
您可以用自己的代碼覆蓋它們以查看它們是否被調用。請務必也調用原件。
var s = new String("foo");
s.valueOf = function() {
console.log("custom valueOf");
return String.prototype.valueOf.call(this);
}
s.toString = function() {
console.log("custom toString");
return String.prototype.toString.call(this);
}
console.log(s + s);
[""].join(s);

TA貢獻1111條經驗 獲得超0個贊
但是,在下面的例子中,為什么我在最后一行得到的答案是 abcdef。現在,這也應該像上面的行一樣安慰 [object][object]。
不同之處在于String對象有一個默認valueOf方法,該方法返回對象中包含的字符串值。
該Object對象有一個更通用的valueOf方法,它只返回一個字符串[object Object]
看 -
const one =
{ valueOf: _ => 1 }
const two =
{ valueOf: _ => 2 }
console.log(one + two)
// 3
您可以定義valueOf為任何東西 -
const foo =
{ valueOf: _ => "foo" }
const bar =
{ valueOf: _ => "bar" }
console.log(foo + bar)
// "foobar"
添加回答
舉報