JavaScriptの演算子(一)

8278 ワード

演算子は、触れたばかりで「小さい」と感じるかもしれませんが、実際に触れてみると「多様」と「奇妙」が実感できます.
単項演算子
1要素の算術演算子は、個々の演算数に使用され、新しい値を生成します.javascriptでは、一元演算子は高い優先度を持ち、しかも右結合である.
1、1元加算と1元減
(1)、一元加算演算子はプラス記号(+)で表し、数値の前に置くと、数値には影響がありません.
var num = 25;
num = +num; //25
数値以外に一元加算演算子を適用すると、Number()変換関数を呼び出してこの値を変換します.
var s1 = '01';
var s2 = '1.1';
var s3 = 'z';
var s4=-1;
var b = false;
var f = 1.1;
var o = {
    valueOf:function(){
        return -1;
    }
};

s1 = +s1;  //1
s2 = +s2;  //1.1
s3 = +s3;  //NaN
s4 = +s4;  //-1
b = +b;  //0
f = +f;  //1.1
o = +o;  //-1

console.log(1+ +“2”+"3"); //33     +“2”          ,  +"2”     2,  1+ +“2”   1+2  3.         3  ,    “33”
注意:new Date()の前に1元プラス記号を使用すると、日付文字列を日付ミリ秒に変換できます.
console.log(new Date());//on Jul 11 2016 20:25:54 GMT+0800 (      )
console.log(+new Date());//1468239954076
(2)、1元演算子は主に負の数を表すために用いられます.1元の減算演算子が非数値に使用されると、この値はNumber()の変換関数を使って変換され、得られた数値は負に変換されます.
var s1 = '01';
var s2 = '1.1';
var s3 = 'z';
var b = false;
var f = 1.1;
var o = {
    valueOf:function(){
        return -1;
    }
};

s1 = -s1;//-1
s2 = -s2;//-1.1
s3 = -s3;//NaN
b = -b;//0
f = -f;//-1.1
o = -o;//1
, 。2、前のインクリメント/前のインクリメントと後のインクリメント演算子+演算子は変数aの前に置くと、前のインクリメント演算子となります.変数aの後に置くと、後のインクリメンタル演算子となります.演算子は変数aの前に置くと、前の減算演算子となります.変数aの後に置くと、後の減算演算子となります.

   var num=10;
   a=num++;
   console.log(num);//   11
   console.log(a)  ;//   10
   console.log(num++);  //  11
   console.log(num);  //  12


    var bnum=10;
    b = ++bnum;
    console.log(bnum);//   11
    console.log(b)  ;//   11
    console.log(++b);  //  12
    console.log(bnum);  //  11

以上の比較から見れば、
   /             /    ,     ;
    /            ,     /    。
    , ++,  --        ,            ,           。
一般的には、
  var x = 1;
  ++x;
  //   
  var x = 1;
  x = x +1;
しかし+xはいつもx=x+1と同じではありません.+演算子は文字列接続操作をしないので、動作数を常に数字に変換して1を増やします.
  var x = '1';
  ++x;//2
  var x = '1';
  x = x + 1;//'11'
二項演算子
1、加算演算子Javascriptの加算器は、バックグラウンドで異なるデータタイプを変換します.(1)、両方の動作数が数値である場合、通常の加算で計算します.
       NaN,      NaN。
-Infinity   -Infinity,    -Infinity。
Infinity   -Infinity,    NaN。
+0   +0,    +0。
-0   +0,    +0。
-0   -0,    -0。

 :
var a = 2;
console.log(a+NaN); //NaN          NaN,   NaN
(  :       NaN    )
console.log("A"+"B"+3); //NaN      “A” “B” Number       ,   NaN,    NaN         NaN
console.log("A"+"B"+"3"); //NaN3    “A” “B” Number       ,   NaN,      “3”  

console.log(Infinity+Infinity);//Infinity
console.log(Infinity+(-Infinity));//NaN
console.log((-Infinity)+(-Infinity));//Infinity
console.log((+0)+(+0));//+0
console.log((+0)+(-0));//+0
console.log((-0)+(-0));//-0
(2)操作数がある場合は文字列
            ,        
             ,              ,           
           ,       ,       toString()          ,      (  null,undefined)
一部の判例:
  • String+String
  •    var a = '10',
       b = '20';
       console.log(a+b);  //1020
    
  • String+Object
  •   var a = '10',
      b = {_key:20};
      console.log(a+b);  //10[object Object]
      //Object.prototype.toString()               。
    
  • String+Number
  •   var a = '10',
      b = 20;
      console.log(a+b);  //1020
    
  • String+Boolean
  • var a = true,
    b = '20';
    console.log(a+b);  //true20
    
  • String+null
  • var a = null,
    b = '20';
    c =3;
    console.log(a+b);  //null20
    console.log(a+c);  //3  null     0
    
    
  • String+undefined
  • var a = undefined,
    b = '20';
    console.log(a+b);  //undefined20
    console.log(undefined+3);  //NaN
    
    (3)、加算の独立動作
    var a = 10,
    b = 5;
    var result = 'hello world 10 + 5 = ' + a + b;
    console.log(result);  //'hello world 10 + 5 = 105'
    
    var a = 10,
    b = 5;
    var result = 'hello world 10 + 5 = ' + (a + b);
    console.log(result);  //'hello world 10 + 5 = 15'
    
    //          ,undefined   NaN,null   0,false   0,true   1/
    console.log(undefined + undefined);//NaN
    console.log(null + null);//0
    console.log(false + false);//0
    console.log(true + true);//2
    //         ,undefined   'undefined',null   'null',false   'false',true   'true'
    console.log('' + undefined);//'undefined'
    console.log('' + null);//'null'
    console.log('' + false);//'false'
    console.log('' + true);//'true'
    
    //      valueOf()                  
    console.log(1 + []);//1
    var o = {
        valueOf: function(){
            return -1;
        }
    }
    console.log(1 + o);//0
    
    //             
    console.log(1 + {});//'1[object Object]'
    console.log(1 + [1,2]);//'11,2'
    console.log(1 + new Date());//'1Thu Jun 16 2016 10:27:13 GMT+0800 (      )'
    console.log(1 + /0/);//'1/0/'
    
    
    2、減算演算子(1)、両方の操作数が数値である場合、通常の減算で計算します.
           NaN,      NaN。
    Infinity   Infinity,    NaN。
    -Infinity   -Infinity,    NaN。
    Infinity   -Infinity,    Infinity。
    -Infinity   Infinity,    -Infinity。
    +0   +0,    +0。
    -0   -0,    -0。
    +0   -0,    +0。
             ,      NaN。
             ,           ,     。
    
    console.log(2-NaN); //NaN          NaN,  NaN
    console.log(Infinity-Infinity); //NaN
    console.log(-Infinity-(-Infinity)); //NaN
    console.log(Infinity-(-Infinity));  //Infinity
    console.log(-Infinity-Infinity);    //-Infinity
    console.log(+0 - (+0)); //+0
    console.log(-0 - (+0)); //-0
    console.log(-0 - (-0)); //+0
    
    (2)一つの操作数があれば数値ではない
              `   `,`   `,`null`,`undefined`,      `Number()`       ,       。
                 ,      `valueOf()`            。       NaN,     NaN。      valueOf()  ,    toString()  ,             .
    
  • Number-String
  • var a = 10,
    b = '10';
    console.log(a-b); //0
    
    var a = 10,
    b = '';
    console.log(a-b);   //10
    
    var a = 10,
    b = 'true',
    c = 'false';
    console.log(a-b);   //NaN
    console.log(a-c);   //NaN
    
    //Number('true') => NaN    Number('false') => NaN  
    //      Number('false') == NaN     Number('false') === NaN
    //  console.log(NaN == NaN) => false
    
       Number()      ,        : 
    1.           (        )        ; 
    2.               ,            ; 
    3.           16  ,               ; 
    4.       ,    0; 
    5.            ,    NaN
    
  • Number-Boolean
  • var a = 10,
    b = true,
    c = false;
    console.log(a-b);   //9
    console.log(a-c);  //10 
    
  • Number-null
  • var a = 10,
    b = null;
    console.log(a-b); //10
    
  • Number-undefined
  • var a = 10,
    b = undefined;
    console.log(a-b);   //NaN
    
  • Number-Object
  • var a = 10,
    b = {_key:1};
    console.log(a-b);   //NaN
    
    console.log(1 - {});//NaN
    console.log(1 - [1,2]);//NaN
    console.log(1 - /0/);//NaN
    console.log(1 - []);//1
    
    3、乗算演算子は2つの数値の積を計算するために使用され、Number()変換関数により非数値タイプを数値またはNaNに変換します.
    + Infinity * 0;  //NaN
    - Infinity * 0;  //NaN
    Infinity *  0  ;  //Infinity -Infinity
    Infinity * Infinity;  //Infinity
    
    4、除算演算子は、第一操作数を第二操作数で割った演算を行い、Number()変換関数により非数値タイプを数値またはNaNに変換します.
    Infinity / Infinity;  //NaN
    0 / 0;  //NaN
     0   / 0;  //Infinity -Infinity
    Infinity / 0;  //Infinity
    Infinity /  0  ;  //Infinity
    
    5、モジュラス演算子の求め方(剰余)操作子は百分号(%)で表され、最初の操作数を第二の操作数で割った余りです.
    //r   ,n    ,d   ,
    //q   , n/d     , n/d     ,       n d          
    r = n - (d * q)
    
    モデルの結果を求めて、最初の操作数のシンボルと一致しています.
    console.log(5 % 2);//1
    console.log(5 % -2);//1
    console.log(-5 % 2);//-1
    console.log(-5 % -2);//-1
    
    除数されるのはInfinityで、あるいは除数は0で、モデルの結果を求めるのはNaNです.
    Infinity % 0 = NaN
    Infinity % Infinity = NaN
    Infinity %  0   = NaN
     0   % 0 = NaN
    
    多くのプログラミング言語では、演算子は整数だけを操作数として受け入れるが、ECMAScriptでは浮動小数点の操作数も受け付けているが、浮動小数点は正確な値ではないので、完全に正確な結果を得ることができない.
    console.log(6.5 % 2.1);//0.19999999999999973