gpt4 book ai didi

Javascript 过滤函数 polyfill

转载 作者:行者123 更新时间:2023-11-29 17:01:18 31 4
gpt4 key购买 nike

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

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;
};
}

最佳答案

是为了避免稀疏数组中还没有定义的元素。看下面的例子,

var array = [];
array[3] = 10;
console.log(array.length);
// 4

因此,数组的长度为 4,但仅定义了索引 3 处的元素,所有其他元素尚未定义。所以,如果你这样做

for (var i = 0; i < array.length; i += 1) {
console.log(i, array[i]);
}

你会得到

0 undefined
1 undefined
2 undefined
3 10

数组是特殊的 JavaScript 对象。索引只是数组对象中的属性。每当您使用不在数组中的索引扩展数组对象时,length 属性将在内部进行调整。在本例中,数组对象中只有一个属性,定义了名称 3。但是我们正在尝试访问从 0 到 3 的元素。因此它为数组对象中尚未存在的所有索引返回 undefined

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

for (var i = 0; i < array.length; i += 1) {
if (i in array) {
console.log(i, array[i]);
}
}

会打印

3 10

关于Javascript 过滤函数 polyfill,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27684465/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com