为什么这个 if 语句在 for 循环中创建一个未定义的值?

Why this if statement creates an undefined value inside a for loop?

我创建了这个 for 循环来收集 <ul> 中的所有图像。我想一方面收集肖像图像,另一方面收集风景图像,显然它有效...

for ( var i = 0; i < imgArray.length; i += 1 ) {
    var images = [ imgArray ]; // Creates an array with all the images.

//Figure out which images are in landscape and in portrait.

    if ( imgArray[i].height < imgArray[i].width ) {
        var landscapeImg = [ imgArray[i] ]; // Stores landscape images.
    } else if ( imgArray[i].height > imgArray[i].width ) {
        var portraitImg = [ imgArray[i] ]; // Stores portrait images.
    };

...但是当我登录控制台时 var landscapeImgportraitImg 会发生这种情况。

[Log] [ (app.js, line 24)
<img src=​"img/​1.jpg" alt=​"Imagen 1">​
]
[Log] undefined (app.js, line 25)
[Log] [ (app.js, line 24)
<img src=​"img/​1.jpg" alt=​"Imagen 1">​
]
[Log] [ (app.js, line 25)
<img src=​"img/​2.jpg" alt=​"Imagen 2">​
]
[Log] [ (app.js, line 24)
<img src=​"img/​3.jpg" alt=​"Imagen 3">​
]
[Log] [ (app.js, line 25)
<img src=​"img/​2.jpg" alt=​"Imagen 2">​
]
[Log] [ (app.js, line 24)
<img src=​"img/​4.jpg" alt=​"Imagen 4">​
]
[Log] [ (app.js, line 25)
<img src=​"img/​2.jpg" alt=​"Imagen 2">​
]
[Log] [ (app.js, line 24)
<img src=​"img/​5.jpg" alt=​"Imagen 5">​
]
[Log] [ (app.js, line 25)
<img src=​"img/​2.jpg" alt=​"Imagen 2">​
]

为什么我得到一个未定义的值?为什么循环再次遍历图像 1?

提前致谢:)

因为第一个 运行 只有 ifelse-if 中的代码会 运行,两个部分不能 运行 一个迭代。这留下了一个尚未定义的变量。例如:

if ( true ) {
    var landscapeImg = [ imgArray[i] ]; // Stores landscape images.
} else if ( false ) {
    var portraitImg = [ imgArray[i] ]; // Stores portrait images.
};

console.log(portraitImg) // logs undefined
console.log(landscapeImg) // logs some defined value

首先,一个命名技巧。它有助于使用一致且有意义的名称。我喜欢分别为数组和单个项目使用复数和单数名称:images 是图像数组的好名称,image 是单个图像的好名称。 landscapeImg 不是 一组风景图像的好名字,因为它听起来像是单个图像的名称。 imgArray 是一组图像的好名字,但如果你有很多数组,一遍又一遍地重复 Array 部分会变得乏味。我的建议是使用复数名称,如 images 以简洁明了。

所以我将在下面的示例中稍微调整名称并假设输入数组称为 images。如果它已经是一个数组,我们就不需要用同样的东西创建另一个数组。此外,我们需要处理方形图像,除非您想将它们归为肖像或风景。

另一个提示:与其在代码中重复多次 imgArray[i](或者在下面的代码中重复 images[i]),不如将其分配给一个简单的变量,从而使代码更短更清晰。

最后,您要做的是在循环之前 创建每个数组,然后将项目推入循环内的适当数组。所以它可能看起来像这样:

var squares = [], landscapes = [], portraits = [];

for( var i = 0;  i < images.length;  i++ ) {
    var image = images[i];
    if( image.height < image.width ) {
        landscapes.push( image );
    } else if( image.height > image.width ) {
        portraits.push( image );
    } else {
        squares.push( image );
    }
}