プログラミングの過程で、2 つの変数が等しいかどうかを判断する場面によく遭遇しますが、ECMAscript には 2 つの等価演算子「==」と「===」が用意されています。操作はブール値を返します。一般に、「== が等しい」および「=== が合同」と呼ばれます。
比較される 2 つの変数のデータ型が一貫している場合、状況は比較的単純ですが、演算子の両側の変数の型が一致していない場合、または変数の 1 つがオブジェクトである場合、状況はさらに複雑ですが、オペランドの型が異なる場合に演算結果がどうなるかを別途紹介します。
合同演算子「===」
合同演算子「===」 状況は比較的単純です。合同演算子「===」を用いて判定する場合は、まず演算子の両辺のオペランドのデータ型が一致しているかどうかを確認し、一致していない場合はそのまま false を返します。一致していない場合は次の判定が行われます。作られる。
2 つのブール値の比較の場合、「===」が true を返す前に、「===」の両側が両方とも true または false である必要があり、そうでない場合は false が返されます。2 つの比較が数値の場合は、次のようになります。 Only if 2 つの数値のサイズが等しい場合にのみ True が返され、それ以外の場合は false が返されます。
比較する 2 つの変数が文字列の場合、まず 2 つの文字列の長さを比較して等しいかどうかを確認します。長さが異なる場合は false を返します。等しい場合は、先頭から開始します。 2 つの変数。文字が等しいかどうかの比較が開始され、最後の桁まで継続されます。桁の 1 つが待ちたくない場合は false が返され、そうでない場合は true が返されます。
(注: 文字列の比較ではスペースは無視されません。そのため、2 つの文字列が等しいかどうかを比較するときは、安全性を確保するために、まずスペースを削除してから、2 つの文字列を大文字の Or に変換する必要があります。小文字にしてから比較します)。
null は、null===null の場合にのみ true を返し、それ以外の場合は false を返します。同様に、unknown は、unknown===unknown の場合にのみ true を返し、それ以外の場合は false を返します。例:
true === 1 //false "1" === 1 //false //boolean的比较 true === true //true true === false //false //string的比较 "hello" === "helloworrld" //false "hello" === "world" //false "hello" === " hello" //false "hello" === "hellO" //false "hello" === "hello" //true //number的比较 1 === 1 //true 1 === 1.0 //true 1 === 1.2 //false //null和undefined的比较 undefined === undefined //true null === null //true undefined === null //false,两者在"=="时才返回true
「===」比較の2つのオペランドが基本型の値ではなく2つのオブジェクトの場合、このときの判断基準は2つの変数が「同じ」かどうかです。 Object
var a,b,c; a = b = { name : '柳轻侯', city : '南京' }; c = { name : '柳轻侯', city : '南京' }; a === b //true a === c //false
2 つのオブジェクトが「同じに見える」だけでは十分ではありません。a と c はどちらも Object インスタンスであり、同じプロパティと値を持っていますが、「同じ」オブジェクトではありません。なぜなら、a と c は実際には 2 つの異なるインスタンスを指しているため、2 つのオブジェクトは一致しないからです。
しかし、a と b は同じオブジェクトを指します。つまり、a と b は同じオブジェクトの別のエイリアスです。実際にはまったく同じオブジェクトを指すため、a === b となります。 「!==」と「===」の比較ルールは同じなので、ここでは繰り返しません。
等値演算子」==”
合同演算子が判定を行う際、2 つの変数の型が異なる場合は、直接は false を返しますが、これとは異なり、「==」等価演算子で判定する場合、2 つの変数の型が異なる場合は、比較対象の 2 つの値を同じに変換する暗黙の型変換が行われます。型は再度比較されますが、変換規則は何ですか?
異なるデータ型を変換する場合、等価演算子と不等号演算子は次の基本規則に従います。
#2 つのオペランドは比較時に次の規則に従います
ここで、NaN == NaN は false を返すことに注意してください。NaN は数値ではない、つまりオペランドが非数値であることを意味します。この非数値は不確実です。値は不明です。また、JavaScript 構文を使用して表現することさえできない場合があります。このような未知の量は、特定の比較には使用できません。2 つの未知の値が何であるかを決定できない場合、当然、NaN == NaN とは言えません。
では、「==」を使用して比較することはできないので、変数が NaN であるかどうかをどのように判断すればよいでしょうか? 等価性を使用して判断することはできないため、逆の「!=」を使用することもできます。変数が NaN に等しくないかどうかを判断します。例:
//如果需要判定一个变量是不是NaN,可以如下 //a是你需要判定的变量 if((typeof a === "number") && a != NaN ){ //此处需要注意,NaN也是number类型 //TODO }
一般的な比較状況とその結果
null == undefined // true "NaN" == NaN // false 5 == NaN // false NaN == NaN // false NaN != NaN // true false == 0 // true true == 1 // true true == 2 // false undefined == 0 // false null == 0 // false "5" == 5 // true
典型的な例の分析
![] == [] //true
这是一道比较容易令人困惑的题,按照正常的思维模式,对一个操作数逻辑取反,跟这个操作数本身的值是相对的,如果这个操作数本身的值是true,那么取反之后就是false,反之,如果这个操作数的值是false,那么对其逻辑取反之后就是true,无论如何也不会是同一个值,可是事实上却是![] == []。
首先,![]的值是false,因为这里[]被当成了一个数组的实例,是一个对象,而对象都是真值,对其取反,得到一个假值,也就是false。
其次看等号右边,[]是一个对象,要将其转为基本类型值,会先调用数组的valueOf方法,而数组的valueOf方法返回数组本身,没有得到一个基本值。
这时候要继续调用数组的toString方法,得到一个””空字符串,所以这时候也就变成了false == “”是否为真的问题了,而根据前面的规则,如果有一个操作数为boolean值,会将其转为数值,false转化为0。
进而,问题转化为0 == “”是否为真值的问题,当number和string比较时,会将string转为number,而””会转为0。最后,问题变演化成了0 == 0是否为真值,毋庸置疑,结果是true。
这里要注意的就是![],它被当成了一个整体的逻辑值,是直接对对象进行取反,是一个假值,而不是先把[]转化为基本值再取反
小结
“==”在比较不同类型值得时候会进行隐式的类型转化,而”===”不会转化,全等一定相等,相等却不一定全等,这是一个充分不必要条件。
undefined和null相等而不全等,且在相等比较的时候不会转化为其他类型的值。NaN是不等于NaN 的,要判断某个变量是不是NaN,要用”!=”。对象和非对象在进行比较的时候会先转为基本类型值然后再根据上面的规则进行比较。
推荐教程:《JS教程》
以上がJavaScript の等価演算子に関する簡単な説明: == と === の違いの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。