【JS】16--相等性判断

相等性判断

前置知识:
判断两个变量的值是否相等,是编程中非常重要的一个操作。这里我们心里面先有两组对照,思考下:(=和==和===)

  • 相等 和 不相等
  • 全等 和 不全等

1.介绍

在我们比较字符串、数值和布尔值的相等性,是比较简单的,但是到了比较对象的时候,问题就比较复杂。
早期的时候ECMAScript规范中,在判断相等和不相等时,会先将对象转换成相似的类型,再执行比较。后面有人质疑其合理性,最后ECMAScript提出解决方法:提供两组操作符:

  • 相等不相等(宽松相等):先转换再比较,使用==
  • 全等不全等(严格相等):仅比较不转换,使用===

另外还有一类ES6新增的方法:

  • Object.is (ES6新增)

2.相等和不相等

JavaScript中用相等操作符使用==进行比较,若两个操作数相等,则返回true,否则返回false。反之,不相等操作符使用!=
这两个操作符都会先转换操作数类型,再进行比较

通常在转换不同数据类型时,相等和不相等会遵循以下规则:

  • 若有一个操作数是布尔值,则比较前会将布尔值转换为数值false转为0true转为1
  • 若一个操作数是字符串,另一个是数值,则比较前会将字符串转换为数值
  • 若一个操作数是对象,另一个不是,则比较前会调用valueOf()方法,用返回的基本类型值来判断。

两个操作符进行比较时会遵循下面规则:

  • nullundefined相等。
  • 比较前不能讲nullundefined转换成其他值。
  • 若一个操作数是NaN,则不相同(==时返回false!=时返回true)。
  • 若两个操作数是NaN,则不相同(==时返回false!=时返回true)。
  • 若两个操作数都是对象,则比较它们是不是同一个对象。
  • 若两个操作数都指向同一个对象,则相等操作符返回true,否则返回false

下面列出一些特殊情况的比较 :

表达式
null == undefined true
"NaN" == NaN false
9 == NaN false
NaN == NaN false
NaN != NaN true
false == 0 true
true == 1 true
true == 2 false
undefined == 0 false
null == 0 false
"9" == 9 true

3.全等和不全等

除了比较前不转换操作数歪,全等和不全等与相等和不相等并无区别,但使用的是===,只有当不转换的情况下两个操作数相同,才会返回true

"99" == 99 ;  // true   因为先转换类型 number 和 number
"99" === 99 ; // false  因为不转换类型 string 和 number

不全等操作符就相对应的使用!==

"99" != 99 ;  // false   因为先转换类型 number 和 number
"99" !== 99 ; // true    因为不转换类型 string 和 number

特殊的:

null == undefined;   // true  类似的值
null === undefined;  // false 类型不同

由于相等和不相等操作符存在类型转换问题,因此为了保持代码中数据类型的完整性,我们推荐使用去哪等和不全等操作符。

4.同值相等(Object.is)

Object.is(value1, value2);,传入两个需要对比的值。
Object.is() 判断两个值是否相同,并且不会对参数进行类型转换。如果下列任何一项成立,则两个值相同:

  • 两个值都是 undefined
  • 两个值都是 null
  • 两个值都是 true 或者都是 false
  • 两个值是由相同个数的字符按照相同的顺序组成的字符串
  • 两个值指向同一个对象
  • 两个值都是数字并且
    • 都是正零+0
    • 都是负零 -0
    • 都是 NaN
    • 都是除零NaN 外的其它同一个数字
Object.is('leo', 'leo');     // true
Object.is(window, window);   // true

Object.is('leo', 'pingan');     // false
Object.is([], []);           // false

var leo = { a: 1 };
Object.is(leo, leo);       // true

Object.is(null, null);       // true

// 特例
Object.is(0, -0);            // false
Object.is(-0, -0);           // true
Object.is(NaN, 0/0);         // true

另外还有特殊的:

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

5.对比图

相等操作符对于不同类型的值,进行的比较如下图所示(来源 MDN):

MDN 相等1

注意:

  • ToNumber(A) 表示比较前将参数 A 转换为数字
  • ToPrimitive(A)通过尝试调用 AA.toString()A.valueOf() 方法,将参数 A 转换为原始值(Primitive)。
MDN 相等2
MDN 相等3
MDN 相等4

#参考文章

  1. MDN JavaScript 中的相等性判断
  2. JavaScript高级程序设计
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,602评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,442评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,878评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,306评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,330评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,071评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,382评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,006评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,512评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,965评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,094评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,732评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,283评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,286评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,512评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,536评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,828评论 2 345