最新公告
  • 欢迎您光临欧资源网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入我们
  • ES2015中有四种相等算法:JavaScript提供三种不同的值比较

    ES2015 中有四种相等算法:

    JavaScript 提供了三种不同的值比较操作:

    选择使用哪种操作取决于您需要哪种比较。

    简而言之,double equals 在比较两个事物时会进行类型转换;三等号将在不进行类型转换的情况下进行相同的比较(如果类型不同,则始终返回 false);而 Object.is 的行为方式与三等号相同,但对 NaN 和 -0 和 +0 进行了特殊处理,因此最后两个不一样,并且 Object.is(NaN, NaN) 将为真。(使用双等号或三等号将 NaN 与 NaN 进行比较通常是错误的,因为 IEEE 754 是这样说的。)请注意,所有这些之间的差异都与它们处理的原语有关。三个运算符的所有原语都比较两个变量在结构和概念上是否相似。对于任何两个不同的非原始对象,即使它们具有相同的结构,上述三个运算符也会评估为假。

    JavaScript相等性判断竟有这么多种玩法,你都知道吗?

    严格相等 ===

    相等运算符比较两个值是否相等,比较的两个值在比较之前没有隐式转换。被比较的两个值如果属于不同的类型,则它们是不一致的。否则,如果被比较的两个值的类型相同,则值相同,且两者都不是 number 类型,则这两个值全等。最后,如果两个值都是 number 类型,那么当两个值都不是 NaN 且值相同时,或者两个值分别为 +0 和 -0 时,两个值被认为是全等的。

    在日常生活中使用同余运算符几乎总是正确的选择。对于数字以外的值,相等运算符使用显式语义进行比较:一个值只与自身一致。对于数值,同余运算符使用稍微修改的语义来处理两种特殊情况:第一种是浮点数 0 无关紧要。区分 +0 和 -0 是解决某些数学问题所必需的,但在大多数情况下,我们并不关心。同余算子认为这两个值是全等的。第二种情况是浮点数包含 NaN 值,用于表示一些定义不明确的数学问题的解决方案,例如正无穷大加负无穷大。同余运算符认为 NaN 不与任何其他值一致,包括它自己。(方程 (x !== x) 成立的唯一情况是 x 的值为 NaN)。

    不严格平等

    相等运算符比较两个值是否相等单目运算符的结合性是,在比较之前将两个比较的值转换为相同的类型。转换后(等式的一侧或两侧都可以转换),最终的比较与等式运算符 === 的比较相同。相等运算符是可交换的。

    相等运算符比较不同类型的值如下图所示:

    JavaScript相等性判断竟有这么多种玩法,你都知道吗?

    在上表中,ToNumber(A) 尝试在比较之前将参数 A 转换为数字,这与 +A(一元运算符 +)具有相同的效果。通过尝试依次调用 A 的 A.toString 和 A.valueOf 方法,将参数 A 转换为原始值(Primitive)。

    一般来说,根据 ECMAScript 规范,并非所有对象都等于 undefined 和 null。但是大多数浏览器在某些情况下允许非常狭窄的对象类(即所有页面中的 document.all 对象)表现得像未定义。相等运算符就是在这样的上下文中。因此,当且仅当 A 模拟 undefined 时,IsFalsy(A) 方法的计算结果为 true。在所有其他情况下,对象将不等于 undefined 或 null。

    一些开发人员认为最好不要使用相等运算符。相等运算符的结果更容易预测,并且因为没有隐式转换,所以相等比较的运算速度更快。

    相同的值

    值相等解决了最后一个用例:确定两个值在任何情况下在功能上是否相同。(此用例演示了 Liskov 替换原则的一个实例。)尝试修改不可变属性时会发生什么:

    JavaScript相等性判断竟有这么多种玩法,你都知道吗?

    单目运算符的结合性是_性结合_c 移位运算符是单目还是双目

    Object.defineProperty 会在尝试修改不可变属性时抛出异常单目运算符的结合性是,如果该属性被实际修改,则不会发生任何事情。例如,如果 v 为 -0,则没有任何变化,因此不会抛出异常。但是如果 v 为 +0,就会抛出异常。不可变属性和新设置的值使用同值相等进行比较。Object.is 方法提供了同值相等性。

    等于零

    与等值一样,除了 +0 和 -0 被认为是相等的。

    了解相等比较的模型

    在 ES2015 之前,你可能会说 double 和 third 是“扩展”关系。比如有人会说double class是third class的扩展版,因为它处理了third class做的事情,也做了类型转换。例如 6 == “6” 。反之,可能有人会说三类是双类的扩展,增加了更多的限制,因为它也要求两个参数是相同的类型。你如何理解它取决于你如何看待问题。

    但是没有办法以这种比较的方式对 ES2015 的 Object.is 进行排名。因为 Object.is 不比二等舱宽松,也不比三等舱严格,当然也不在两者之间。从下表可以看出,这是由于 Object.is 处理 NaN 的方式不同。请注意,如果 Object.is(NaN, NaN) 的计算结果为 false,我们可以说它比三类更严格,因为它可以区分 -0 和 +0。但是对 NaN 的处理表明这是不对的。Object.is 应该考虑到它的特殊用途,而不应该说对它与其他人的平等更宽松或更严格。

    JavaScript相等性判断竟有这么多种玩法,你都知道吗?

    站内大部分资源收集于网络,若侵犯了您的合法权益,请联系我们删除!
    欧资源网 » ES2015中有四种相等算法:JavaScript提供三种不同的值比较

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    欧资源网
    一个高级程序员模板开发平台

    发表评论