2012-06-17 21 views
7

Tôi không chắc chắn những gì đang xảy ra trong dòng này của javascript:Tham chiếu mảng thành chuỗi rỗng + đúng là ký tự hợp lệ trong JavaScript như thế nào?

alert((''+[][[]])[!+[]+!+[]]); // shows "d" 

Những gì tôi đã tìm ra:

var a = ! + []; // == true 
var b = ! + [] + ! + []; // == 2 

Dường như phần thứ hai là một tham chiếu vào một loạt các chữ hoặc một số loại, nhưng tôi không hiểu làm thế nào mà đến từ

(''+[][[]]) 

Ngoài ra:

alert((''+[][])[2]); // nothing happens; console says "unexpected token ]" 
alert((''+[[]][])[2]); // nothing happens; console says "unexpected token ]" 
alert((''+[[]][[]])[2]); // shows "d" 
alert((""+true)[2]); // shows "u" 
+0

Bây giờ đó là một câu hỏi thực sự ... – gdoron

+2

Xem thêm: https: //www.destroyallsoftware. com/talks/wat – Hamish

+0

Cũng quan tâm: http://utf-8.jp/public/jjencode.html – josh3736

Trả lời

4

tôi sẽ phân hủy nó cho bạn:

('' + [][[]])[!+[]+!+[]] 
= ('' + undefined)[!+[]+!+[]] // [][[]] grabs the []th index of an empty array. 
= 'undefined'[! + [] + ! + []] 
= 'undefined'[(! + []) + (! + [])] 
= 'undefined'[true + true] 
= 'undefined'[2] 
= 'd' 

! + [] == true được giải thích ở đây What's the significant use of unary plus and minus operators?

2

"" + true là chuỗi "true" và ký tự thứ ba (chỉ số 2) là u.

Những thứ như ! + [] hoạt động vì + cũng có thể là toán tử đơn nhất, xem this SO question.

+3

và 'd' là char thứ 3 của' undefined'. –

0
alert((""+true)[2]); // shows "u" 

Thư trả về chữ cái thứ 3 của chuỗi "true".

Trả lại hàng này là gì?

alert((''+[[]][[]])); 
Các vấn đề liên quan