2016-03-19 19 views
6

Giải thích lý do tại sao +[] == 0 cung cấp đầu ra 'true' trong Javascript?Giải thích lý do tại sao '+ [] == 0' output 'true' trong Javascript?

Vui lòng kiểm tra ví dụ.

+[] == 0 ? alert(true) : alert(false);

Và cũng kiểm tra. '1+[+[]]' cho sản lượng '10'

+0

có giao diện tại đây: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators – C2486

+0

http://stackoverflow.com/a/5491730/1377002 – Andy

Trả lời

8

Nó sẽ được đánh giá như dưới đây,

1:+[] == 0 ->+"" == 0

hành + là có highest priority hơn == vì vậy nó sẽ được đánh giá Đầu tiên. Vì vậy, trong quá trình chuyển đổi một mảng thành số, hàm ToPrimitive() sẽ được gọi bằng cách chuyển nó thành một đối số. Kể từ [] là một object, nó sẽ trở lại "" chuỗi

2:+"" == 0 ->0 == 0

Chuỗi trống sẽ được chuyển đổi sang 0. Và một chuỗi không trống sẽ được chuyển đổi thành NaN như chúng ta đều biết.

3:0 == 0 ->true

Và cuối cùng theo abstract equality comparison algorithm, khi cả hai toán hạng của cùng loại bị so sánh, không có đánh giá thêm sẽ xảy ra, nó sẽ trực tiếp kiểm tra cho sự bình đẳng của nó và trả lại kết quả.


Và trong trường hợp thứ hai của bạn 1+[+[]], đánh giá sẽ xảy ra như thế nào,

1:1+[+[]] - (+[] sẽ được chuyển đổi sang nguyên thủy đầu tiên kể từ [] nó là một đối tượng)

2:1+[+""] (toPrimitive([]) sẽ "")

3:1+[0] (0 sẽ mang lại khi bạn chuyển đổi một chuỗi rỗng lên vị trí số)

4:1+"0" (toPrimitive([0]) sẽ "0")

5:"10"

5

Javascript đánh giá +[] == 0 theo cách này:

  1. + []: + điều hành cố gắng để chuyển đổi các toán hạng [] đến một giá trị nguyên thủy.
  2. + []: [] được chuyển thành chuỗi bằng phương pháp toString(), là bí danh cho [].join(',').Kết quả là một chuỗi rỗng ''
  3. + '': chuỗi rỗng được chuyển thành một số: Number('') ->0
  4. + 0 trở thành 0
  5. Cuối cùng so sánh được đánh giá: +[] == 0 ->0 == 0 ->true

Đánh giá '1+[+[]]':

  1. 1 + [ +[] ] (transform [] thành một nguyên thủy: '')
  2. 1 + [ + '' ] (transform '' thành một số: 0)
  3. 1 + [ + 0 ] (+ 00)
  4. 1 + [ 0 ] (nhà điều hành bổ sung lực lượng biến đổi của [0] thành một giá trị nguyên thủy : [0].toString() ->[0].join(',') ->'0')
  5. 1 + '0' (Do toán hạng thứ hai '0' là một chuỗi, thay đổi số đầu tiên 1 thành một chuỗi quá: '1')
  6. '1' + '0' (Simple dây nối)
  7. '10'

đọc cũng this article về các nhà điều hành bổ sung.

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