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() を必要とするBoolean
Object 、 Array、 Function、Date などのNumber
3 つ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