「JavaScript高級プログラム設計」読書ノート(五):ECMAScriptの演算子(一)

17155 ワード

2.9演算子
2.9.1、単項演算子
単項演算子には、操作する対象または値のパラメータがあります.
1、delete:以前に定義されたオブジェクトの属性や方法に対する参照を削除しますが、この演算子は開発者が定義していない属性や方法を削除することができません.例:
 1 var o=new Object;
2 o.name="Nicholas";
3 o.show=function(){
4 return "test";
5 };
6 console.log(o.name); //outpus Nicholas
7 console.log(o.show()); //outpus test
8
9 delete o.name;
10 delete o.show;
11
12 console.log(o.name); //outpus undefined
13 console.log(o.show()); //outpus TypeError: o.show is not a function
14
15 delete o.toString;
16 console.log(o.toString()); //outpus [object Object]
2、void:どの値に対してもundefinedを返します.この演算子は通常、出力すべきでない値を避けるために使用されます.
リンクで新しいウィンドウを開くと、コードは以下の通りです.
<a href="javascript:window.open('about:blank')">Click Me</a>
リンクをクリックすると新しいウィンドウに[object]が表示されます.これはwindow.openメソッドが新しいウィンドウを開くための参照を返しているからです.このオブジェクトは表示する文字列に変換されます.この結果を避けるためには、void演算子でwindow.open関数を呼び出すことができます.
<a href="javascript:void(window.open('about:blank'))">Click Me</a>
3、前のインクリメント/前の減算演算子:Cから借りた2つの演算子.例:
1 var iNum=10;
2 console.log(++iNum); //outpus 11 same as iNum=iNum+1
3 console.log(iNum); //outpus 11
4 console.log(--iNum); //outpus 10 same as iNum=iNum-1
5 console.log(iNum); //outpus 10
4、後の増分/後の減算演算子:Cから借りた2つの演算子.前のインクリメント/前の減算量と同じで、値に1または1を加算します.違いは、拡張式演算子はそれらを含む表式を計算してから増分または減算します.例:
1 var iNum=10;
2 iNum--
3 console.log(iNum); //outpus 9
4 console.log(iNum--); //outpus 9
5 console.log(iNum); //outpus 8
6 iNum++
7 console.log(iNum); //outpus 9
8 console.log(iNum++); //outpus 9
9 console.log(iNum); //outpus 10
5、一元加算と一元減算:使い方は高校数学で学んだものと同じです.一元加算は数字に何の影響もありません.一元減算は数値に対してマイナスを求めることです.一元戻りと一元減算で文字列を演算する場合はパーパー秒Int()と似ていますが、主な違いは「ox」で始まる文字列に対してのみ、一元演算子はそれを10進数の値に変換します.例:
 1 var iNum=25;
2 iNum=+iNum;
3 console.log(iNum); //outpus 25
4
5 var sNum="50";
6 console.log(typeof sNum); //outpus string
7 console.log(+sNum); //outpus 50
8 console.log(typeof +sNum); //outpus number
9
10 var sNum1="017";
11 var sNum2="0xB";
12 console.log(-sNum1); //outpus -17
13 console.log(-sNum2); //outpus -11
2.9.2ビット演算子
1、ビット演算NOT:(~)によって表されていますが、処理は以下の通りです.
(1)演算数を32桁の数字に変換する
(2)バイナリ形式をそのバイナリ逆符号に変換する.
(3)バイナリ逆符号を浮動小数点に変換する
例:
1 var iNum1=25;        //25 is equal to 0000 0000 0000 0000 0000 0000 0001 1001
2 var iNum2=~iNum1; //conver to 1111 1111 1111 1111 1111 1111 1110 0110
3 console.log(iNum2); //outpus -26
4
5 // NOT , 1,
6 var iNum3=25;
7 var iNum4=-iNum3-1;
8 console.log(iNum4);
2、ビット演算AND:(&)で表し、直接に数字のバイナリ形式を計算します.規則は全部1です.でなければ0です.例:
1 var iNum1=25;        //25 is equal to 0000 0000 0000 0000 0000 0000 0001 1001
2 var iNum2=iNum1&3; // 3 is equal to 0000 0000 0000 0000 0000 0000 0000 0011
3 console.log(iNum2); // and is 0000 0000 0000 0000 0000 0000 0000 0001 outpus 1
3、ビット演算OR:(|)で表し、直接に数字のバイナリ形式を計算します.規則は全部0です.でなければ1です.例:
1 var iNum1=25;        //25 is equal to 0000 0000 0000 0000 0000 0000 0001 1001
2 var iNum2=iNum1|3; // 3 is equal to 0000 0000 0000 0000 0000 0000 0000 0011
3 console.log(iNum2); // or is 0000 0000 0000 0000 0000 0000 0001 1011 outpus 27
4、ビット演算XOR:(^^)で表し、直接に数字のバイナリ形式を計算します.規則は一つの桁だけが1の時に1の桁を保存します.そうでないと0です.例:
1 var iNum1=25;        //25 is equal to 0000 0000 0000 0000 0000 0000 0001 1001
2 var iNum2=iNum1^3; // 3 is equal to 0000 0000 0000 0000 0000 0000 0000 0011
3 console.log(iNum2); // xor is 0000 0000 0000 0000 0000 0000 0001 1010 outpus 26
5、左シフト演算:(<)で表し、数字の中のすべてのビットを左に指定された数だけ移動し、シンボルビットを保持し、左に1ビット移動するのは2倍に相当する.
6、符号付きの右シフト演算:(>)により表し、数字の中のすべての桁を右に移動して指定された数だけ移動し、符号ビットを保持し、右のビットを2で割るのに相当する.
7、符号なしで右に移動:(>>)で表し、数字の中のすべての桁を右に移動して指定された数だけ移動します.正数については符号付きの右シフトと全く同じで、負の数については正数として扱います.
例:
 1 var iOld=2;
2 var iOld1=64;
3 var iOld2=64;
4 var iOld3=-2;
5
6 var iNew=iOld<<5;
7 var iNew1=iOld1>>5;
8 var iNew2=iOld2>>>5;
9 var iNew3=iOld3>>>1;
10
11 console.log(iNew); //outpus 64
12 console.log(iNew1); //outpus 2
13 console.log(iNew2); //outpus 2
14 console.log(iNew3); //outpus 2147483647
負数iOld 3符号なしで右にシフトする計算方法は以下の通りです.
まず-2を無符号の等価形式、すなわち-2のバイナリ補数に変換します.
-2の非負のバージョンバイナリ表現:0000 0000 0000 0000 0000 0000 0010
このバイナリの逆コード:1111 1111 1111 1111 1111 1111 1111 1111 1101
バイナリ逆コードに1:1111 1111 1111 1111 1111 1111 1111 1110を追加します.
最後にもう一つのビットを移動します.0111 1111 1111 1111 1111 1111 1111、1111、つまり:2147483647
2.9.3 Boolean演算子
1、論理NOT:(!)で表しています.戻り値は必ずBoolean値です.行為は以下の通りです.
演算数がオブジェクトの場合、falseを返します.
演算数が数字0なら、trueに戻ります.
演算数が0以外の任意の数字であれば、falseに戻ります.
演算数がnullなら、trueに戻ります.
演算数がNaNなら、trueに戻ります.
演算数がundefinedであれば、エラーが発生します.
2、論理AND:(&&)によって表されていますが、演算数がすべてBoolean型であれば、演算数がすべてtrueの場合にのみtrueに戻ります.そうでなければfalseに戻ります.AND演算の演算数は任意のタイプであってもよく、戻り値は必ずしもBoolean値ではありません.
一つの演算数がオブジェクトである場合、もう一つはBoolean値で、そのオブジェクトに戻ります.
二つの演算数が対象である場合は、2番目のオブジェクトに戻ります.
ある演算数がnullなら、nullに戻ります.
ある演算数がNaNなら、NaNに戻ります.
ある演算数がundefinedであれば、エラーが発生します.
ECMAScriptの論理ANDも簡便な演算であり、第一の演算数が決定されたら、第二の演算数は計算されなくなります.例:
1 var bFalse=false;
2 var bResult=bFalse&&bUnknow;
3 console.log(bResult); //outpus false
4
5 var bTrue=true;
6 var bResult=bTrue&&bUnknow;
7 console.log(bResult); //outpus ReferenceError: bUnknow is not defined
3、論理OR演算子:(𞓜|124;)によって表されていますが、演算数がすべてBoolean型であれば、演算数が全部falseの場合だけfalseに戻ります.そうでなければtrueに戻ります.OR演算の演算数は任意のタイプであってもよく、戻り値は必ずしもBoolean値ではありません.
一つの演算数がオブジェクトである場合、もう一つはBoolean値で、そのオブジェクトに戻ります.
二つの演算数が対象である場合、最初のオブジェクトを返します.
ある演算数がnullなら、nullに戻ります.
ある演算数がNaNなら、NaNに戻ります.
ある演算数がundefinedであれば、エラーが発生します.
ECMAScriptにおける論理ORも簡易演算であり、第一演算数が決定された場合、第二演算数は計算されなくなります.例:
1 var bTrue=true;
2 var bResult=bTrue||bUnknow;
3 console.log(bResult); //outpus true
4
5 var bFalse=false;
6 var bResult=bFalse||bUnknow;
7 console.log(bResult); //outpus ReferenceError: bUnknow is not defined
2.9.4乗算演算子
1、乗算演算子:(*)によって表されていますが、通常の場合は数学の乗算と同じです.特殊な場合は特殊な値があります.
演算の結果が大きすぎるか、小さすぎると、結果はInfinityまたは-Infinityです.
ある演算数がNaNなら、結果はNaNです.
Infinityに0を掛けたらNaNです.
Infinityは0以外の任意の数字を掛け、結果はInfinityまたは-Infinityとなり、2番目の演算数の符号で決定される.
InfinityにInfinityを掛けた結果、Infinityです.
2、除算演算子:(/)によって表されています.通常の場合は数学の乗算と同じです.特殊な場合は特殊な値があります.
演算の結果が大きすぎるか、小さすぎると、結果はInfinityまたは-Infinityです.
ある演算数がNaNなら、結果はNaNです.
InfinityはInfinityによって除外され、結果はNaNです.
Infinityは任意の数字で除され、結果はInfinityです.
0は無限大でない数字で割って、結果はNaNです.
Infinityは0以外の任意の数字によって除外され、結果はInfinityまたは-Infinityであり、第二の演算数の符号によって決定される.
3、型取り演算子:(%)によって表されていますが、通常の場合は数学の乗算と同じです.特殊な場合は特殊な値があります.
除数がInfinityか、除数が0であればNaNとなります.
InfinityはInfinityによって除外され、結果はNaNです.
除数が無限大の数なら、結果は除数されます.
除数が0なら、結果は0です.