对象原型 toString 调用 - JavaScript

7
我创建了一个函数,如果属性的值是一个数组,就会删除该对象的属性和值。下面是函数的代码示例:

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],而不是只需要简单地使用'Array'
此外,除了这个解决方案之外,是否有更好的方法来完成这个任务?
作为JavaScript的绝对初学者,有人能用通俗易懂的语言教我或与我讨论这段代码的作用吗?
有人可以帮忙吗?
2个回答

11
在JavaScript中,每种内置类型都有自己的toString方法。对于数组来说,它会返回所有数组值用逗号连接后的字符串,例如:
const arr = [1,2,3,4,5]
arr.toString() // returns "1,2,3,4,5"

对象(Object)的toString函数返回该对象的类型(Type)字符串,格式为[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]"

如果想知道一个变量是否为数组,可以通过以下方式。Object的原型上有toString方法。 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]
  }
}

1
这是最好的解释。我不明白为什么会有那么多被踩的问题。这个答案被踩的原因是什么? - PeterMader
2
有些用户毫无明显原因地对所有内容进行了负面评价。 - shadymoses

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接