Javascript过滤函数polyfill

Javascript过滤函数polyfill,javascript,arrays,Javascript,Arrays,我无法理解,如果(I in t)-第18行被置于以下位置,为什么会对应于行: if(!Array.prototype.filter){ Array.prototype.filter=函数(fun/*,thisArg*/){ "严格使用",; if(this==void 0 | | this==null){ 抛出新的TypeError(); } var t=对象(本); var len=t.length>>>0; 如果(乐趣的类型!=“功能”){ 抛出新的TypeError(); } var-re

我无法理解,如果(I in t)-第18行被置于以下位置,为什么会对应于行

if(!Array.prototype.filter){
Array.prototype.filter=函数(fun/*,thisArg*/){
"严格使用",;
if(this==void 0 | | this==null){
抛出新的TypeError();
}
var t=对象(本);
var len=t.length>>>0;
如果(乐趣的类型!=“功能”){
抛出新的TypeError();
}
var-res=[];
var thisArg=arguments.length>=2?参数[1]:无效0;
对于(变量i=0;i
这是为了避免稀疏数组中尚未定义的元素。参见下面的示例

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]);
}
数组是特殊的JavaScript对象。索引只是数组对象中的属性。每当使用不在数组中的索引扩展数组对象时,
length
属性将在内部进行调整。在这种情况下,数组对象中只有一个已定义名称为
3
的属性。但是我们正在尝试访问从0到3的元素。因此,对于数组对象中尚未存在的所有索引,它返回
未定义的

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

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

这是因为JavaScript数组可能存在间隙

例如,考虑以下内容:

var a = ["hello", "howdy", "welcome"];

delete greetings[1];

"0" in a; // true
"1" in a; // false
"2" in a; // true

IN是一个保留关键字,可用于for和if语句

for (var i = 0; i < array.length; i += 1) {
    if (i in array) {
        console.log(i, array[i]);
    }
}
18行他们正在进行存在检查

请参阅此项。

Array.prototype.myFilter=function(回调){
设newArray=[];
for(设i=0;i
创建自己的
过滤器()
方法

Array.prototype.newFilter=函数(func){
让筛选=[],n=this.length;
对于(设i=0;i项>4);

console.log(result);
非常好的解释,先生。感谢您的精彩解释您好,感谢您的贡献。请在您的代码中添加一些解释,以帮助其他人理解为什么它有效,而问题不起作用!当我们在数组元素上使用for循环时,是否需要检查(i in t)?
3 10
var a = ["hello", "howdy", "welcome"];

delete greetings[1];

"0" in a; // true
"1" in a; // false
"2" in a; // true
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;