对象原型toString调用 - JavaScript

时间:2017-08-03 15:57:39

标签: 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],而不仅仅是match

除了这个解决方案之外,还有更好的方法吗?

我是JavaScript的绝对初学者。

任何人都可以教我或以外行的术语与我讨论这段代码的作用吗?

任何?

2 个答案:

答案 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/