使用Array.isArray和instanceof Array的区别

20 浏览
0 Comments

使用Array.isArray和instanceof Array的区别

有两种方法可以判断一个数组是数组还是对象。使用typeof item === \"object\";会对对象和数组都返回true,因为数组相对较新,而且数组是对象的原型(可能表达不准确,请随意纠正)。所以我知道的判断数组是否为数组的两种方法是:\n解决方案1:\n

Array.isArray(item);

\n解决方案2:\n

item instanceof Array;

\n我的问题是:\n

    \n

  1. 这两种解决方案有什么区别?
  2. \n

  3. 这两种解决方案中哪种是首选解决方案?
  4. \n

  5. 哪种解决方案的处理时间更快?
  6. \n

0
0 Comments

Array.isArray和instanceof Array之间的区别

在Felix Kling的评论中提到,instanceof Array在不同的iframe中不起作用。举个具体的例子,试试下面的代码:

var iframeEl = document.createElement('iframe');
document.body.appendChild(iframeEl);
iframeArray = window.frames[window.frames.length - 1].Array;
var array1 = new Array(1,1,1,1);
var array2 = new iframeArray(1,1,1,1);
console.log(array1 instanceof Array);  // true    
console.log(Array.isArray(array1));  // true
console.log(array2 instanceof Array);  // false    
console.log(Array.isArray(array2));  // true    

如上面的例子所示,使用iframe中的Array构造函数创建的数组(即array2)在使用instanceof Array时无法被识别为数组。然而,使用Array.isArray()时,它被正确地识别为数组。

如果你想知道为什么instanceof Array在不同的全局环境(如iframe或window)中不起作用,你可以在这里阅读更多信息。

这两种方法中哪一种更优?

在大多数情况下,instanceof Array应该足够了。然而,由于instanceof Array在iframe/window之间无法正常工作,所以Array.isArray()是更健壮的解决方案。

但是,请确保检查浏览器的兼容性。如果需要支持IE 8或更低版本,则Array.isArray()将无法工作。

哪一种处理时间更快?

根据这个jsperf,instanceof Array比Array.isArray()更快。这是有道理的,因为Array.isArray()执行更强大的检查,因此会稍微降低性能。

刚刚看到这个,并且想指出在某些浏览器中,Array.isArray()现在比instanceof Array快得多。

此外,instanceof Array的语法与instanceof其他类一致。除非你有多个执行上下文,如在浏览器环境中,否则我更推荐使用instanceof Array。

实际上,结果显示instanceof Array实际上是检查属性是否为数组最慢的方法,而Array.isArray()则明显更快。

0
0 Comments

Array.isArray和instanceof Array之间的区别是什么?

1. 这两种方法之间的区别是什么?

isArray是ES5的方法,所以不支持旧版本的浏览器,但它可靠地确定一个对象是否是数组。

instanceof只检查对象的[[Prototype]]链上是否存在Array.prototype。当在不同的框架中检查数组时会失败,因为用于实例的Array构造函数很可能与用于测试的不同。

2. 这两种方法中哪一种是首选的解决方案?

"首选"意味着选择的标准。通常,首选的方法是:

if (Object.prototype.toString.call(obj) == '[object Array]')

这适用于ES3浏览器并且可以在不同框架中工作。如果只考虑ES5浏览器,则isArray可能是可行的。

3. 哪种方法的处理时间更快?

这在很大程度上是无关紧要的,因为这两种方法的处理时间都可以忽略不计。更重要的是选择可靠的方法。可以使用以下代码将Array.isArray方法添加到没有内置该方法的浏览器中:

if (!Array.isArray) {
    Array.isArray = function(obj) {
      return Object.prototype.toString.call(obj) == '[object Array]';
    }
}

三等号===会更可靠吗?

- 不会。Object.prototype.toString始终返回一个字符串,因此==和===的结果是相同的。

请注意,在ES6+中,一个对象可能会给自己设置一个自定义的toStringTag,导致返回"[object Array]",尽管实际上并不是一个数组。我不确定是否可以完全可靠地为Array.isArray编写一个polyfill。

- 当然,上面的代码只是建议在Array.isArray不可用的情况下使用polyfill,这排除了ECMAScript 2015(在ES5和isArray之后的4年引入)以及以后的版本。

“在很大程度上是无关紧要的,因为这两种方法的处理时间都可以忽略不计。”这取决于调用这些方法的次数。在某些情况下,比如游戏中,性能非常重要。

- 如果您关注速度,那么最好完全避免使用isArray,或者至少很少调用它。此外,应该在多个实现之间测试性能,因为性能差异很大。

我可以争辩说,即使在某些情况下==和===是相同的,仍然应该使用后者。我的意思是,我们不会根据它们适合的位置有选择性地选择安全准则。我们应该随时都遵循它们,以防有事情被遗忘,以防我们认为不会发生的情况或任何愚蠢的事情发生。选择性使用良好实践并不是好的做法,它们应该被普遍应用或者根本不使用。

- “必须”吗?我认为在《Which equals operator (== vs ===) should be used in JavaScript comparisons?》上有73个回答,涵盖了十多年时间,这表明这是一个无关紧要的问题。只需一致地使用其中之一,如果需要强类型,则使用Typescript。没有证据表明===比==更“安全”。

Eksapsy开头说:“我可以争辩”,为什么要关注他使用“必须”这个词呢?你的说法“没有证据”,但是...当你在==/===上找到的每一个可找到的资源都谈到==的歧义以及这个操作符在语言中的错误时,你用“证据”是什么意思?难道“受到影响的人们”对你来说不是证据吗?只要说“我不明白”而不是“没有证据表明”,这样看起来不那么不礼貌...

0