JavaScript の究極のインタビューの質問: null == unknown、[]+{}、{}+{} などの結果は何ですか? すべて読むと、八経絡を開くことができ、あらゆるオブジェクトに対して計算を実行できるようになります。

1. 平等の原則

JavaScript には、未定義、Null、ブール、数値、文字列の 5 つの基本的な変数タイプと、その他のオブジェクト タイプである配列、関数、日付などがあります。
==: 等しい、2 つの内容を比較するときは 2 つの状況があります: 1. 2 つの型は異なり、暗黙的な変換が行われます; 2. 2 つの型は同じで、内容は直接比較されます。暗黙的な変換が実行されるときは、次の原則に従います
:
1. 両方が基本型で、一方がブール型の場合、最初に呼び出しが行われ、Number()ブール型を 0/1 に変換します;
2. 両方が基本型で、一方が 0/1 である場合、文字列ともう一方が数値型の場合、呼び出しが最初に行われます。Number()文字列を数値に変換します。3
.基本型参照型を比較す​​る場合、オブジェクトvalueOf()は最初に基本型に変換されます。戻り値の型が a でない場合、オブジェクトは最初に基本型に変換されます。基本型の場合、toString()メソッドが呼び出され、文字列型に変換されて比較されます;
4.参照型参照型を比較す​​る場合、2 つの参照のアドレスが比較されます。同じ参照が異なるわけではありません。
5. 特殊な場合null == undefined、 、null、unknown などとの比較はすべてfalse
=== です。3 つの等しい、厳密に等しい、最初に 2 つの型を比較し、次に 2 つの内容を比較します。

2. 違い

概要:比較に Number() を必要とする変数には、 valueOf() と toString() を必要とするBooleanObject 、 Array、 Function、Date などのNumber3 つStringのタイプがあります。

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

3. 例(さまざまな演算子の分析付き)

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 <anonymous>:3:5

和引用类型比较时,不会报错,因为valueOf()和toString()都没有调用直接比较的引用地址

var a = 1;
var obj = {
    
    valueOf: function(){
    
     return {
    
    } }, toString: function(){
    
     return {
    
    }}}
obj == {
    
    } // false

オブジェクトを基本型と比較する場合、呼び出しシーケンスは次のとおりです。attribute 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.追加

加算は任意の変数の前で使用できます。つまり、数値の強制変換です。

+undefined // NaN
+null // 0
+true // 1
+false // 0
+"123" // 123
+1 // 1
+{
    
    } // NaN
+[] // 0
+(new Date('2020-05-27')) // 1590537600000
+(function(){
    
    }) // NaN

推測: []+[]、[]+{}、{}+[]、{}+{} の結果は何でしょうか?
答え: "", "[オブジェクト オブジェクト]", 0, "[オブジェクト オブジェクト][オブジェクト オブジェクト]"
それはあなたの考えと同じですか? ☞解答の詳しい解説 では、
変数を追加する際にはどのようなルールに従えばよいのでしょうか?1.基本型の
追加. 文字列がある場合は文字列の連結であり、文字列1を返す基本型の追加. 文字列がない場合は最初に Number() が使用されます型を参照するときは、まず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 コレクション (これらは暗黙的に変換されることに注意してください)

番号は次のとおりです。

パラメータ 結果
未定義 NaN
ヌル +0
ブール値 true は 1 に変換され、false は +0 に変換されます。
番号 変換は必要ありません
文字列から数値に解析されます。たとえば、「324」は 324 に変換されます。
配列 []は0、[基本型]は基本型数値の後の値、その他はNaN
物体 NaN

toString または string への変換の結果は次のようになります。

パラメータ 結果
未定義 "未定義"
ヌル "ヌル"
ブール値 "正しいか間違っているか"
番号 文字列としての数値。たとえば、「1.765」
変換は必要ありません
配列 [] は ''; その他、例: [null,46,{},unknown,new Date('2020-05-27'),[]].toString() // ",46,[object Object] 、2020 年 5 月 27 日水曜日 08:00:00 GMT+0800 (中国標準時)、
物体 「[オブジェクト オブジェクト]」

参考記事: https:
//dorey.github.io/JavaScript-Equality-Table/#three-equals

おすすめ

転載: blog.csdn.net/qq_29510269/article/details/106349773