23

Tôi đang quan tâm đến các toán tử bitwise trong JavaScript và có một điều tôi thấy đáng chú ý.Tại sao (Vô cực | 0) === 0?

bitwise or operator trả về 1 làm bit đầu ra nếu một trong hai bit đầu vào là 1. Vì vậy, làm x | 0 luôn trả x, vì | 0 không có tác dụng:

  • (1 | 0) === 1
  • (0 | 0) === 0

Tuy nhiên, khi tôi tính Infinity | 0, tôi đã 0. Điều này là đáng ngạc nhiên trong quan điểm của tôi, bởi vì ở trên nên nhận được Infinity. Xét cho cùng, (x | 0) === x.

Tôi không thể tìm thấy vị trí trong đặc tả ECMAscript được xác định rõ ràng, vì vậy tôi đã tự hỏi chính xác những gì ngụ ý rằng (Infinity | 0) === 0. Có lẽ là cách Infinity được lưu trữ trong bộ nhớ? Nếu vậy, làm thế nào nó vẫn có thể làm một hoạt động | 0 làm cho nó trở lại 0 trong khi | 0 không nên làm bất cứ điều gì?

+0

Làm cách nào bạn có thể tính toán '(vô cùng | 0)'? Vô cực là ... vô hạn, nó không thể được tính bằng chính định nghĩa của nó ...: | – Albireo

+3

@Albireo - Bởi vì một máy tính phải đại diện cho vô cực bằng cách nào đó, và nó có một số giới hạn các bit để làm điều đó với. – Dylan

+1

Điều này thực sự thú vị, bởi vì 'Infinity' dường như là một giá trị trung thực khi bạn sử dụng nó trong một câu lệnh if-else, giống như câu lệnh mong đợi. Tôi vừa xác nhận điều này: http://jsfiddle.net/LWBVd/. Có lẽ nó đã làm với các đại diện nội bộ của 'Infinity'. – FishBasketGordo

Trả lời

51

Các toán tử bitwise chỉ hoạt động trên các số nguyên.
Infinity là giá trị dấu phẩy động, không phải là số nguyên.

Thông số says rằng tất cả toán hạng của thao tác bit được chuyển thành số nguyên (sử dụng thao tác ToInt32) trước khi thực hiện thao tác.

Các ToInt32 operation nói:

Nếu số là NaN, +0, -0, + ∞ -∞ hoặc trở +0.

2

Làm toán và các hoạt động khác mong muốn số nguyên với NaNInfinity thường là một ý tưởng tồi. Bạn sẽ đặt/xóa một chút từ Infinity như thế nào?

Thực ra, các hoạt động bit-khôn ngoan chỉ được xác định cho số nguyên - và số nguyên không có NaN hoặc Infinity.

+0

Tôi đã nghĩ rằng 'Infinity' sẽ đại diện cho một số lượng vô hạn của' 1' bit sau mỗi khác. – pimvdb

+0

Đó là giống như -1 hơn vô cùng (trong đó đây là cách -1 ứng xử trong các ngôn ngữ như python có số nguyên kích thước tùy ý - javascript chỉ có số nguyên 32 bit.) – Random832

+0

@ Random832: Tôi đoán tôi đã suy nghĩ quá đơn giản. Ý tưởng của tôi là giống như '1' là' 1' và '1111' là' 16', '111 ... 111' sẽ kết thúc với Infinity. – pimvdb

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