[] ==![]どうしたのですか。

この比較がどこかに見られるのを覚えているわけではありませんが、当時は強制的な変換について理解していなかったので、この記事を読んでいます。タイトルの表現で拡張したいと思いましたか?それから、[] ==![]がどのように変換されるかについて直接間違っています。

  1. 実際には、上記の説明はそんなに多く、日常の開発環境で使用されるほど判断条件として使用する必要があります、+、==これらの3つのケース、これらの3つの最も一般的な判断の条件、この状況それは最も簡単なものです。
  2. 実際には、上記の説明はそんなに多く、日常の開発環境で使用されるほど判断条件として使用する必要があります、+、==これらの3つのケース、これらの3つの最も一般的な判断の条件、この状況それは最も簡単なものです。
  3. 実際には、上記の説明はそんなに多く、日常の開発環境で使用されるほど判断条件として使用する必要があります、+、==これらの3つのケース、これらの3つの最も一般的な判断の条件、この状況それは最も簡単なものです。
  4. 実際には、上記の説明はそんなに多く、日常の開発環境で使用されるほど判断条件として使用する必要があります、+、==これらの3つのケース、これらの3つの最も一般的な判断の条件、この状況それは最も簡単なものです。
  5. 実際には、上記の説明はそんなに多く、日常の開発環境で使用されるほど判断条件として使用する必要があります、+、==これらの3つのケース、これらの3つの最も一般的な判断の条件、この状況それは最も簡単なものです。

はじめに

この記事では、jsの強制規則と強制を引き起こすいくつかのシナリオを要約します。 ES6規格では、未定義、Null、String、Number、Boolean、およびSymbolの6つのプリミティブ型が定義されています。この記事のキャスティングとは、コードが表示する特定の変換操作ではなく、コードの実行中に値をトリガーする暗黙的な変換のことです。

プリミティブ型間のキャスト

他の型はString、Number、またはBoolean型に変換されることを個人的に理解しているときに、プリミティブ型間で発生する変換。

文字列型に変換

他のプリミティブ型をString型に変換するのは通常、+の両側に文字列があり、反対側の値がString型に変換されるときです。
次のコードを見てください。

var strAddNum = "test" + 1;
var numAddStr = 1 + "test";
var boolAddStr = true + "test";
var undAddStr = undefined + "";
var nullAddStr = null + "";
console.log(strAddNum);
console.log(numAddStr);
console.log(boolAddStr);
console.log(undAddStr);
console.log(nullAddStr);
复制代码

コードパスゲートの結果、上記のコードが実行されます文字列です。他のプリミティブ型からString型への変換は、基本的に次のようにその値の文字列形式です。

  • 実際には、上記の説明はそんなに多く、日常の開発環境で使用されるほど判断条件として使用する必要があります、+、==これらの3つのケース、これらの3つの最も一般的な判断の条件、この状況それは最も簡単なものです。
  • 実際には、上記の説明はそんなに多く、日常の開発環境で使用されるほど判断条件として使用する必要があります、+、==これらの3つのケース、これらの3つの最も一般的な判断の条件、この状況それは最も簡単なものです。
  • 実際には、上記の説明はそんなに多く、日常の開発環境で使用されるほど判断条件として使用する必要があります、+、==これらの3つのケース、これらの3つの最も一般的な判断の条件、この状況それは最も簡単なものです。
  • 実際には、上記の説明はそんなに多く、日常の開発環境で使用されるほど判断条件として使用する必要があります、+、==これらの3つのケース、これらの3つの最も一般的な判断の条件、この状況それは最も簡単なものです。
  • 実際には、上記の説明はそんなに多く、日常の開発環境で使用されるほど判断条件として使用する必要があります、+、==これらの3つのケース、これらの3つの最も一般的な判断の条件、この状況それは最も簡単なものです。
  • 実際には、上記の説明はそんなに多く、日常の開発環境で使用されるほど判断条件として使用する必要があります、+、==これらの3つのケース、これらの3つの最も一般的な判断の条件、この状況それは最も簡単なものです。
  • 実際には、上記の説明はそんなに多く、日常の開発環境で使用されるほど判断条件として使用する必要があります、+、==これらの3つのケース、これらの3つの最も一般的な判断の条件、この状況それは最も簡単なものです。

特定の例については、 ES2018セクション7.1.12.1 を参照してください。

注:Symbol型をString型に変換することはできません。

数値型に変換

Number型への変換の場合、+ – * /%の演算では、+を除くすべての演算はNumber型に変換され、+演算は両側でString型を満たす必要があり、値はNumber型に変換されます。 。 +演算の場合はより複雑であり、関連する変換規則については後で説明する。次のコードを見てください。

var trueAddTrue = true + true;
var trueAddFalse = true + false;
var trueAdda0 = true + 0;
var nullAddTrue = null + true;
var undefinedAdd0 = undefined + 0;
var strAdd0 = "" + 0;
console.log(trueAddTrue);
console.log(trueAddFalse);
console.log(trueAdda0);
console.log(nullAddTrue);
console.log(undefinedAdd0);
console.log(strAdd0);
复制代码

コードポータルをご覧になり、コードを実行する前にご検討ください。上記のコード回答印刷の結果は何ですか?それを実行して、それがあなたの期待を満たしているかどうかを確かめます。他のプリミティブ型は、次のように数値型に変換されます。

  • 実際には、上記の説明はそんなに多く、日常の開発環境で使用されるほど判断条件として使用する必要があります、+、==これらの3つのケース、これらの3つの最も一般的な判断の条件、この状況それは最も簡単なものです。
  • 実際には、上記の説明はそんなに多く、日常の開発環境で使用されるほど判断条件として使用する必要があります、+、==これらの3つのケース、これらの3つの最も一般的な判断の条件、この状況それは最も簡単なものです。
  • 実際には、上記の説明はそんなに多く、日常の開発環境で使用されるほど判断条件として使用する必要があります、+、==これらの3つのケース、これらの3つの最も一般的な判断の条件、この状況それは最も簡単なものです。
  • 実際には、上記の説明はそんなに多く、日常の開発環境で使用されるほど判断条件として使用する必要があります、+、==これらの3つのケース、これらの3つの最も一般的な判断の条件、この状況それは最も簡単なものです。
  • 実際には、上記の説明はそんなに多く、日常の開発環境で使用されるほど判断条件として使用する必要があります、+、==これらの3つのケース、これらの3つの最も一般的な判断の条件、この状況それは最も簡単なものです。
  • 実際には、上記の説明はそんなに多く、日常の開発環境で使用されるほど判断条件として使用する必要があります、+、==これらの3つのケース、これらの3つの最も一般的な判断の条件、この状況それは最も簡単なものです。

注:Symbol型をNumber型に変換することはできません。

ブール型に変換

ブール型への変換はより簡単ですが、次の場合はブール型に変換されます。

  • 実際には、上記の説明はそんなに多く、日常の開発環境で使用されるほど判断条件として使用する必要があります、+、==これらの3つのケース、これらの3つの最も一般的な判断の条件、この状況それは最も簡単なものです。
  • 実際には、上記の説明はそんなに多く、日常の開発環境で使用されるほど判断条件として使用する必要があります、+、==これらの3つのケース、これらの3つの最も一般的な判断の条件、この状況それは最も簡単なものです。
  • 実際には、上記の説明はそんなに多く、日常の開発環境で使用されるほど判断条件として使用する必要があります、+、==これらの3つのケース、これらの3つの最も一般的な判断の条件、この状況それは最も簡単なものです。
  • 実際には、上記の説明はそんなに多く、日常の開発環境で使用されるほど判断条件として使用する必要があります、+、==これらの3つのケース、これらの3つの最も一般的な判断の条件、この状況それは最も簡単なものです。

プリミティブ型へのオブジェクトキャスト

ESでオブジェクトをプリミティブ型に変換するアルゴリズムは、次の3つの場合として大まかに説明できます。

  1. 実際には、上記の説明はそんなに多く、日常の開発環境で使用されるほど判断条件として使用する必要があります、+、==これらの3つのケース、これらの3つの最も一般的な判断の条件、この状況それは最も簡単なものです。
  2. 実際には、上記の説明はそんなに多く、日常の開発環境で使用されるほど判断条件として使用する必要があります、+、==これらの3つのケース、これらの3つの最も一般的な判断の条件、この状況それは最も簡単なものです。
  3. 実際には、上記の説明はそんなに多く、日常の開発環境で使用されるほど判断条件として使用する必要があります、+、==これらの3つのケース、これらの3つの最も一般的な判断の条件、この状況それは最も簡単なものです。
  4. 実際には、上記の説明はそんなに多く、日常の開発環境で使用されるほど判断条件として使用する必要があります、+、==これらの3つのケース、これらの3つの最も一般的な判断の条件、この状況それは最も簡単なものです。
  5. 実際には、上記の説明はそんなに多く、日常の開発環境で使用されるほど判断条件として使用する必要があります、+、==これらの3つのケース、これらの3つの最も一般的な判断の条件、この状況それは最も簡単なものです。

上記の3つのケースのうち、最初のケースが最も優先順位が高く、次の3つのケースが最も優先順位が高いため、どちらを使用シナリオに基づいて決定する必要があります。指定された変換ヒントは、ES標準がアルゴリズムを内部的に呼び出すときに指定されます。

最初のケースでは、SymbolオブジェクトとDateオブジェクトだけに[Symbol.toPrimitive]が組み込まれており、属性のwriteableはfalse、enumeratableはfalse、そして構成可能はtrueです。
オブジェクトが元の型に変換されるときに発生するキャストの特殊なケースは2番目ですが、3番目のケースはまれです。 2番目のケースは通常のコーディング作業で使用され、3番目のケースはほとんど表示されません詳細については、ES規格を参照してください。

var test = {
  [Symbol.toPrimitive]: function(hint) {
     console.log(hint)
  },
  valueOf: function() {
      console.log("valueOf")
  },
  toString: function() {
      console.log("toString")
  }
}
test + "";  //"default"
test * 0;   //"number"
String(test);   //"string"
复制代码

コード転送ゲート上記のコードは、それぞれが指定されていることを示していますテストオブジェクトの[Symbol.toPrimitive]、valueOf、およびtoString関数は監視でき、valueoOfおよびtoString関数は呼び出すことができません指定された[Symbol.toPrimitive]関数はプロンプトパラメータを受け入れることができますキャスト時のキャストです。プロンプトこのようにして、さまざまな変換シナリオに従って、関数にさまざまな値を返すことができます。

元の型をオブジェクトにキャストする(ボクシング)

この問題について説明する前に、元の型をオブジェクトに変換することを余儀なくされているシーン実際には、この種のシーンはjsコードのほぼどこにでも見られるので、次のコードを見てください。

var str = "testString";
str.replace("test", "");
复制代码

上記のコードで定義されているstrの値はオブジェクトではなくString型のプリミティブ型であり、元の型には明らかに呼び出すメソッドはありません。

実際、ここでのstrはstr.replaceを実行し、その値はオブジェクトにキャストされ、String型のインスタンスオブジェクトを取得します。そしてインスタンスのプロトタイプは一連のメソッドを定義し、インスタンスは取得できません。このコード行を実行した後、インスタンスはリサイクルされるので、ここのstrは依然として文字列です。

次のコードを見てください。

var a = 3;
a.fn = function(){};
a.fn();
复制代码

強制のいくつかのシナリオ

キャストがjsコードで発生するシナリオは通常3つあります。

  • 実際には、上記の説明はそんなに多く、日常の開発環境で使用されるほど判断条件として使用する必要があります、+、==これらの3つのケース、これらの3つの最も一般的な判断の条件、この状況それは最も簡単なものです。
  • 実際には、上記の説明はそんなに多く、日常の開発環境で使用されるほど判断条件として使用する必要があります、+、==これらの3つのケース、これらの3つの最も一般的な判断の条件、この状況それは最も簡単なものです。
  • 実際には、上記の説明はそんなに多く、日常の開発環境で使用されるほど判断条件として使用する必要があります、+、==これらの3つのケース、これらの3つの最も一般的な判断の条件、この状況それは最も簡単なものです。
  • 実際には、上記の説明はそんなに多く、日常の開発環境で使用されるほど判断条件として使用する必要があります、+、==これらの3つのケース、これらの3つの最も一般的な判断の条件、この状況それは最も簡単なものです。

+操作

一元+运算

単項演算をするとき、それはNumber型であることを強いられるでしょう、例えば

var a = {
    [Symbol.toPrimitive]: function(hint) {
        console.log(hint);  // number
        if(hint === "number") {
            return 2;
        } else {
            return 9;
        }
    }
};
console.log(+a);   // 2

var b = "3";
console.log(+b);    // 3
复制代码

コードポータル

二元+运算

二項+演算は、いくつかのキャストで複雑さが==比較の2番目にすぎない場合です。

  1. 実際には、上記の説明はそんなに多く、日常の開発環境で使用されるほど判断条件として使用する必要があります、+、==これらの3つのケース、これらの3つの最も一般的な判断の条件、この状況それは最も簡単なものです。
  2. 実際には、上記の説明はそんなに多く、日常の開発環境で使用されるほど判断条件として使用する必要があります、+、==これらの3つのケース、これらの3つの最も一般的な判断の条件、この状況それは最も簡単なものです。
  3. 実際には、上記の説明はそんなに多く、日常の開発環境で使用されるほど判断条件として使用する必要があります、+、==これらの3つのケース、これらの3つの最も一般的な判断の条件、この状況それは最も簡単なものです。
var a = "";
var b = {
    [Symbol.toPrimitive]: function(hint) {
        console.log(hint);  // "default"
        if(hint === "default") {
            return 2;
        } else {
            return 9;
        }
    }
};
var c = a + b;  //这里b转换为原始类型返回的是Number类型2,由于a是"",所以b被转换为"2",后与""拼接返回"2"
console.log(c); // "2"

var d = 3;
var e = {
    [Symbol.toPrimitive]: function(hint) {
        console.log(hint);  // "default"
        if(hint === "default") {
            return 2;
        } else {
            return 9;
        }
    }
};
var f = d + e;  //这里e转换为原始类型返回的是Number类型2,由于两侧均没有String类型,则至第3步,强制转换为Number后返回两侧相加的结果5
console.log(f); // 5

复制代码

コードポータル

– 、*、/、%演算

これらの演算子に含まれる強制はNumber型に変換されるので、単にNumberに変換する方法を考え出すだけです。元の型をNumber型に変換する方法は前述のとおりです。ここで、ObjectをNumberに変換するプロセスを示します。

  1. 実際には、上記の説明はそんなに多く、日常の開発環境で使用されるほど判断条件として使用する必要があります、+、==これらの3つのケース、これらの3つの最も一般的な判断の条件、この状況それは最も簡単なものです。
  2. 実際には、上記の説明はそんなに多く、日常の開発環境で使用されるほど判断条件として使用する必要があります、+、==これらの3つのケース、これらの3つの最も一般的な判断の条件、この状況それは最も簡単なものです。
var a = 8;
var b = {
    [Symbol.toPrimitive]: function(hint) {
        console.log(hint);  // "number"
        if(hint === "number") {
            return 2;
        } else {
            return 9;
        }
    }
};
console.log(a-b);   //  6
console.log(a/b);   // 4
console.log(a*b);   // 16
console.log(a%b);   // 0

console.log(undefined * 0);   //NaN
console.log(null * -1); // 0
console.log(false * -1);    //0 
console.log(true * -1); // -1
console.log("1" * -1);  // -1
复制代码

コードポータル

==比較

==比较的基础===比较

x === y、具体的な比較手順は次のとおりです。

  1. 実際には、上記の説明はそんなに多く、日常の開発環境で使用されるほど判断条件として使用する必要があります、+、==これらの3つのケース、これらの3つの最も一般的な判断の条件、この状況それは最も簡単なものです。
  2. 実際には、上記の説明はそんなに多く、日常の開発環境で使用されるほど判断条件として使用する必要があります、+、==これらの3つのケース、これらの3つの最も一般的な判断の条件、この状況それは最も簡単なものです。
  3. 実際には、上記の説明はそんなに多く、日常の開発環境で使用されるほど判断条件として使用する必要があります、+、==これらの3つのケース、これらの3つの最も一般的な判断の条件、この状況それは最も簡単なものです。
  4. 実際には、上記の説明はそんなに多く、日常の開発環境で使用されるほど判断条件として使用する必要があります、+、==これらの3つのケース、これらの3つの最も一般的な判断の条件、この状況それは最も簡単なものです。
  5. 実際には、上記の説明はそんなに多く、日常の開発環境で使用されるほど判断条件として使用する必要があります、+、==これらの3つのケース、これらの3つの最も一般的な判断の条件、この状況それは最も簡単なものです。
  6. 実際には、上記の説明はそんなに多く、日常の開発環境で使用されるほど判断条件として使用する必要があります、+、==これらの3つのケース、これらの3つの最も一般的な判断の条件、この状況それは最も簡単なものです。
  7. 実際には、上記の説明はそんなに多く、日常の開発環境で使用されるほど判断条件として使用する必要があります、+、==これらの3つのケース、これらの3つの最も一般的な判断の条件、この状況それは最も簡単なものです。
  8. 実際には、上記の説明はそんなに多く、日常の開発環境で使用されるほど判断条件として使用する必要があります、+、==これらの3つのケース、これらの3つの最も一般的な判断の条件、この状況それは最も簡単なものです。

x == y规则

==比較変換規則、もう少しですが、実際にはいくつかの規則があります両側の数値型は変換するものと同じですが、次のように2回回転する必要がある場合があります。

  1. 実際には、上記の説明はそんなに多く、日常の開発環境で使用されるほど判断条件として使用する必要があります、+、==これらの3つのケース、これらの3つの最も一般的な判断の条件、この状況それは最も簡単なものです。
  2. 実際には、上記の説明はそんなに多く、日常の開発環境で使用されるほど判断条件として使用する必要があります、+、==これらの3つのケース、これらの3つの最も一般的な判断の条件、この状況それは最も簡単なものです。
  3. 実際には、上記の説明はそんなに多く、日常の開発環境で使用されるほど判断条件として使用する必要があります、+、==これらの3つのケース、これらの3つの最も一般的な判断の条件、この状況それは最も簡単なものです。
  4. 実際には、上記の説明はそんなに多く、日常の開発環境で使用されるほど判断条件として使用する必要があります、+、==これらの3つのケース、これらの3つの最も一般的な判断の条件、この状況それは最も簡単なものです。
  5. 実際には、上記の説明はそんなに多く、日常の開発環境で使用されるほど判断条件として使用する必要があります、+、==これらの3つのケース、これらの3つの最も一般的な判断の条件、この状況それは最も簡単なものです。
  6. 実際には、上記の説明はそんなに多く、日常の開発環境で使用されるほど判断条件として使用する必要があります、+、==これらの3つのケース、これらの3つの最も一般的な判断の条件、この状況それは最も簡単なものです。

ちょっと直感に反するかもしれないいくつかの比較はここにあります。

"0" == false; // true
false == 0; // true
false == ""; // true
false == []; // true
"" == 0; // true
"" == []; // true
0 == []; // true
[] == ![];  //true
复制代码

条件として判断する

未定義のnull、+ 0、 – 0、NaNを除いて、基本的にこれら6つの値はfalseになりますが、それ以外の場合はすべて真です;

ブール型ではない値がキャストされるケースは

  1. 実際には、上記の説明はそんなに多く、日常の開発環境で使用されるほど判断条件として使用する必要があります、+、==これらの3つのケース、これらの3つの最も一般的な判断の条件、この状況それは最も簡単なものです。
  2. 実際には、上記の説明はそんなに多く、日常の開発環境で使用されるほど判断条件として使用する必要があります、+、==これらの3つのケース、これらの3つの最も一般的な判断の条件、この状況それは最も簡単なものです。
  3. 実際には、上記の説明はそんなに多く、日常の開発環境で使用されるほど判断条件として使用する必要があります、+、==これらの3つのケース、これらの3つの最も一般的な判断の条件、この状況それは最も簡単なものです。
  4. 実際には、上記の説明はそんなに多く、日常の開発環境で使用されるほど判断条件として使用する必要があります、+、==これらの3つのケース、これらの3つの最も一般的な判断の条件、この状況それは最も簡単なものです。
  5. 実際には、上記の説明はそんなに多く、日常の開発環境で使用されるほど判断条件として使用する必要があります、+、==これらの3つのケース、これらの3つの最も一般的な判断の条件、この状況それは最も簡単なものです。

結論

実際には、上記の説明はそんなに多く、日常の開発環境で使用されるほど判断条件として使用する必要があります、+、==これらの3つのケース、これらの3つの最も一般的な判断の条件、この状況それは最も簡単なものです。

元のリンク