2010-10-26 8 views

Odpowiedz

14

Jest binarny "OR", podobnie jak w C, C++ lub Java. W tym przypadku, to jest stosowany w postaci zadanie operatora, tak

value |= this.value 

oznacza this.value i value oba przekształcone na 32-bitowe liczby całkowite, a bitowym lub operacji. Jeśli value były 10 i this.value były 3 przed operacją (to jest 01010 i 011 w systemie binarnym), wynik byłby 11 (01011 w binarnym).

Operatory logiki binarnej w języku JavaScript wyróżniają się w Javascript, ponieważ prace są wykonywane na wartościach o wartościach całkowitych.

Termin "bit-mądry" jest prawdopodobnie bardziej dokładny niż "binarny". Operacje działają na każdym bicie wartości numerycznej, w szczególności na wartości numeryczne wymuszone na podpisanych 32-bitowych liczbach całkowitych. Wynikiem jest również 32-bitowa liczba całkowita ze znakiem (zgodnie ze specyfikacją).

Jednak numery JavaScript "w spoczynku" są zawsze 64-bitowymi wartościami zmiennoprzecinkowymi binarnymi. Zatem wyniki operatorów bitowych, choć obliczone z 32-bitową liczbą całkowitą, są przechowywane w postaci zmiennoprzecinkowej. Działa to, ponieważ zakres 32-bitowych liczb całkowitych pasuje wygodnie i precyzyjnie w 64-bitowym float.

+0

więc jeśli "this.value" jest "1", "Wartość" będzie "1"? – samrockon

+0

Zależy od wartości "Wartość" przed operacją. –

+0

Tylko jeśli wartość wynosi 0 lub 1. – Margus

21

ta wykona bitwise OR pomiędzy bitów this.value i bitów przechowywanych już w Value, wówczas zapisać wynik z powrotem w Value.

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

To jest lepszy przykład tego, co się faktycznie dzieje. – vol7ron

3

Jest to operator bitowy lub przypisania, podobny do +=. Jeśli prowadzisz test na to tak:

<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> 

dostaniesz to wyjście (w IE)

1.false 
2.1 
3.0 

zasadniczo x|=y jest taka sama jak mówią x=x|y

10

Jak inni zauważyłem, że jest to operator bitowy OR. Jednak nie sądzę, aby ludzie używali go zbyt dużo na wartości liczbowe w JavaScript jako - ogólnie - nie robisz dużo obliczeń w JavaScript. Aby lepiej zrozumieć, dlaczego ten operator jest przydatny, zastanów się nad znacznie częstszym scenariuszem, w którym użytkownik musi wypełnić co najmniej jedno z wielu pól tekstowych.

Powiedzmy, że masz to HTML:

<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" /> 

Użytkownik ma możliwość wypełnienia wielu numerów telefonicznych, ale będzie musiał dostarczyć co najmniej jeden.

Najprostszym sposobem, aby to zrobić (z jQuery w tym przypadku) jest:

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

valid będzie prawdziwa, jeśli co najmniej jedno pole wejściowe z klasą phone-nr ma niepusty wartość.

Jeśli każde pole koniecznością być wypełnione (bardziej wspólnej wymogu), można zrobić to w ten sposób z bitowe i operator:

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

valid będzie tylko prawda, jeśli wszystkie pola wejściowe mają wartość.

jeżeli co najmniej jedno pole jest wymagane do wypełnienia, ale nie więcej niż jeden można użyć operatora XOR:

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

Ci są, moim zdaniem, w świecie rzeczywistym zastosowań operatory bitowe w JavaScript.

+0

dzięki za demo/bardziej wyrafinowane wyjaśnienie, nadal nie bardzo rozumiem po przeczytaniu dwóch wyżej ocenionych odpowiedzi. –

+0

Zgadzam się, minęło trochę czasu odkąd miałem przypadek użycia dla operacji bitowych. Demo to miło wrócić, nawet jeśli rozumiesz, czym jest operator. – vol7ron

7

Niektóre praktyczne zastosowanie dla tego operatora znalazłem:

(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; 

i trochę magii dla mnie:

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

Podobają mi się przykłady. Chyba nie rozumiem, jak magicznie "magia" jest na końcu. Myślę, że będzie to pierwsza wartość lub '0', nigdy' 0px'. To, co może być bardziej praktyczne, to 'someVar | parseInt (someVar) ' – vol7ron