我创建了一个删除对象属性+值(如果它的值是一个数组)的函数。看起来是这样的:

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的初学者。

谁能用外行的术语教我或与我讨论此代码的作用?

任何人?

最佳答案

在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的行为(即[对象类型]),则可以使用该函数,并使用数组作为值而不是对象来调用它。

如果您不关心IE 8,一个更好的方法是使用Array.isArray。例如,在您的函数中:

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

关于javascript - 对象原型(prototype)toString调用-JavaScript,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45489249/

10-12 00:19
查看更多