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
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
配列オブジェクト自体を返します。 日付保存された時刻は 1970 年 1 月 1 日からです。 UTC 午前 0 時から始まるミリ秒数 | |
Function関数自体 | |
Number数値 | | #オブジェクト
オブジェクト自体。これはデフォルトです。カスタム オブジェクトの valueOf メソッド | | #String
String 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 サイトの他の関連記事を参照してください。
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
-
2020-04-03 18:08:45
-
2020-04-02 18:10:17
-
2020-04-01 17:01:16
-
2020-03-31 18:06:25
-
2020-03-31 18:00:22
-
2020-03-31 17:44:20
-
2020-03-31 17:22:09
-
2020-03-31 17:09:21
-
2020-03-31 17:00:48
-
2020-03-31 16:47:03