2017-08-03 92 views
0

我創建了一個函數,如果它的值是一個數組,它將刪除一個對象屬性+值。下面是它的樣子:對象原型toString調用 - JavaScript

function removeArrayValues(obj) { 
    for(var key in obj){ 
    if(Object.prototype.toString.call(obj[key]) === '[object Array]') { 
    delete obj[key]; 
    } 
    } 
} 

注意這部分:

Object.prototype.toString.call(obj[key]) 

我得到這個從朋友的解決方案但它不是我清楚它是什麼真的這樣做。而不僅僅是'Array'爲什麼我們需要把它放在[]之內,並將其稱爲[object Array]

還有沒有更好的方式來做到這一點比這個解決方案?

我是JavaScript的絕對初學者。

任何人都可以教我或以外行人的名義與我討論這段代碼的用途嗎?

有人嗎?

回答

2

在javascript中,每個內置類型都有自己的toString方法。對於數組,將返回所有的數組值的加盟有一個逗號,例如:

const arr = [1,2,3,4,5] 
arr.toString() // returns "1,2,3,4,5" 

toString函數對象(內置類型的對象)恰好返回它是什麼類型的對象一個格式爲[object Type]的字符串。例如:

const arr = [1,2,3,4,5] 
Object.prototype.toString.call(arr) // returns "[object Array]" 

const str = 'test' 
str.toString() // returns 'test' 
Object.prototype.toString.call(str) // returns "[object String]" 

所以,如果你想知道它是否是一個數組,那麼這是一種查找方法。 toString方法駐留在Object的原型上。 call是一個函數,可以讓您更改另一個函數的上下文。當您撥打[].toString()時,它將在Array.prototype上運行toString方法。如果你想要Object.prototype.toString(即[object Type])的行爲,那麼你可以使用該函數,並用一個數組作爲值而不是對象來調用它。

如果您不關心IE 8,更好的方法是使用Array.isArray。例如,在你的函數:

function removeArrayValues(obj) { 
    for (var key in obj) { 
    if (Array.isArray(obj[key])) delete obj[key] 
    } 
} 
+0

這是最好的解釋。我不明白downvoted問題的數量。爲什麼這個答案被降低了? – PeterMader

+0

有些用戶無緣無故地通過並降低了所有內容。 – shadymoses