这个判断在Array.prototype.filter中是否必不可少

时间:2014-09-01 10:43:01

标签: javascript arrays

我发现在developer.mozilla网站上显示的许多方法都有一个不重要的判断。
网址: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter

您可以转发到" Polyfill"部分。

总是存在如下代码的判断:

Array.prototype.filter = function(fun /*, thisArg */)
{
    "use strict";

    if (this === void 0 || this === null)
      throw new TypeError();
    ...
}

不仅有filter方法,还有Array.prototype.every(),Array.prototype.map()。
如:

Array.prototype.map = function (fun /*, thisp */) {
   if (this === void 0 || this === null) { throw TypeError(); 
   ...
}

我不知道在哪种情况下条件的结果将返回true然后抛出一个" TypeError"。
在我看来,这个判断不是必不可少的,应该删除。 你怎么看? 这个判断是为了什么?

2 个答案:

答案 0 :(得分:1)

this指的是数组本身。

void 0返回undefined并且无法覆盖(undefined可以 - 在ES5之前)。

该检查用于确定原型方法是否用于实际存在的事物,即未定义或无效。

如果您查看MDN's最新的polyfill,他们只需使用:

if (this == null) {
   throw new TypeError(" this is null or not defined");
}

因为null == undefinedtrue

答案 1 :(得分:1)

  

我不知道在哪种情况下条件的结果会返回   如果为true,则抛出" TypeError"。

答案:

Array.prototype.filter = function(fun /*, thisArg */){
  console.log('okay',this==null);
}
Array.prototype.filter.call(null);
Array.prototype.filter.call(undefined);