2010-10-26 50 views

Trả lời

14

Mã nhị phân "OR", giống như trong C hoặc C++ hoặc Java. Trong trường hợp này, nó được sử dụng ở dạng toán tử gán của nó, vì vậy

value |= this.value 

nghĩa là this.valuevalue đều chuyển đổi sang số nguyên 32-bit, và một Bitwise OR được thực hiện. Nếu value là 10 và this.value là 3 trước khi hoạt động (nghĩa là, 01010011 trong hệ nhị phân), kết quả sẽ là 11 (01011 ở dạng nhị phân).

Toán tử logic nhị phân trong Javascript là đáng chú ý trong Javascript vì công việc được thực hiện trên số nguyên giá trị.

Thuật ngữ "bit-khôn ngoan" có lẽ chính xác hơn "nhị phân". Các hoạt động hoạt động trên mỗi bit của một giá trị số, cụ thể là các giá trị số bị ép buộc với các số nguyên 32 bit đã ký. Kết quả cũng là một số nguyên 32 bit có dấu (theo spec).

Tuy nhiên, số JavaScript "nghỉ ngơi" luôn là giá trị điểm động nhị phân 64 bit. Do đó, kết quả của các toán tử bitwise, mặc dù được tính toán bằng toán tử số nguyên 32 bit, được lưu trữ dưới dạng dấu phẩy động. Điều đó làm việc vì phạm vi của các số nguyên 32 bit phù hợp một cách thoải mái và chính xác trong phao 64 bit.

+0

vì vậy nếu "this.value" là "1", "Giá trị" sẽ là "1"? – samrockon

+0

Phụ thuộc vào những gì trong 'Giá trị' trước khi hoạt động. –

+0

Chỉ khi Giá trị là 0 hoặc 1. – Margus

21

Điều này sẽ thực hiện bitwise OR giữa các bit trong this.value và các bit đã được lưu trữ trong Value, sau đó lưu kết quả trở lại vào Value.

var Value = 42; // 00101010 
Value |= 96;  // 01100000 
window.alert(Value); // 01101010 -> 106 
+0

Đây là ví dụ tốt hơn về những gì đang thực sự xảy ra. – vol7ron

3

Đó là một toán tử bitwise hoặc gán, tương tự như +=. Nếu bạn chạy một thử nghiệm trên nó như thế này:

<ol> 
<script language="javascript"> 
var x=false; 
document.writeln("<li>"+x+"</li>"); 
x|=true; 
document.writeln("<li>"+x+"</li>"); 
x&=false; 
document.writeln("<li>"+x+"</li>"); 
</script> 
</ol> 

Bạn sẽ nhận được kết quả này (trong IE)

1.false 
2.1 
3.0 

Về cơ bản, x|=y cũng giống như nói x=x|y

10

Như những người khác có được chỉ ra, đây là toán tử OR bitwise. Tuy nhiên, tôi không nghĩ rằng mọi người sử dụng nó nhiều trên các giá trị số trong Javascript như - nói chung - bạn không làm nhiều tính toán trong Javascript. Để cung cấp cho bạn ý tưởng tốt hơn lý do toán tử này hữu ích, hãy xem xét trường hợp phổ biến hơn nhiều mà người dùng cần phải điền vào ít nhất một trong nhiều trường văn bản.

Giả sử bạn có HTML này:

<input type="text" class="phone-nr" id="home-phone-nr-1" /> 
<input type="text" class="phone-nr" id="home-phone-nr-2" /> 
<input type="text" class="phone-nr" id="home-phone-nr-3" /> 
<input type="text" class="phone-nr" id="mobile-phone-nr-1" /> 
<input type="text" class="phone-nr" id="mobile-phone-nr-2" /> 
<input type="text" class="phone-nr" id="mobile-phone-nr-3" /> 

Người dùng có thể tùy chọn để điền vào nhiều số điện thoại, nhưng sẽ phải cung cấp ít nhất một.

Cách đơn giản nhất để làm điều này (với jQuery trong trường hợp này) là:

var valid = false; 
$('.phone-nr').each(function(i, item){ 
    valid |= $(item).val(); 
}); // untested code 

valid sẽ đúng nếu ít nhất một lĩnh vực đầu vào với lớp phone-nr có một giá trị không trống.

Nếu mọi lĩnh vực phải được điền vào (một yêu cầu phổ biến hơn), bạn có thể làm điều đó như thế này với các phép toán AND điều hành:

var valid = true; 
$('.phone-nr').each(function(i, item){ 
    valid &= $(item).val(); 
}); // untested code 

valid sẽ chỉ đúng nếu tất cả lĩnh vực đầu vào có một giá trị.

Nếu ở trường duy nhất tối thiểu được yêu cầu phải được điền vào, nhưng không quá một bạn có thể sử dụng toán tử XOR:

var valid = false; 
$('.phone-nr').each(function(i, item){ 
    valid ^= $(item).val(); 
}); // untested code 

Những được, theo ý kiến ​​của tôi, thế giới thực sử dụng của các toán tử bitwise trong Javascript.

+0

cảm ơn cho bản demo/giải thích rõ ràng hơn, tôi vẫn không thực sự hiểu sau khi đọc hai câu trả lời được xếp hạng cao hơn. –

+0

Tôi đồng ý, đã lâu rồi kể từ khi tôi có trường hợp sử dụng cho các thao tác bitwise. Các bản demo rất hay để trở lại, ngay cả khi bạn hiểu nhà điều hành là gì. – vol7ron

7

Một số sử dụng thực tế cho rằng điều hành tôi đã tìm thấy:

(3|0) === 3;    // целые числа не изменяет 
(3.3|0) === 3;   // у дробных чисел отбрасывает дробную часть 
(3.8|0) === 3;   // не округляет, а именно отбрасывает дробную часть 
(-3.3|0) === -3;   // в том числе и у отрицательных дробных чисел 
(-3.8|0) === -3;   // у которых Math.floor(-3.3) == Math.floor(-3.8) == -4 
("3"|0) === 3;   // строки с числами преобразуются к целым числам 
("3.8"|0) === 3;   // при этом опять же отбрасывается дробная часть 
("-3.8"|0) === -3;  // в том числе и у отрицательных дробных чисел 
(NaN|0) === 0;   // NaN приводится к нулю 
(Infinity|0) === 0;  // приведение к нулю происходит и с бесконечностью, 
(-Infinity|0) === 0;  // и с минус бесконечностью, 
(null|0) === 0;   // и с null, 
((void 0)|0) === 0;  // и с undefined, 
([]|0) === 0;   // и с пустым массивом, 
([3]|0) === 3;   // но массив с одним числом приводится к числу, 
([-3.8]|0) === -3;  // в том числе с отбрасыванием дробной части, 
([" -3.8 "]|0) === -3; // и в том числе с извлечением чисел из строк, 
([-3.8, 22]|0) === 0  // но массив с несколькими числами вновь зануляется 
({}|0) === 0;    // к нулю также приводится пустой объект 
({'2':'3'}|0) === 0;   // или не пустой 
((function(){})|0) === 0; // к нулю также приводится пустая функция 
((function(){ return 3;})|0) === 0; 

và một số kỳ diệu đối với tôi:

3 | '0px' === 3; 
+1

Tôi thích các ví dụ. Tôi không nghĩ rằng tôi hoàn toàn hiểu được phép thuật "ma thuật" ở mức độ nào. Tôi nghĩ rằng nó sẽ là giá trị đầu tiên hoặc '0', không bao giờ' 0px'. Điều gì có thể thực tế hơn là 'someVar | parseInt (someVar) ' – vol7ron