2010-11-16 40 views
10

thể trùng lặp:
Is Chrome's JavaScript console lazy about evaluating arrays?hành vi console.log Bizarre trong Công cụ nhà phát triển Chrome

Mở Công cụ nhà phát triển Chrome và gõ vào:

var a = [];console.log(a);a.push(1);console.log(a);

Bạn sẽ mong đợi điều này để xuất ra một cái gì đó như

[] 
[1] 

Nhưng thay vào đó nó ra

[1] 
[1] 

Các hành vi là như nhau cho

var a = [];console.log(a);a[0] = 1;console.log(a);

bất cứ ai có thể giải thích hành vi này?

Chạy Chrome trên hành vi Cùng OS X. trên 32bit Windows 7.

EDIT: Hành vi này là như nhau bất kể việc các báo cáo là trên cùng một dòng hay không. Tôi chỉ đơn giản cung cấp cho họ trên một dòng để dễ dàng kiểm tra.

Đưa

var a = []; 
console.log(a); 
a.push(1); 
console.log(a); 

trong một file sau đó chạy nó mang lại những hành vi tương tự.

CHỈNH SỬA x 2 Xem: http://jsfiddle.net/9N4A6/ nếu bạn không muốn tạo tệp để kiểm tra.

+1

tôi đoán là các cuộc gọi cho 'console. log (a) 'xếp hàng đối tượng mảng để in, nhưng việc chuyển đổi mảng thành chuỗi chỉ xảy ra sau khi toàn bộ dòng được thực hiện. – Pointy

+0

@CMS: Không thấy điều đó - cảm ơn –

+0

Bạn được chào đón @Jamie :) – CMS

Trả lời

4

Hãy thử điều này thay vì:

var a = []; console.log(a.toString()); a.push(1); console.log(a.toString()); 

Nó không phải là thứ tự của đánh giá là kỳ lạ, tôi đặt cược, nhưng đó việc chuyển đổi của các đối tượng mẫu in xảy ra sau khi các báo cáo đều được thực hiện, tại thời điểm khi Chrome đã sẵn sàng để đăng xuất nhật ký.

+0

Vâng, 'var a = []; console.log (a [0]); a [0] = 1; console.log (a [0]); ' hoạt động như mong đợi, vì vậy đôi khi console.log không thực thi tất cả các câu lệnh trước khi in. –

+1

@maarons, thực sự được mong đợi ngay cả khi in bị trễ .... nó sẽ gửi giá trị 1 đến console.log(), đó là những gì được lưu trữ sau đó được hiển thị. – rob

3

Hành vi tương tự ở đây với Win7 trên máy x64. Tôi đoán là phương pháp đăng nhập giữ một tham chiếu đến a và xếp hàng các cuộc gọi xảy ra trong một dòng.

CHỈNH SỬA Đó không phải là sự cố Chrome/ium, tôi đã chứng kiến ​​điều tương tự với Firebug. Như tôi đã nói, việc ghi nhật ký bảng điều khiển phải được xếp hàng đợi theo một số cách.

+0

Hành vi tương tự xảy ra khi chúng không nằm trên một dòng. Tôi chỉ làm điều đó trên một dòng để giúp mọi người dễ dàng dán và thử nghiệm hơn. –

+0

Không, không thể xác nhận sự cố khi sử dụng nhiều câu lệnh. Làm việc như nó được cho là. Tôi nên thêm rằng tôi đang sử dụng các bản dựng Chromium. – aefxx

+0

Mở bảng điều khiển tại đây: http://jsfiddle.net/9N4A6/ –

1

Nó cũng có trên các đối tượng không .... và nếu bạn thay đổi giá trị sau (nói, nhiều giây sau) và sau đó mở rộng đối tượng trong bảng điều khiển, giá trị mới sẽ ở đó. Lạ lùng, nhưng có thể hữu ích theo nghĩa nào đó.

Nếu bạn muốn giá trị hiện tại, chỉ cần nói "console.log (a.toString());" hoặc tương tự.

2

Ít nhất với mảng, bạn có thể sao chép các mảng cho mỗi cuộc gọi đăng nhập:

var a = [];console.log([].concat(a));a.push(1);console.log([].concat(a)); 

Đối với các đối tượng, tôi khuyên bạn nên JSON:

var a = {};console.log(JSON.stringify(a));a[0]=1;console.log(JSON.stringify(a)); 
2

gì được "đăng nhập" là đối tượng "một "... không phải là biểu diễn văn bản thuần túy của" a ". Màn hình hiển thị nhật ký đủ thông minh để hiển thị một trình giữ chỗ cho đối tượng "a", được điền vào/điền "sau" (có vẻ như ở cuối lời gọi sự kiện). Nếu bạn dính vào một tuyên bố alert() trong bạn sẽ thấy giá trị mà bạn mong đợi (giá trị ghi nhận được "điền vào"):

var a = []; 
console.log(a); 
alert('force console to display correctly'); 
a.push(1); 
console.log(a); 

Điều này có vẻ giống như một lỗi trong Chrome với tôi (kinda ngốc nghếch phải đặt một thông báo cảnh báo để xem thông tin đăng nhập chính xác).

(lưu ý câu hỏi này cho thấy ở phía trên cùng của một tìm kiếm google cho "chrome console.log chỉ cho thấy giá trị hiện tại" vì vậy tôi nghĩ rằng tôi muốn thêm câu trả lời của tôi)

+0

Đây không phải là vấn đề về Chrome - đó là vấn đề về Webkit. Lỗi tương tự sẽ xảy ra trong Safari. –

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