JS中奇异的equality(==)

奇异的地方在那里

近来担任的项目有涉及到前端的,所以尝试性的写了写js。在处置惩罚一个字段非空值的时刻,用了 tagert_value == ”来举行推断,然后发生了一件异常新鲜的事变,有用户反应,本身的target_value = 0的时刻,非空值校验不通过。在调试题目的时刻,在console状态栏中做了以下尝试:


> 0 == ''
< true

我好像晓得题目出在那里了。。。没有相识清晰 == 的推断逻辑,所以我盘算找来官方的文档瞅瞅。

官方诠释

Equality (==, !=)

  1. If the types of the two expressions are different, attempt to convert them to string, number, or Boolean.
  2. NaN is not equal to anything including itself.
  3. Negative zero equals positive zero.
  4. null equals both null and undefined.
  5. Values are considered equal if they are identical strings, numerically equivalent numbers, the same object, identical Boolean values, or (if different types) they can be coerced into one of these situations.
  6. Every other comparison is considered unequal.

查看了官方关于equality的诠释,看到第一个就晓得为何效果会是true了。假如表达式双方的范例不一致,比较方法会先尝试将他们转换为string、number、Boolean,然后在举行比较(相称的前提:一样的string、数学上相称的数字、雷同的object、雷同的布尔值)。
看到这里,基础清晰了,在比较 0 == ’‘的时刻先举行了范例装换,那我们来看一下究竟是转换的谁啊?

> Number('')
< 0

> var b= ''
> b.toString()
<'0'

异常显著了,int == string 的时刻是先将string装换为对应的int值,然后举行比较。

怎样防止嘞?

下面猛烈引见 === (strict equality)。严厉即是,看着是不是是异常凶猛呀。人家的官方叫法是Identity (===. !==)。Identity 有点范例悬疑破案的觉得了。
看一下官方的引见:

Identity (===. !==)

These operators behave identically to the equality operators except no type conversion is done, and the types must be the same to be considered equal.

在一样平常开辟中,假如没法保证比较表达式两遍的变量的范例一致,发起运用 Identify(===)来比较是不是相称。假如变量范例一致,就能够直接运用Equality(==)来比较了。

参考资料:
http://www.c-point.com/javasc…
https://developer.mozilla.org…

    原文作者:元无雨
    原文地址: https://segmentfault.com/a/1190000017052000
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞