jsにおける等価判定 ===, == と Object.is() の違い

angryTom
リリース: 2019-11-30 13:31:07
転載
2193 人が閲覧しました

jsにおける等価判定 ===, == と Object.is() の違い

JS を初めて使用する人は、その等価性の判断に混乱すると思います。次のコードを見てください。いくつ正解できますか?

NaN === NaN // false
NaN == NaN // false
Object.is(NaN, NaN) // true
0 == false  // true
1 == true   // true
Number(null) === 0  // true
null == 0   // false
ログイン後にコピー

Javascript には、厳密な等価、緩い等価、Object.is という 3 つの異なる値比較演算があります。今日情報を確認してまとめてみました。以下の内容が皆様のお役に立てれば幸いです。お願いします。間違いがある場合は、修正していただければ幸いです。

[関連コースの推奨事項: JavaScript ビデオ チュートリアル]

1.厳密等価 x === y 判定ロジック

1. x のデータ型が y のデータ型と異なる場合、false を返します;

2. x が数値の場合type

#● x は NaN、return false

#● y は NaN、return false

#● x の値は y の値と等しい、return true

#x は 0、y は -0、true を返します

##● x は -0、y は 0、true を返します

##● それ以外の場合は false

# を返します3. 他の型は SameValueNonNumber(x, y) を参照します。

#● アサーション: x, y は Number 型ではありません。

#● アサーション: x、y は同じデータ型です。

#x は未定義、y は未定義、true を返す;

#● x が null、y が null、true を返す;

#● x が文字列型である場合にのみ、 x と y の文字シーケンスがまったく同じ (長さが同じで、各位置の文字が同じ) は true を返し、それ以外の場合は false を返します。

## ● x がブール型の場合、次の場合は true を返します。 x と y は両方とも true または false、それ以外の場合は false を返します ;

#● x がシンボル型の場合、x と y が同じシンボル値の場合は true を返し、それ以外の場合は false を返します;

● x、y が同じオブジェクト値の場合は true を返し、そうでない場合は false を返します;

NaN === NaN // false
undefined === undefined // true
null === null   // true
undefined === null  // false
ログイン後にコピー

2. 緩和等価 x == y

1. If x and y が同じ型の場合、x===y の結果を返します ;

2. x が null、y が未定義の場合は、true を返します;

3. x が未定義の場合、y null の場合、true を返します;

4. x が数値で y が文字列の場合、x == ToNumber(y) を返します;

5. x が文字列であり、かつy が数値の場合は、ToNumber(x) == y;

6. x がブール型の場合は、ToNumber(x)==y;

##7 の結果を返します。 y が Boolean 型の場合、x==ToNumber(y);

8. x が String、Number、Symbol のいずれかで、Type(y) が Object の場合、x の結果を返します。 ==ToPrimitive(y)

9. Type(x) が Object で、Type (y) が String、Number、Symbol のいずれかの場合、ToPrimitive(x)==y

の結果を返します。

10. その他は false を返します

12 == '0xc' // true, 0xc是16进制
12 == '12'  // true
12 == '12c' // false, 说明ToNumber转换是用的Number()方法
ログイン後にコピー

注:

Number(null) === 0
ログイン後にコピー

But

null == 0 // false,
ログイン後にコピー

2.1 ToNumber は値を数値型に変換します

1. ブール型の場合、true は 1 を返し、false は 0 を返します;

2. 数値の場合は、単純に渡されて返されます。

3. null の場合は 0

jsにおける等価判定 ===, == と Object.is() の違い4 を返します。未定義の場合は NaN を返します。#5. 文字列の場合、文字列に数字のみが含まれている場合は、 10 進数に変換します。有効な浮動小数点形式の場合は、対応する浮動小数点値に変換します。2 進数または 16 進数の場合は、対応する 10 進数に変換します。

6.オブジェクトの場合は、オブジェクトの valueOf() メソッドを呼び出して、前のルールに従って変換します。valueOf 戻り値が NaN の場合は、toString() メソッドを呼び出して、返された文字列を前のルールに従って変換します。

2.2 ToPrimitive

toPrimitive(A) A.toString() メソッドと A.valueOf() メソッドを呼び出して、パラメータ A をプリミティブ値 (Primitive) に変換します。

##JS のプリミティブ型は次のとおりです: Number、String、Boolean、Null、Unknown;

さまざまな種類のオブジェクトの valueOf() メソッドの戻り値:

Object戻り値

Array

配列オブジェクト自体を返します。 日付FunctionNumber#オブジェクトオブジェクト自体。これはデフォルトです。カスタム オブジェクトの valueOf メソッド #StringString value をオーバーライドできます。
// Array:返回数组对象本身
var array = ["ABC", true, 12, -5];
console.log(array.valueOf() === array);   // true
// Date:当前时间距1970年1月1日午夜的毫秒数
var date = new Date(2013, 7, 18, 23, 11, 59, 230);
console.log(date.valueOf());   // 1376838719230
// Number:返回数字值
var num =  15.26540;
console.log(num.valueOf());   // 15.2654
// 布尔:返回布尔值true或false
var bool = true;
console.log(bool.valueOf() === bool);   // true
// new一个Boolean对象
var newBool = new Boolean(true);
// valueOf()返回的是true,两者的值相等
console.log(newBool.valueOf() == newBool);   // true
// 但是不全等,两者类型不相等,前者是boolean类型,后者是object类型
console.log(newBool.valueOf() === newBool);   // false
// Function:返回函数本身
function foo(){}
console.log( foo.valueOf() === foo );   // true
var foo2 =  new Function("x", "y", "return x + y;");
console.log( foo2.valueOf() );
/*
ƒ anonymous(x,y
) {
return x + y;
}
*/
// Object:返回对象本身
var obj = {name: "张三", age: 18};
console.log( obj.valueOf() === obj );   // true
// String:返回字符串值
var str = "http://www.xyz.com";
console.log( str.valueOf() === str );   // true
// new一个字符串对象
var str2 = new String("http://www.xyz.com");
// 两者的值相等,但不全等,因为类型不同,前者为string类型,后者为object类型
console.log( str2.valueOf() === str2 );   // false
ログイン後にコピー

3.同值相等

同值相等由 Object.is 方法判断:

● 两个值都是 undefined

● 两个值都是 null

● 两个值都是 true 或者都是 false

● 两个值是由相同个数的字符按照相同的顺序组成的字符串

● 两个值指向同一个对象

● 两个值都是数字并且

○ 都是正零 +0,

○ 或者都是负零 -0,

○ 或者都是 NaN

○ 都是除零和 NaN 外的其它同一个数字

Object.is('foo', 'foo');     // true
Object.is(window, window);   // true
Object.is('foo', 'bar');     // false
Object.is([], []);           // false
var foo = { a: 1 };
var bar = { a: 1 };
Object.is(foo, foo);         // true
Object.is(foo, bar);         // false
Object.is(null, null);       // true
Object.is(true, 'true')     // false
// 特例
Object.is(0, -0);            // false
Object.is(0, +0);            // true
Object.is(-0, -0);           // true
Object.is(NaN, 0/0);         // true
ログイン後にコピー

4.零值相等

与同值相等类似,不过会认为 +0 与 -0 相等。

小结

=== 不做类型转换,当两边的数类型不相同时,直接返回false;当前类型相同且都是数值类型的时候,有一个是NaN,那么结果就是false, 另外 +0 === -0

==运算符,当两边操作数类不相同时会做隐式转换,然后才进行比较,这样的话就会出现 false == 0, '' == false 等现象, 但是Object.is不会做这种转换

本文来自 js教程 栏目,欢迎学习!  

以上がjsにおける等価判定 ===, == と Object.is() の違いの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
js
ソース:cnblogs.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
#ブール値ブール値
保存された時刻は 1970 年 1 月 1 日からです。 UTC 午前 0 時から始まるミリ秒数
関数自体
数値