2016-12-13 16 views
27

Nếu bạn mở giao diện điều khiển JS và nhập [] + {} === {} + [] nó sẽ cho bạn biết đó là sự thật.Tại sao [] + {} === {} + [] đúng?

Tôi không hiểu tại sao lại như vậy. Tôi đã cố gắng tìm hiểu cách phân tích cú pháp.

Đối với [] + {}, đây là toán tử bổ sung làm toán hạng là cả hai chữ. LHS không mang lại một số thông qua .valueOf() để nó thực hiện nối chuỗi sử dụng .toString() trên cả hai toán hạng cho chúng tôi "" + "[object Object]"

Đối {} + [] các {} là một khối mã rỗng và được 'bỏ qua', các nhà điều hành + đây được phân tích như toán tử cộng đơn, nó chuyển đổi toán hạng thành Số. Các mảng trống được chuyển đổi thành một số trở thành 0

Vì vậy, đây có vẻ là "[object Object]" === 0 mà chắc chắn phải là sai ?.

Toán tử danh tính sẽ kiểm tra xem hai toán hạng có bằng nhau không có chuyển đổi loại hay không. Tôi không thể thấy điều này bao giờ là sự thật. Tôi đang thiếu một phần câu chuyện nào?

Edit:

tôi thấy nếu bạn gõ ({} + []) nó phân tích nó như là một đối tượng có sản phẩm nào làm cho RHS bằng "[đối tượng Object]". Tôi nhìn nó lên và () là toán tử nhóm. Vì vậy, có lẽ điều này có cái gì để làm với điều này?

Đây không phải là bản sao của What is the explanation for these bizarre JavaScript behaviours mentioned in the 'Wat' talk for CodeMash 2012?. Trả lời các điểm bullet 1 === 2 KHÔNG nên đúng.

+5

http://stackoverflow.com/questions/9032856/what-is-the-explanation-for-these-bizarre-javascript-behaviours-mentioned-in-the Và http://stackoverflow.com/questions/36438034/Tại sao-là-không-nan-in-chrome-giao diện điều khiển – epascarello

+0

Rỗng đối tượng tham số trả về một constructor đối tượng cũng == 'true' và một mảng trống cũng là một đối tượng constructor trả về true – Dennisrec

+10

' {} 'không thể có thể được hiểu là một khối trống, vì nó xuất hiện ngay sau khi '===' (và '[] + {} ===' không phải là một câu lệnh hợp lệ trong chính nó). – Frxstrem

Trả lời

38

Điểm thứ hai in this magnificent answer giải thích điều gì sẽ xảy ra khi bạn "thêm cùng" một mảng và một đối tượng.

var result = [] + {}; 
 

 
console.log(result); 
 
console.log(typeof result);

Những gì bạn nhận được là chuỗi[object Object] vì mỗi người trong số các đối số được chuyển thành một chuỗi. Đối với một mảng, kết quả là gọi .join() trên nó, do đó, dẫn đến một chuỗi rỗng. Đối với các đối tượng, nó tạo ra chuỗi "[object Object]" - thêm chúng lại với nhau để lại chuỗi thứ hai.

Điều tương tự xảy ra ở cả hai bên của so sánh - ở phía bên tay phải, thứ tự khác nhau nhưng điều đó không quan trọng.Kết quả sẽ không phải là giống như điểm 3 trong câu trả lời, cho sự khác biệt là ở đó {} + [] là ở đầu dòng, vì vậy {} được hiểu là một khối trống. Trong tình huống này, nó sẽ (chính xác) được hiểu là một ký hiệu đối tượng đơn giản). Logic đúc tương tự sẽ được thực hiện và nó sẽ tạo ra cùng một chuỗi như trước: "[object Object]"

Vì vậy, cuối cùng, bạn đang so sánh "[object Object]" === "[object Object]" trả về true.

Lưu ý rằng {} + [] === [] + {} sẽ không sản xuất giống nhau - một lần nữa, tùy theo quan điểm 3 của câu trả lời liên quan - các {} đầu tiên sẽ được hiểu là một khối trống rỗng, vì vậy phía bên tay trái trở nên +[] mà chuyển đổi của mảng với số, do đó kết quả của so sánh sẽ là false. Tuy nhiên nếu bạn kiểm tra biểu thức này trong các công cụ dành cho nhà phát triển Chrome, bạn thực sự sẽ nhận được true. Điều này là do Chrome will auto-wrap your expression in parentheses buộc các {} ban đầu được hiểu là một đối tượng. Kiểm tra {} + [] === [] + {} trong Firefox hoặc Node REPL hoặc những người khác sẽ tạo ra "đúng" false.

5

var array = ['test1', 'test2', 'test3'] 
 
    var emptyObject = {} 
 

 
    console.log(typeof(array+emptyObject)); 
 
    console.log(array+emptyObject); 
 
    console.log(emptyObject+array); 
 
    console.log(array+emptyObject === emptyObject+array); 
 

 
    var array = []; 
 
    var emptyObject = {} 
 

 
    console.log(typeof(array+emptyObject)); 
 
    console.log(array+emptyObject); 
 
    console.log(emptyObject+array); 
 
    console.log(array+emptyObject === emptyObject+array); 
 

 
    var array = ['firstArrayElement', 'secondArrayElement']; 
 
    var object = {a:1, b:2} 
 
    
 
    console.log(typeof(array+object)); 
 
    console.log(array+object); 
 
    console.log(object+array); 
 
    console.log(array+object === object+array); 
 

 
    console.log(['a','b']+['c','d']);

Khi bạn chuyển đổi một mảng trống để chuỗi bạn sẽ nhận được chuỗi rỗng.

Khi bạn chuyển đổi một đối tượng ({}) thành chuỗi, bạn sẽ luôn nhận được chuỗi: "[đối tượng đối tượng]".

Toán tử cộng không được xác định cho mảng và đối tượng vì vậy JS luôn chuyển đổi mảng và đối tượng thành chuỗi khi bạn sử dụng toán tử cộng.

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