使用Array.isArray和instanceof Array的区别
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()则明显更快。
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开头说:“我可以争辩”,为什么要关注他使用“必须”这个词呢?你的说法“没有证据”,但是...当你在==
/===
上找到的每一个可找到的资源都谈到==
的歧义以及这个操作符在语言中的错误时,你用“证据”是什么意思?难道“受到影响的人们”对你来说不是证据吗?只要说“我不明白”而不是“没有证据表明”,这样看起来不那么不礼貌...