首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Javascript过滤函数polyfill

Javascript过滤函数polyfill
EN

Stack Overflow用户
提问于 2014-12-29 14:37:46
回答 5查看 3.2K关注 0票数 2

我不能理解为什么在filter function polyfill中放置对应于第18行的if (i in t) -行的检查:

代码语言:javascript
复制
if (!Array.prototype.filter) {
  Array.prototype.filter = function(fun/*, thisArg*/) {
    'use strict';

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

    var t = Object(this);
    var len = t.length >>> 0;
    if (typeof fun !== 'function') {
      throw new TypeError();
    }

    var res = [];
    var thisArg = arguments.length >= 2 ? arguments[1] : void 0;
    for (var i = 0; i < len; i++) {
      if (i in t) {
        var val = t[i];

        // NOTE: Technically this should Object.defineProperty at
        //       the next index, as push can be affected by
        //       properties on Object.prototype and Array.prototype.
        //       But that method's new, and collisions should be
        //       rare, so use the more-compatible alternative.
        if (fun.call(thisArg, val, i, t)) {
          res.push(val);
        }
      }
    }

    return res;
  };
}
EN

回答 5

Stack Overflow用户

发布于 2014-12-29 14:41:47

它是为了避免在稀疏数组中还没有定义的元素。请参见以下示例:

代码语言:javascript
复制
var array = [];
array[3] = 10;
console.log(array.length);
// 4

因此,数组的长度是4,但是只定义了索引3处的元素,其他所有元素都还没有定义。所以,如果你这样做了

代码语言:javascript
复制
for (var i = 0; i < array.length; i += 1) {
    console.log(i, array[i]);
}

你会得到

代码语言:javascript
复制
0 undefined
1 undefined
2 undefined
3 10

数组是特殊的JavaScript对象。索引只是数组对象中的属性。每当使用不在数组中的索引扩展数组对象时,length属性都会在内部进行调整。在本例中,数组对象中只有一个属性,其名称定义为3。但是我们正在尝试访问从0到3的元素,所以对于数组对象中还没有出现的所有索引,它都会返回undefined

为了避免这种情况,我们使用if语句检查当前索引是否真的是在数组对象中定义的。

代码语言:javascript
复制
for (var i = 0; i < array.length; i += 1) {
    if (i in array) {
        console.log(i, array[i]);
    }
}

将打印

代码语言:javascript
复制
3 10
票数 5
EN

Stack Overflow用户

发布于 2014-12-29 14:45:21

这是因为JavaScript数组可能会有间隙。

例如,考虑以下内容:

代码语言:javascript
复制
var a = ["hello", "howdy", "welcome"];

delete greetings[1];

"0" in a; // true
"1" in a; // false
"2" in a; // true
票数 1
EN

Stack Overflow用户

发布于 2019-08-21 20:29:24

代码语言:javascript
复制
Array.prototype.myFilter = function(callBack) {
 let newArray = [];
 for (let i = 0; i < this.length; i++) {
  let result = callBack(this[i], i, this);
    if (result) {
     newArray.push(this[i]);
    }
}
return newArray;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27684465

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档