2016-04-05 11 views
142

Tôi nhận thấy hôm nay rằng Chrome 49 không còn xuất kết quả là NaN khi bạn nhập {}+{} vào bảng điều khiển. Thay vào đó, nó xuất ra chuỗi [object Object][object Object].Tại sao {} + {} không còn NaN trong bảng điều khiển của Chrome?

Tại sao điều này? Ngôn ngữ có thay đổi không?

+0

Hãy thử '{} + {} + 1' và bạn sẽ thấy' NaN' lần nữa, trong khi '({} + {}) + 1' sản lượng' "[đối tượng Object] [đối tượng] 1" ' . – Hypaethral

+13

có vẻ như chrome hiện xử lý thao tác này dưới dạng chuỗi ký tự thay vì thêm. TẠI SAO đó là, tôi không biết, đó là lý do tại sao đây là một bình luận không phải là một câu trả lời :) thử 'var e = {}; e.toString() 'và bạn sẽ thấy ý tôi là gì – sgroves

+0

đó là tất cả về loại cưỡng chế (trong trường hợp cực đoan) .... BTW type' + {} 'vẫn trả về NaN – maioman

Trả lời

148

Trình khám phá Chrome giờ đây tự động bao bọc mọi thứ bắt đầu bằng { và kết thúc bằng } trong cặp dấu ngoặc đơn ẩn (see code), để bắt buộc đánh giá dưới dạng biểu thức. Bằng cách đó, {} sẽ tạo một đối tượng trống ngay bây giờ. Bạn có thể thấy điều này nếu bạn quay lại lịch sử (), dòng trước đó sẽ được chứa trong (…).

Tại sao? Tôi không biết, nhưng Tôi có thể đoán nó làm giảm sự nhầm lẫn cho người mới mà không biết về điều block-vs-object-literal, và nó cũng hữu ích hơn nếu bạn chỉ muốn đánh giá một biểu thức.

Và thực tế đó là lý do, như được thảo luận trong bug 499864. Tinh khiết tiện lợi. Và bởi vì node REPL had it cũng vậy (see code).

+178

Stupid Chrome, '{a: 1}), ({b: 2}' sẽ ném một lỗi, không tạo ra một đối tượng. – Oriol

+28

Đó là những gì sẽ xảy ra khi bạn phân tích các cấu trúc lồng nhau tùy ý với regex https://stackoverflow.com/ Câu hỏi/1732348/regex-match-open-tags-ngoại trừ-xhtml-self-khép-tags –

+3

Tìm kiếm tốt với báo cáo lỗi và mẫu mã! –

43

Nếu bạn nhấn mũi tên lên sau khi kiểm tra điều này, bạn sẽ nhận thấy rằng thay vì {} + {}, nó hiển thị ({} + {}), kết quả là "[object Object][object Object]".

Để so sánh, trong Firefox, {} + {} vẫn hiển thị NaN, nhưng nếu bạn làm ({} + {}) thì cũng hiển thị "[object Object][object Object]".

Vì vậy, có vẻ như Chrome tự động thêm dấu ngoặc đơn xung quanh khi thấy hoạt động này.

+22

câu trả lời này là chính xác. nhưng wow, người đàn ông, tôi không chắc chắn tôi thích rằng chrome làm điều đó. google xấu. – sgroves

+1

@sgroves Tôi muốn được quan tâm để xem nếu điều này là như nhau trong Canary, và nếu nó đã được thực hiện trên mục đích hoặc thực sự là một lỗi. –

+8

'{} + {}' khi không được "khử trùng" thành '({} + {})' được coi là '+ {}' vì '{}' được phân tách thành một khối trống. –

4

Tính đến Chrome 54 liên quan đến giao diện điều khiển:

-"I converted that block to an Object for you" -Clippy Thật không may, tôi đã thêm các Clippy trích dẫn bản thân mình. Bảng điều khiển không cung cấp thông tin về những gì nó đã làm cho bạn.

Các quy định mới là vô cùng đơn giản tiết kiệm chúng tôi những rắc rối của chăm gõ những 2 charcters khó o= hoặc 0, trước khi dán Literals Object vào giao diện điều khiển:

  • Nếu bạn có mã bắt đầu với: không bắt buộc khoảng trắng, (không cho phép nhận xét), theo sau là {;
  • và mã đó có thể được hiểu là một đối tượng;
  • và đối tượng mà được theo sau bởi không có mã số khác, trừ trường hợp:
  • mã sau khi đối tượng đầu tiên là một nhà điều hành nhị phân,
  • sau đó có thể có nhiều hoạt động như bạn muốn bao gồm các nhóm
  • cung cấp thức toán tử có một đối tượng theo nghĩa đen ở vị trí bên phải;
  • và Object thức chưa được nhóm lại trong dấu ngoặc
  • và mã mà không được kết thúc bằng một dấu chấm phẩy
  • và không có ý kiến ​​như sau mã (bình luận nội bộ được phép miễn là họ không nằm trong ban đầu hoặc vị trí cuối cùng)
  • và sau đó chỉ khi đó JavaScript của bạn (có thể hoặc không thực sự là mã hợp lệ) sẽ được tái xuất hiện làm Đối tượng hợp lệ. Bạn sẽ không được thông báo rằng mã của bạn đã được giải thích lại.

{wat:1}),({wat:2} Cuối cùng lại là lỗi.

{let i=0;var increment=_=>i++} được cho phép chính xác, cuối cùng, đây là cách khá tốt để thực hiện đóng cửa.

Tuy nhiên, sau đây là không chính xác một đối tượng, đây chỉ là một sự tiện lợi như đã đề cập bởi @Bergi, nó diễn giải JS sai để giúp bạn! Thông số kỹ thuật nói rằng đó là một khối có một câu lệnh có nhãn "foo" với chữ cái 1 không được gán cho bất kỳ thứ gì.

{foo:1} 

Trên đây nên được giống như

if(1) { 
    foo: 1 
} 

Sau đây được xử lý một cách chính xác như một khối ... bởi vì nó có một bình luận ở phía trước của nó!

//magic comment 
{foo:1} 

Vì vậy, là thế này:

{foo:1} 
//also magic 

Đây là một đối tượng:

{foo: 
//not so magic comment 
1} 

Đây là một lỗi

//not so magic comment 
{foo:1}.foo 

Vì vậy, là thế này:

{foo:1}.foo 

Điều này là tốt:

1..wat 

undefined

nên là thế này:

['foo'][0] 

Người tiếp theo được giải thích một cách chính xác như một đối tượng đánh mạnh vào vị trí biểu hiện với một 0, mà nói chung là cách chúng ta bảo đảm một cách rõ ràng chúng ta có một biểu thức thay vì một tuyên bố.

0,{foo:1}.foo 

Tôi không hiểu tại sao chúng bao bọc giá trị theo tỷ lệ. JS có một số quyết định thiết kế vô lý, nhưng cố gắng làm cho nó hoạt động tốt hơn trong tình huống này không thực sự là một lựa chọn, giao diện điều khiển cần chạy JS một cách chính xác, và chúng ta cần phải tự tin rằng chrome không chỉ đoán rằng nó nghĩ rằng chúng ta thực sự có nghĩa là nó làm điều gì đó khác.

Nếu bạn không thích các nhà khai thác dấu phẩy bạn có thể sử dụng phân

x = {foo:1}.foo 

Bởi vì như nó đứng

{} + {} + {} 

"[object Object][object Object][object Object]"

;{} + {} + {} 

"NaN[object Object]"

Điên và nhất quán tôi có thể đối phó với ... điên rồ và mâu thuẫn không cảm ơn bạn!

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