2012-05-21 32 views
23

Tôi đang thực hiện một số thử nghiệm nhỏ dựa trên this blog entry."Không xác định x 1" trong JavaScript là gì?

Tôi đang thực hiện nghiên cứu này trong trình gỡ lỗi của Google Chrome và đây là phần khó khăn.

What the heck is this?!

tôi nhận được sự thật rằng tôi không thể xóa các biến địa phương (kể từ khi họ không được đối tượng thuộc tính). Tôi nhận được rằng tôi có thể 'đọc' tất cả các tham số được chuyển đến một hàm từ mảng được gọi là 'đối số'. Tôi thậm chí có được nó mà tôi không thể xóa và phần tử của mảng, chỉ đạt được để có array[0] có giá trị không xác định.

Ai đó có thể giải thích cho tôi những gì undefined x 1 có nghĩa là trên hình ảnh được nhúng?

Và khi tôi ghi đè lên các chức năng foo để trả lại arguments[0], sau đó tôi nhận được thông thường và 'bình thường' không xác định.

Đây chỉ là một thử nghiệm, nhưng có vẻ như đang tạm dừng, không ai biết undefined x 1 là gì?

+1

Về mặt kỹ thuật, bạn đang phải đối phó với một 'Array' nhưng với một giống như đối tượng 'mảng'. – alex

+1

Xin lưu ý rằng 'đối số' không phải là một mảng, mà là đối tượng' Đối số' (mặc dù nó có vẻ và hoạt động tương tự). Ngoài ra, việc xóa các mục khỏi một mảng không được thực hiện với toán tử 'delete'. – Bergi

+0

@alex: Vâng, tôi biết điều đó, đó là lý do tại sao tôi có thể xóa nhưng chỉ tham chiếu đến giá trị, đúng không? Nếu không chiều dài của mảng sẽ ngắn hơn với một. – benqus

Trả lời

37

Đó dường như là cách mới của Chrome hiển thị chỉ số chưa được khởi tạo trong mảng (và mảng giống như đối tượng):

> Array(100) 
[undefined × 100] 

Mà chắc chắn là tốt hơn so với in [undefined, undefined, undefined,...] hay tuy nhiên nó đã được trước đó.

Mặc dù, nếu chỉ có một giá trị undefined, họ có thể thả số x 1.

+1

Ồ, tôi mặc dù tôi đã đặt tay sâu vào một số shit tôi không nên có ... = D Ok, thanx mate , 1, được chấp nhận! = D – benqus

+5

Đẹp nhất. Dường như chỉ hoạt động cho * ngầm định * 'undefined's, ví dụ: 'new Array (100)' gọi nó nhưng '[undefined, undefined]' không – alex

+2

@alex: Yeah, trong trường hợp này các chỉ mục '0' và' 1' thực sự tồn tại trong mảng. Thay đổi từ ngữ của câu trả lời của tôi một chút. –

-1

Điều đó cũng xảy ra với tôi. Mở cùng một thứ trong một trình duyệt khác và xuất/ghi mảng đó vào bàn điều khiển. Miễn là nó hoạt động trong cả crome và firefox theo cùng một cách (như trong việc truy cập các phần tử hoạt động tốt ngay cả khi đầu ra có undefinedx1), tôi xem xét một số loại lỗi trong Chrome không làm mới nội dung nào đó trong nội bộ. Bạn thực sự có thể kiểm tra theo cách này:

  1. Tôi đã thêm các phần tử vào một mảng và kích hoạt console.log() để đăng nhập phần tử, để kiểm tra xem nó có được xác định hay không. Tất cả chúng đều được định nghĩa.
  2. Sau khi đẩy() Tôi đã đăng nhập mảng và dường như khi điều này xảy ra, nó luôn là lần cuối cùng không được xác định x 1 trên Chrome.
  3. Sau đó, tôi đã thử đăng nhập nhiều lần hơn và sau đó, nhưng với cùng một kết quả.
  4. Tuy nhiên khi tôi truy cập (vì lợi ích của đầu ra), phần tử theo chỉ mục của nó, nó trả về giá trị thích hợp (vui).
  5. Sau đó, tôi đã đăng nhập lại mảng và nó cho biết chỉ mục cuối cùng là không xác định x 1 (chính cái tôi vừa mới truy cập trực tiếp với thành công!).
  6. Sau đó, tôi đã thực hiện một vòng lặp for trên mảng, ghi nhật ký hoặc sử dụng từng phần tử, tất cả đều hiển thị tốt.
  7. Sau đó, một nhật ký khác trên mảng, vẫn còn lỗi.

    Mã tôi đang sử dụng đầu tiên có kiểm tra không xác định và chúng không kích hoạt, nhưng tôi đã thấy tất cả các undefined này trong bảng điều khiển và nó đã làm tôi khó chịu (không có ý định chơi chữ).

Cũng đáng đọc: Unitialized variables in an array when using only Array.push? Tôi đang sử dụng pop() quá trong mã của tôi và đó là một lời giải thích hợp lý rằng các console log thực sự đại diện cho một nhà nước khác nhau trong thời gian (khi mã là 'dừng lại').

2

Google Chrome dường như chọn hiển thị sparse array sử dụng ký hiệu undefined x n này. Nó sẽ hiển thị [undefined, undefined] nếu nó không phải là một mảng thưa thớt:

var arr = new Array(2); 
console.log(arr); 

var arr2 = []; 
arr2[3] = 123; 
console.log(arr2); 

var arr3 = [,,,]; 
console.log(arr3) 

var arr4 = [,]; 
console.log(arr4) 

var arr5 = [undefined, undefined] 
console.log(arr5) 

var arr6 = [undefined] 
console.log(arr6) 

arr1 để arr4 là tất cả các mảng thưa thớt, trong khi arr5 và arr6 thì không. Chrome sẽ hiển thị chúng dưới dạng:

[undefined × 2] 
[undefined × 3, 123] 
[undefined × 3] 
[undefined × 1] 
[undefined, undefined] 
[undefined] 

lưu ý [undefined x 1] cho mảng thưa thớt.

Kể từ khi bạn đã xóa một phần tử, nó sau đó: If you delete an element from an array, the array becomes sparse.

1

Đây là cách hiển thị, Gõ mã này vào Chrome DevTools console: -

arr = new Array(4); 
arr[2] = "adf"; 
console.log(arr); // [undefined × 2, "adf", undefined × 1] 

Xem người đầu tiên hai liên tiếp "không xác định" rằng được đại diện bởi * 2, để cho thấy rằng có hai liên tiếp không xác định có

0

Phiên bản mới hơn của việc sử dụng Chrome empty × thay vì undefined × để làm cho sự khác biệt rõ ràng hơn một chút.

Ví dụ, nhập [, undefined] trong các kết quả DevTools console trong:

▶(2) [empty × 1, undefined] 

và kiểm tra các phím trong:

▼(2) [empty × 1, undefined] 
    1: undefined 
    length: 2 
    ▶__proto__: Array(0) 
Các vấn đề liên quan