javascriptの比較演算と論理演算

17168 ワード

1、はい == 演算中、undefined == null  ,このほかに、この2 このデータは他のデータと同じではありません. 、 number  、を選択します bollanの間で比較すると、2つの数値のタイプが違っていれば、number型ではなくnumber型に変換できます. Number()、not parseFlaoat()を比較します. js. のスカラ(ここでは「スカラ」の不正確かつ責任な表現とは、bootlean、string、numberのことです.これも間違いなく、trueを1として、falseを0として、残りの一つは文字列です.例えば、「true」==true、 「true」をブーメランにしても、trueをstringにしても、正しい結果が得られず、彼らをnumberに変えて比較すれば、正しい結果が得られます.
3、対象型データ(String、Number、Boolean、object、Aray、function とストリングス 、number  、bollanタイプは、valueOf()、toString()方法の戻り値を使って比較に参加します.対象とオブジェクトはタイプが違う限りfalseです.valueOf()やtoString()は呼び出しません.事実上、どの対象型のデータも自分だけです.4、NaNはnumber型です.データと同じではなく、彼自身も含まれます.NaN==true,isNaN==true
5、Infinity まずnumber型です.そして、Infinity. Infinityに等しいだけです 6、if文の表現の位置の特殊性に注意して、比較演算と論理演算を混同しないでください.論理演算もブール演算(演算元の前に加算しないでください. ! )論理要素計算は常に演算元に戻り、演算とブール演算は常にtrue/falseに戻ります. if ステートメントの条件式には、ブール演算の効果が隠れています. 式の演算結果を レスリング 実行 !!レスリング 手に入れる true/false .
7、論理演算において、falseと判断されたデータは、false、null、undefined、空の文字列、0、NaN、残りのデータはすべてtrueであり、どの対象型データもすべてtrueであり、Booleanオブジェクト自体を含む.論理演算において、 && 優先順位 ||,比較:
3 || 0  &&  2 ; //3 ,  3||(0&&2)
(3 || 0 ) &&  2 ; //2

 
 
8、===演算では、まずタイプを比較してから数値を比較します.
9、switch-caseでは、caseパラメータは区分タイプです.
10、大きい、小さい(>=>=>==、
null<=0; //true

null>=0; //true

null>0; //false

null<0;//false

null==0;//false

 

undefined==null  //true

undefined<=null  //false

undefined>=null  //false
 
再配列:
[1]==[1]; //false        
[1]>=[1]; //true,          Number([1].valueOf().toString())==1
 
より権威のある文書はここを見ます.
http://bclary.com/2004/11/07/#a-11.8.5
 
undefinedはキーワードではなく、非グローバル環境でundefinedを再定義できます. 
 //test1
  var undefined = 1;
  console.log('test1',undefined,typeof undefined);  //     , undefined      

  //test2
    (function(){
       undefined = 2; //   undefined      
       console.log('test2',undefined,typeof undefined);
    })();

      //test3
    (function(){
       var undefined = 3; //undefined     
       console.log('test3',undefined,typeof undefined);
    })();

    //test4
    (function(x,undefined) {    //     undefined            
        console.log('test4',undefined,typeof undefined,arguments)
        console.log(undefined*2) // 8          
    }('a',4))
 
 
 
 
タイプ変換について:
対象型データで比較演算と算術演算(+、-、*、% など)の場合、対象型データを用いたvalueOf()メソッドの戻り値が演算に参加し、スカラーオブジェクトと時間オブジェクトのvalueOf()の戻り値がスカラーであり、他のオブジェクトの戻り値がすべてobject/function型であり、valueOf()がスカラーを得られない場合は引き続きtoring(String)メソッドを呼び出します.の戻り値が演算に参加していますが、この2つの方法のいずれもスカラー(またはundefined、null)でない場合、プログラムはエラーとなります.
日付オブジェクトはここで他のオブジェクトとはちょっと違って、日付オブジェクトが参加します. 「+」と「=」演算は文字列と直接に解釈され、valueOf()をスキップしてstringに戻ります.スカラが得られない場合はvalueOf()を試し続けますが、Dateオブジェクトは乗算に参加しますか?それともvalueOfを呼び出してデジタル演算に参加しますか?これは日付の実用的な意味から考えるかもしれません.日付データは主に読書に使います.
文字列をインターフェイスで出力するときは、直接呼び出します. toString 方法、例えば alert(x) document.write(x)は、toString()がスカラでない場合は、valueOf()を試してみますが、スカラが取れない場合はエラーが発生します.
このような場合、パラメータ位置の配列は、PArseInt()関数(parseFlooat()と上記のインターフェース出力関数を含む)の実現形態によって、受信したいパラメータタイプがstringであり、パラメータのデータタイプ自体の自動変換ではないため、Tostring()を直接呼び出す.
 
いくつかのテスト:
//Array 

var _arrToString = Array.prototype.toString;

var _arrVal = Array.prototype.valueOf;

Array.prototype.toString=function(){

console.log("Array.toString is called");

return _arrToString.call(this);

};


Array.prototype.valueOf=function(){

console.log("Array.valueOf is called");

return _arrVal.call(this);

};

[1]+2 //Array.valueOf is called   ,  Array.toString is called
parseInt([1]) //parseInt      string    ,      Array.toString
Number([1]) //valueof toString      

//Boolean 
var _arrToString = Boolean.prototype.toString;

var _arrVal = Boolean.prototype.valueOf;

Boolean.prototype.toString=function(){

console.log("Boolean.toString is called");

return _arrToString.call(this);

};


Boolean.prototype.valueOf=function(){

console.log("Boolean.valueOf is called");

return _arrVal.call(this);

};


1+new Boolean(true); //Boolean.valueOf is called



//object

var tostr = Object.prototype.toString;

var valof = Object.prototype.valueOf;

Object.prototype.toString = function(){ 

console.log('Object.toString iscalled'); 

return tostr.call(this); 

}


Object.prototype.valueOf = function(){ 

console.log('Object.valueOf is called');

 return valof.call(this); 

}
({})== 1; //  valueOf toString      
({})== ({}); //    valueOf   toString     


//Date
var valueof = Date.prototype.valueOf;
var toString = Date.prototype.toString;
Date.prototype.valueOf = function(){
    console.log('valueof is called');
    return valueof.call(this);
 }
 
Date.prototype.toString = function(){
    console.log('toString is called');
    return toString.call(this);
 }
 
 new Date()+1; //toString is called
 new Date()*1; //valueOf is called
 new Date()==1;//toString is called
 new Date()>=1;//valueOf is called
 parseInt( new Date()); //toString is called
 Number( new Date()); //valueOf is called
 
 //toStringの呼び出し
var tostr = Array.prototype.toString;
var valof = Array.prototype.valueOf;
Array.prototype.toString = function(){ console.log('Array.toString iscalled'); return tostr.call(this); }
Array.prototype.valueOf = function(){ console.log('Array.valueOf is called'); return valof.call(this); }

var arr = [2];
alert(arr); //Array.toString iscalled

var x = arr +1; //Array.valueOf is called ,Array.toString is called 
 
によって Number(undefined)==NaN , Number(null)==0 ,したがって undefined 参加するデジタル演算はNaNを得ますが、nullは数字0として演算に参加します.
前 ++ 和後++ 演算は単目演算です.演算元はnumber型に変換して演算に参加します.'a'++ 和 ++'a.  NaNはNumber('a')=NaNを得ることができます.
 +を単眼演算子とすると、「正を取る」と表します. alert(+'a') //NaN ,alert(typeof(+'1') //number
 
Number() 関数は、8進数の書式の文字列を10進数で処理し、先頭の0を削除します.
        alert(012==10); //true
        alert('012'==10); //false
        alert(012=='012');//false
         

        alert(09==9); //true ,   8   ,         

        alert(012==10); //true   8   


        alert(Number(012));//10 ,(012).toString(10)   '10'
        alert(Number('012'));//12,            0,     parseInt('012')  firefox  IE8     10(      firefox       12),   IE9、IE10  chrome    12

        alert(0x12==18);//true
        alert('0x12'==18);//true
        alert(0x12=='0x12');//true
        alert('0x12'=='18');//false ,      ,          


        alert(Number(0x12));//18 
        alert(Number('0x12'));//18
 
parseInt 文字列を10進数の整数に変換すると、2進数を受け取ることができます. つのパラメータ、二つ目のパラメータは、入力された文字列の進数を説明するために使用されます.
parseInt('abc',16) // 2748 ,16進数を返します abc 10進数に変換
対応する、number オブジェクトのtoString 方法は、1つのパラメータ表示をどの進法で文字列に変換してもよいです.
(2748).toString(16) //abc
 
Object スカラー Number 、String 、Boolean及び Date のコンストラクタが違います.
もし OB オブジェクトであれば、
OB === new Object(obj) === Object(obj) 
Number 、String 、Boolean、 Date コンストラクタはnewごとに新しいオブジェクトを返します.newを使わないと新しいオブジェクトのvalueOfの値を返します.
 
var x = new Number();

x=== new Number(x) //false

x=== new Object(x) //true

 
//=======test=========
var x =  new Number(1)
x=== new Number(x) //false
x=== new Object(x) //true
x===  Object(x) //true
 

x.constructor //function Number() { [native code] }

Object(x).constructor //function Number() { [native code] }
(new Object(x)).constructor //function Number() { [native code] }

typeof(new Number("123")); //object
typeof(Number("123")); //number, not object
 
転載先:https://www.cnblogs.com/ecalf/archive/2012/11/29/2793921.html