2012-10-12 18 views
29

tôi thấy đoạn mã sau vào một dự án JS:Toán tử | = làm gì trong JavaScript?

var a = new Array(); 
a[0] = 0; 
for (var b = 0; b < 10; b++) { 
    a[0] |= b; 
} 

nào |= làm gì trong cơ thể của vòng lặp for?

Ví dụ mã không rõ ràng, nhưng đã được trình bày here bởi V8 để biết ví dụ về hiệu suất được cải thiện.

Cập nhật Ví dụ

Ví dụ trên là tương đương với var a = [15]; đối với hầu hết các tính năng. Một ví dụ thực tế hơn cho các nhà điều hành |= sẽ được thiết lập cờ nhị phân trong một biến duy nhất, ví dụ về một đối tượng cho phép:

//Set up permission masks 
var PERMISSION_1_MASK = parseInt('0001',2); 
var PERMISSION_2_MASK = parseInt('0010',2); 
.. 

//Set up permissions 
userPermissions = 0; 
userPermissions |= hasPermissionOne && PERMISSION_1_MASK; 
userPermissions |= hasPermissionTwo && PERMISSION_2_MASK; 
.. 

//Use permissions 
if(userPermissions & PERMISSION_1_MASK){ 
    ..//Do stuff only allowed by permission 1 
} 
+0

Tôi chỉ nhận ra rằng mã đó là từ đây. http://www.html5rocks.com/en/tutorials/speed/v8/ – razpeitia

+2

@razpeitia đọc câu hỏi và bạn sẽ tìm thấy URL đó ... – ContentiousMaximus

Trả lời

70
a[0] |= b 

về cơ bản là

a[0] = a[0] | b 

"|" là một or bitwise operator (bằng cách này:.. Các tài liệu MDN đang thực sự tốt bằng văn bản và thực sự rõ ràng Nếu OP đang muốn viết và hiểu JS, sau đó các tài liệu MDN là một nguồn lực lớn)

Cập nhật Khi a[0] được gán 0, a[0] trong nhị phân là 0000.Trong vòng lặp,

  1. b = 0

    a[0] = 0 (base 10) = 0000 (base 2) 
    b = 0 (base 10) = 0000 (base 2) 
            --------------- 
    a[0] | b   = 0000 (base 2) = 0 (base 10) 
    
  2. b = 1

    a[0] = 0 (base 10) = 0000 (base 2) 
    b = 1 (base 10) = 0001 (base 2) 
            --------------- 
    a[0] | b   = 0001 (base 2) = 1 (base 10) 
    
  3. b = 2

    a[0] = 1 (base 10) = 0001 (base 2) 
    b = 2 (base 10) = 0010 (base 2) 
            --------------- 
    a[0] | b   = 0011 (base 2) = 3 (base 10) 
    
  4. b = 3

    a[0] = 3 (base 10) = 0011 (base 2) 
    b = 3 (base 10) = 0011 (base 2) 
            --------------- 
    a[0] | b   = 0011 (base 2) = 3 (base 10) 
    
  5. b = 4

    a[0] = 3 (base 10) = 0011 (base 2) 
    b = 4 (base 10) = 0100 (base 2) 
            --------------- 
    a[0] | b   = 0111 (base 2) = 7 (base 10) 
    
  6. b = 5

    a[0] = 7 (base 10) = 0111 (base 2) 
    b = 5 (base 10) = 0101 (base 2) 
            --------------- 
    a[0] | b   = 0111 (base 2) = 7 (base 10) 
    
  7. b = 6

    a[0] = 7 (base 10) = 0111 (base 2) 
    b = 6 (base 10) = 0110 (base 2) 
            --------------- 
    a[0] | b   = 0111 (base 2) = 7 (base 10) 
    
  8. b = 7

    a[0] = 7 (base 10) = 0111 (base 2) 
    b = 7 (base 10) = 0111 (base 2) 
            --------------- 
    a[0] | b   = 0111 (base 2) = 7 (base 10) 
    
  9. b = 8

    a[0] = 7 (base 10) = 0111 (base 2) 
    b = 8 (base 10) = 1000 (base 2) 
            --------------- 
    a[0] | b   = 1111 (base 2) = 15 (base 10) 
    
  10. b = 9

    a[0] = 15 (base 10) = 1111 (base 2) 
    b = 9 (base 10) = 1001 (base 2) 
            --------------- 
    a[0] | b   = 1111 (base 2) = 15 (base 10) 
    

Vào cuối vòng lặp giá trị của a[0]15

+22

+1 để đi qua vòng lặp – WildlyInaccurate

+0

@kidmenot: Tuyệt vời, cảm ơn. – ContentiousMaximus

+0

@ user1638092 vui mừng được giúp đỡ :) –

46
x |= y; 

tương đương với

x = x | y; 

nơi | đứng cho bitwise HOẶC.

+0

Có ý nghĩa thành ngữ không? Hoặc một số thủ đoạn, như khi bạn đặt sàn xuống với '~~ '? – katspaugh

+1

@katspaugh Có.Ví dụ, nó có thể được sử dụng để mã hóa hiệu quả và kiểm tra các đặc quyền (điều này cũng phù hợp với mã OP). Đọc [bài viết này] (http://www.php4every1.com/tutorials/create-permissions-using-bitwise-operators-in-php/). – freakish

+1

@katspaugh ý của bạn là gì "sàn xuống nổi với ~~"? Tôi chưa bao giờ nghe nói về một điều như vậy! –

7

Như với hầu hết các toán tử gán, nó tương đương với việc áp dụng các nhà điều hành sử dụng giá trị bên trái một lần nữa:

a |= b 
a = a | b 

Giống như

a += b 
a = a + b 

Look trên Moz Dev Net để biết thêm.

[Chỉnh sửa: Não thất bại, trộn lẫn | và ||. Cần thêm cà phê. Đã sửa đổi bên dưới]

| là toán tử bitwise OR, kết quả của a|b sẽ là số nguyên đại diện cho bitstring với tất cả 1 bit của ab. Lưu ý rằng javascript không có loại int hoặc bitstring gốc, vì vậy trước tiên, nó sẽ truyền ab vào int, sau đó thực hiện bitwise HOẶC trên các bit. 9 | 2 trong nhị phân là 1001 | 0010 = 1011, là 11, nhưng 8 | 2 = 8.

Hiệu ứng là thêm các bit cờ của b vào a. Vì vậy, nếu bạn có một số cờ WEEVILFLAG=parseInt(00001000,2):

// a = parseInt(01100001,2) 
if(isWeevilish(a)) 
    a |= WEEVILFLAG; 
// now a = parseInt(01101001,2) 

sẽ đặt bit đó thành 1 trong a.

+1

Vì vậy, điều này là giống như logic hoặc? Ví dụ. var a = "title" || x – ContentiousMaximus

+3

Bạn đang bối rối OR hợp lý và bitwise HOẶC. – katspaugh

+1

Bah. Bitwise HOẶC không logic HOẶC. Não bộ là những điều thú vị. Đã sửa lỗi. –

11

Nó hoạt động loại như sau: nếu b lớn hơn a, b được thêm vào a.

Điều gì xảy ra trong thực tế là a = a | b, giống như đối với các nhà khai thác khác. Điều này có nghĩa là a = a BITWISE OR b được giải thích here.

Ví dụ, đây là kết quả của một vài hoạt động:

var a = 1; 
a |= 2; // a = 3 
a |= 2; // a = 3 
a |= 4; // a = 7 

Tôi hy vọng rằng sẽ giúp.

+0

không chắc chắn: b: 0 a [0]: 0 b: 1 a [0]: 1 b: 2 a [0]: 3 b: 3 a [0]: 3 b: 4 a [0]: 7 b: 5 a [0]: 7 b: 6 a [0]: 7 b: 7 a [0]: 7 b: 8 a [0]: 15 b: 9 a [0]: 15 – ContentiousMaximus

+0

Đây sẽ là một sự giải thích chính xác mặc dù một số người khác đã giải thích nó một cách thấu đáo hơn. –

5

Trả về một vị trí trong mỗi vị trí bit mà các bit tương ứng của cả hai hoặc cả hai toán hạng là các bit.

Mã số: kết quả = a | b;

^ là toán tử XOR bitwise, trả về một cho mỗi vị trí trong đó một (không phải cả hai) của các bit tương ứng của toán hạng là một. Ví dụ tiếp theo trả về 4 (0100):