亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

2 個對象(通過字符串的 new 關鍵字創建)不提供 [Object][Object]

2 個對象(通過字符串的 new 關鍵字創建)不提供 [Object][Object]

萬千封印 2023-02-17 16:03:21
這個問題是基于上一個問題:這兩個字符串的區別(JavaScript)人們回答說,通過兩種不同的方式創建字符串是有區別的:字符串文字創建字符串 ( var a = "abc")new關鍵字創建字符串對象,我假設它是一種對象 ( var b = new String("def"))現在,typeof在第一種情況下將返回string。在第二種情況下,它將返回Object。我很好,開發它的人可能有某種 JS 引擎的工作方式。但是,那么,在下面的示例中,為什么我在最后一行得到的答案到底是abcdef. 現在,這也應該[object][object]像上面那行一樣得到安慰。現在我真的很困惑,new String是創建一個字符串,還是對象還是什么?它只是不一致!有人可以幫我解釋一下嗎?var obj1 = new Object({name: "Peter"});var obj2 = new Object({age: 29});var str1 = new String("abc");var str2 = new String("def");console.log(obj1);console.log(obj2);console.log(str1);console.log(str2);console.log(obj1 + obj2);console.log(str1 + str2); 
查看完整描述

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);


查看完整回答
反對 回復 2023-02-17
?
catspeake

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"


查看完整回答
反對 回復 2023-02-17
  • 2 回答
  • 0 關注
  • 95 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號