2013-05-15 38 views
0
Object.prototype.valueOf.call("abc") 
{ '0': 'a' 
, '1': 'b' 
, '2': 'c' 
} 
Object.prototype.valueOf.call(new String("abc")) 
{ '0': 'a' 
, '1': 'b' 
, '2': 'c' 
} 

根據MDN,JavaScript調用valueOf方法將對象轉換爲原始值。如果對象沒有原始值,則valueOf返回對象本身,顯示爲: 的翻譯: 但上面的valueOf將返回不同的格式,而不是返回原始 { '0': 'a' , '1': 'b' , '2': 'c' } .Isn't它反對的定義?爲什麼它在格式。現在回來了,這已經造成了混亂。如何知道是什麼如果對數組和其他對象調用Object.prototype.valueOf.call(array),將返回。Object.prototype.valueOf()方法

也是爲什麼返回對象形式{}.valueOf()得到,因爲從[].valueOf()方法返回記錄顯示任何內容時顯示

+0

我不確定你在做什麼,json作品是做什麼的? :'{ '0': 'A' , '1': 'B' , '2': 'C' }'? – gideon

+0

你從哪裏得到'[object ObjectName]?這可能是在返回的對象上調用toString的結果(例如,當執行'alert(object)'或'console.log(object)'時。 – RobG

+0

@RobG [object ObjectName]如果通過調用valueOf Object.prototype.valueOf(「串」) –

回答

6

讓我們來看看什麼valueOf(這是一個鏈接)的作用:

令O是結果調用ToObject傳遞這個值作爲參數。

ToObject

字符串

創建其[[PrimitiveValue]]內部屬性被設置爲參數的值的新的字符串對象。關於字符串對象的描述見15.5。

換句話說,它只是用原始值創建一個新的字符串對象,即new String('abc')。現在看看你的控制檯是如何顯示的,你會注意到它和.valueOf.call的結果是一樣的。

編輯:這實際上更多地與你用什麼媒體來查看答案。 Chrome和Firefox的開發工具顯示字符串作爲它們的字面值(字符串本身),但顯示字符串對象就好像它們是常規對象(通過顯示它們的屬性)。

字符串只是一個字符的「數組」,其上有一些方法。所以表示{'0' : 'a', '1' : 'b', '2' : 'c'}的意思是「a在第一個位置,b在第二個,c在第三個」,這是你要求的字符串。

而作爲最後的筆記,valueOf不給[object ObjectName]。你可能指的是Object.prototype.toString

+1

+1我應該在我發佈之前更新了頁面! – RobG

3

也許我錯過了真正的問題是什麼。下面是ECMA-262說:

15.2.4.4 Object.prototype.valueOf()

當被稱爲的valueOf方法,採取以下步驟:

  1. 假設O是調用ToObject將該值作爲 參數傳遞的結果。

  2. 如果ö是調用帶有 宿主對象(15.2.2.1)的對象構造,然後

    一個的結果。返回或其他值,如 最初傳遞給構造函數的主機對象。返回的具體 結果是實現定義的。

  3. 返回Ø

在表達式:

Object.prototype.valueOf.call("abc") 

Object.prototype.valueOf正在用一個字符串原始作爲調用。因此在步驟1中,使用內部方法ToObject進行轉換。

如果傳入類型爲String的值(即「abc」爲)ToObject將返回一個String對象。

步驟2是無關緊要的,因爲對象不是宿主對象(它是一個本地對象)。

步驟3返回由toObject創建的對象。

所以測試:

var x = Object.prototype.valueOf.call("abc"); 

alert(typeof x); // object 

的typeof返回對象因爲所得到的值是一個字符串對象(typeof運算符的一個很好的夸克)。你可以走得更遠:

typeof x.match; // function 
x.constructor; // function String() {[native code]} 
alert(x); // abc 

所有符合返回值是(引用)的String對象。

+0

如果一個對象沒有原始值,valueOf返回對象本身,它顯示爲:[object Object]。如果對象具有像上面的帖子那樣的原始值但是針對不同的對象又會返回什麼,如何知道? –

+0

這是一個對象,所以它沒有原始值(除非你計算第2步)?你如何期待它有一個? – Bergi