我创建了一个函数,如果它的值是数组,则删除对象属性+值。这是它的样子:
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]
,而不仅仅是match
。
除了这个解决方案之外,还有更好的方法吗?
我是JavaScript的绝对初学者。
任何人都可以教我或以外行的术语与我讨论这段代码的作用吗?
任何?
答案 0 :(得分:2)
在javascript中,每个内置类型都有自己的toString
方法。对于数组,它将返回用逗号连接的所有数组值,例如:
const arr = [1,2,3,4,5]
arr.toString() // returns "1,2,3,4,5"
Object的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
的行为(即[对象类型]),那么你可以使用该函数并用数组作为值而不是对象来调用它。
如果您不关心IE 8,更好的方法是使用Array.isArray
。例如,在您的函数中:
function removeArrayValues(obj) {
for (var key in obj) {
if (Array.isArray(obj[key])) delete obj[key]
}
}
答案 1 :(得分:0)
Object.prototype.toString.call(obj[key])
实际返回字符串[object Array]
,因此将其与Array
进行比较不会返回匹配
typeof
获得的数组, <iframe>
可能会给您错误,因此这种确认类型的方式更可靠。
这里有一篇很棒的文章:https://javascriptweblog.wordpress.com/2011/08/08/fixing-the-javascript-typeof-operator/