JavaScriptの最終面の試験問題:null==undefined、[]+{}、{}などの結果はいくらですか?全部見てから、奇経八脈のどの対象の演算もできます.


JavaScriptの最終面の試験問題:null==undefined、[]+{}、{}などの結果はいくらですか?全部見てから、奇経八脈のどの対象の演算もできます.
  • 一、同等の原理
  • 二、違い
  • 三、例(各種演算子解析付き)
  • 1.シンプルタイプ比較
  • 2.複雑タイプ比較
  • 1)valueOfのみを書き換える()
  • 2)valueOf()およびtoString()を書き換えて参照の種類に戻る
  • 3.ifアプリケーションシーン
  • 4.エラー
  • 5.加算
  • 6.除算法
  • 7.減算
  • 8.余を求める
  • 各種変数Number、toString集合(これらは暗黙的に変換されることを覚えておく)
  • 一、イコールの原理
    紹介する前にまずまとめておきます.javascriptで変数のタイプは5種類の基本タイプです.Unidefined、Null、Boolean、Number、Stringです.他のオブジェクトタイプのAray、Function、Dateなどがあります.==イコール、両者の内容の比較は、2つの場合があります.1.両者のタイプが違って、暗黙的な変換があります.2.両者のタイプが同じで、内容を直接比較して暗黙的に変換する場合は、原則として次の通りです.1.両方が基本タイプの場合、一つがブールタイプの場合、優先呼び出しNumber()ブールタイプを0/1に変換します.2.両方が基本タイプの場合、一つは文字列で、一つは数字タイプの場合、優先呼び出しNumber()文字列を数字に変換する.3.基本タイプと引用タイプを比較する場合、優先的に対象を呼び出したvalueOf()基本タイプに変換し、戻りが基本タイプでない場合は再呼び出しtoString()方法を返し、文字列タイプに変換して比較する.4.引用の種類と引用の種類を比較する場合、比較するのは両者の引用の住所であり、同じ参照ではない.5.特例、null == undefinednull、undefinedと他の比較は全部false==三イコール、厳密イコール、両者のタイプを先に比較し、両者の内容を比較する.
    二、違います
    まとめ:違った比較にNumber()が必要な変数はBooleanNumberStringの3種類で、valueOf()とtoString()がObject、Aray、Funct、Dateなどが必要です.
    //Nmuber()
    Number(true) // 1
    Number(false) // 0
    Number(1) // 1
    Number("1") // 1
    
    //valueOf
    ({a:'1'}).valueOf() // {a: "1"}
    [1,2,3].valueOf() // [1, 2, 3]
    (function test(){}).valueOf() // ƒ test(){}
    (new Date('2020-05-26')).valueOf() // 1590451200000
    
    // toString
    ({a:'1'}).toString() // "[object Object]"
    [1,2,3].toString() // "1,2,3"
    (function test(){}).toString() // "function test(){}"
    (new Date('2020-05-26')).toString() // "Tue May 26 2020 08:00:00 GMT+0800 (      )"
    
    Date , toString , [] toString '';{} toSting "[object Object]"三、実例(各種演算子解析付き)
    1.シンプルなタイプの比較
    1 == true //true // Number Boolean
    2 == true //false
    1 == "1"  //true // Number String
    [] == ""  //true // Object String
    [] == false // true // Object Boolean
    [] == 0   //true // Object Number
    ({}) == "[object Object]" // true
    [] == {}  //false
    [] == []  //false
    {} == {}  //false
    null == undefined //true
    
    2.複雑なタイプの比較
    参照タイプがvalueOf()とtoString()を書き換えた場合も注意してください.toStringが返すのが基本タイプではなく、基本タイプと比較すると異常が発生し、対象と比較すると問題はありません.
    1)valueOfのみを書き換える() , Object.prototype.toString()
    var a = 1;
    var obj = {valueOf: function(){ return {} }}
    a == obj // false
    
    2)valueOf()およびtoString()を書き換えて参照の種類に戻る , , toString()
    var a = 1;
    var obj = {valueOf: function(){ return {} }, toString: function(){ return {}}}
    obj == a // Uncaught TypeError: Cannot convert object to primitive valueat :3:5
    
    , , valueOf() toString()
    var a = 1;
    var obj = {valueOf: function(){ return {} }, toString: function(){ return {}}}
    obj == {} // false
    
    オブジェクトと基本タイプの比較時の呼び出し順序は以下の通りです.属性valueOf->Object.prototype.valueOf->tostring-->Object.prototype.toString
    var a = 1;
    var obj = {valueOf: function(){ return "" }, toString: function(){ return '1'}}
    obj == a
    false
    
    3.ifアプリケーションシーン
    ifはブール値trueとの比較と見なすことができる.
    if(true) console.log("true"); //true
    if(false) console.log("true");
    if(1) console.log("true"); //true
    if(0) console.log("true"); 
    if(-1) console.log("true"); //true
    if("true") console.log("true"); //true
    if("1") console.log("true"); //true
    if("0") console.log("true"); //true
    if("") console.log("true");
    if(null) console.log("true");
    if(undefined) console.log("true");
    if("null") console.log("true"); //true
    if("undefined") console.log("true"); //true
    if([]) console.log("true"); //true
    if({}) console.log("true"); //true
    if([0]) console.log("true"); //true
    if(NaN) console.log("true");
    
    4.落とし穴
    エラー:
    0 == "0"  //true
    0 == []   //true
    "0" == [] // false
    [] == '' // true
    '0' == '' //false
    "aabs"-'A' // NaN
    "aabs"+'A' // "aabsA"
    
    "0" == [] false[].toString()の後は文字列が空で、==伝達性がない、==を備えています.
    5.加算
    任意の変数の前に加算ができます.すなわち、Numberの強制変換です.
    +undefined // NaN
    +null // 0
    +true // 1
    +false // 0
    +"123" // 123
    +1 // 1
    +{} // NaN
    +[] // 0
    +(new Date('2020-05-27')) // 1590537600000
    +(function(){}) // NaN
    
    当ててみます:[]+[]+{}、{}+[]、{}+{}の結果はそれぞれ何ですか?答え:“”、“object Object”、0、“object Object”はあなたの考えと同じですか?𗺲答えは詳しく分かりますが、変数を足すにはどのような規則がありますか?同様に遵守します.1.基本タイプを加算し、文字列がある場合は文字列のつづり合わせで、文字列1を返します.基本タイプが加算され、文字列がない場合はNumber()を優先して加算し、数字3を返します.引用タイプがある場合は、優先的にvalueOf、tostringを基本タイプに変えて、上記の2つの原則で加算します.
    6.乗除法
    掛け算
    1*undefined // NaN
    1*null // 0
    1*true // 1
    1*false // 0
    1*"123" // 123
    1*1 // 1
    1*{} // NaN
    1*[] // 0
    1*(new Date('2020-05-27')) // 1590537600000
    1*(function(){}) // NaN
    "2"*[] // 0
    ({})*[] // NaN
    
    法を割る
    1/undefined // NaN
    1/null // Infinity
    1/true // 1
    1/false // 0
    1/"123" // 1/123
    1/1 // 1
    1/{} // NaN
    1/[] // Infinity
    1/(new Date('2020-05-27')) // 1/1590537600000
    1/(function(){}) // NaN
    "2"/[] // Infinity
    ({})/[] // NaN
    
    7.減算
    1-undefined // NaN
    1-null // 1
    1-true // 0
    1-false // 1
    1-"123" // -122
    1-1 // 0
    1-{} // NaN
    1-[] // 1
    1-(new Date('2020-05-27')) // -1590537599999
    1-(function(){}) // NaN
    "2"-[] // 2
    ({})-[] // NaN
    "aabs"-'A' // NaN
    
    8.余を求める
    1%undefined // NaN
    1%null // NaN
    1%true // 0
    1%false // NaN
    1%"123" // 1
    1%1 // 0
    1%{} // NaN
    1%[] // NaN
    1%(new Date('2020-05-27')) // 1
    1%(function(){}) // NaN
    "2"%[] // NaN
    ({})%[] // NaN
    "aabs"%'A' // NaN
    
    各種変数Number、toString集合(これらは暗黙的に変換されることを覚えておく)
    Numberは以下の通りです
    パラメータ
    結果
    undefined
    NaN
    null
    +0
    bollan
    trueは1に変換され、falseは+0に変換されます.
    number
    変換なし
    ストリングス
    文字列から数値に解析します.例えば、「324」は324に変換される.
    Aray
    []は0;[基本タイプ]は基本タイプのNumber後の値です.その他は全部NaNです
    Object
    NaN
    toStringまたは文字列変換の結果は以下の通りです.
    パラメータ
    結果
    undefined
    「undefined」
    null
    「null」
    bollan
    「true」または「false」
    number
    数字は文字列として使われます.例えば、「1.765」
    ストリングス
    変換なし
    Aray
    []为';他には、例えば、[null,46,{},undefined,new Date(‘2020-05-27]),[].toString()/",46,[object Object],Wed May 27 2020 08:00 GMT+0800(中国標準時間),"
    Object
    「[object Object]」
    参考記事:https://dorey.github.io/JavaScript-Equality-Table/#three-equals