Biểu thức này có ý nghĩa gì trong JS?Một thanh dọc có nghĩa là gì trong JavaScript?
Value |= this.value
Biểu thức này có ý nghĩa gì trong JS?Một thanh dọc có nghĩa là gì trong JavaScript?
Value |= this.value
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.value
và value
đề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à, 01010
và 011
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.
Đ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
Đây là ví dụ tốt hơn về những gì đang thực sự xảy ra. – vol7ron
Đó 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
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.
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. –
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
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;
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
vì vậy nếu "this.value" là "1", "Giá trị" sẽ là "1"? – samrockon
Phụ thuộc vào những gì trong 'Giá trị' trước khi hoạt động. –
Chỉ khi Giá trị là 0 hoặc 1. – Margus