2016-07-29 10 views
5

Tôi biết rằng phương pháp forEach sẽ lặp qua một đối tượng mảng và sẽ bỏ qua tất cả các phần tử mảng là null hoặc undefined. Tôi đã một ví dụ dưới đây:Vòng forEach của JavaScript quyết định bỏ qua hoặc lặp qua các phần tử "undefined" và "null" trong một Array như thế nào?

var a = [1,2,3,,5,6]; 
var b = [1,2,3,undefined,5,6]; 

var fn = function(arr){ 
    arr.forEach(function(currentValue, index, array){ 
     console.log(currentValue); 
    }); 
}; 

fn(a); //Prints on console (separated by newline): 1 2 3 5 6 
fn(b); //Prints on console (separated by newline): 1 2 3 undefined 5 6 

Trong ví dụ trên,

  • khi fn(a) được thực thi, các vòng lặp forEach bỏ qua các yếu tố thứ 4 a[3] đó là không xác định.
  • Nhưng khi fn(b) được thực hiện, vòng lặp forEach lặp qua phần tử thứ tư b[3] cũng không được xác định.

Sự khác nhau giữa a[3]b[3] ở đây là gì? Tại sao vòng lặp forEach không bỏ qua b[3]?

+1

có thể trùng lặp của [JavaScript 'trong 'toán tử cho các phần tử \ 'undefined \' trong mảng] (http://stackoverflow.com/questions/22448330/javascript-in-operator-for-undefined-elements-in-arrays) – JJJ

+1

Tiền đề là sai: forEach won không bỏ qua phần tử tại là null hoặc không xác định. Nó bỏ qua các yếu tố không tồn tại chút nào. – JJJ

+0

@JJJ là đúng. Hãy thử '[null,, undefined] .forEach (console.log)'. Nó in 'null', bỏ qua chỉ mục không có giá trị, sau đó in' undefined'. –

Trả lời

1

Theo thông số kỹ thuật của ECMAScript 5.1, thiếu các mục mảng là elided.

Bất cứ khi nào một dấu phẩy trong danh sách phần tử không được đặt trước bởi một AssignmentExpression (tức là dấu phẩy ở đầu hoặc sau dấu phẩy khác), phần tử mảng bị thiếu góp phần vào chiều dài của mảng và tăng chỉ số tiếp theo các yếu tố. Các phần tử mảng được chọn không được xác định.

Vì chúng không được xác định, hành vi không thể đoán trước và không có định nghĩa về việc liệu chúng có được coi là các mục mảng bình thường như undefined hay không. Tôi nghi ngờ rằng trong một số trình duyệt, không xác định được có thể được trả lại, nhưng điều này dường như không phải là trường hợp trong Chrome. Đây là những gì ví dụ đầu tiên của bạn [1, 2, 3,, 5, 6] đánh giá để:

[1, 2, 3, undefined × 1, 5, 6] 

Tuy nhiên, [1, 2, 3, undefined, 5, 6] chỉ đánh giá để:

[1, 2, 3, undefined, 5, 6] 

Như chúng ta có thể thấy, đây là một cách tinh tế khác nhau, vì vậy hành vi này là không giống nhau mặc dù họ trông bề ngoài tương tự.

0

Nếu bạn in các mảng trong giao diện điều khiển, bạn sẽ nhận được:

var a = [1,2,3,,5,6]; 
var b = [1,2,3,undefined,5,6]; 
console.log(a); 
console.log(b); 

điều khiển

>[1, 2, 3, 4: 5, 5: 6] 
    > 
    0:1 
    1:2 
    2:3 
    4:5 
    5:6 
    length:6 


    >[1, 2, 3,undefined, 5,6] 
    > 
    0:1 
    1:2 
    2:3 
    3:undefined 
    4:5 
    5:6 
    length:6 

Vì vậy, không có phần tử trong chỉ số 3.

Các vấn đề liên quan