2017-08-03 75 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