zoukankan      html  css  js  c++  java
  • [] == ![],走进==隐式转换的世界

    先来公布答案:console.log([] == ![]) // true,是不是很酷。==还有个好兄弟——===,下面就来看看哥俩到底干了啥...

    ==的运行机制

    ==运算符为确定两个运算数是否相等,会对左右两边运算数进行类型转换。

    执行类型转换的规则

    1. 如果一个运算数是Boolean值,在检查相等性之前,把它转化成数字值。false转化成0,true转换为1。
    2. 如果一个运算数是字符串,另一个是数字,在检查相等性之前,要尝试把字符串转换成数字。
    3. 如果一个运算数是对象,另一个是字符串,在检查相等性之前,要尝试把对象转换成字符串。
    4. 如果一个运算数是对象,另一个是数字,在检查相等性之前,要尝试把对象转换成数字。

    遵守规则

    1. 值null和undefined相等。
    2. 在检查相等性时,不能把null和undefined转换成其他值。
    3. 如果某个运算数是NaN,等号将返回false,非等号将返回true。
    4. 如果两个运算都是对象,那么比较它们的引用值。如果两个运算数指向同一个对象,那么符号返回true,否则两个运算数不等。

    ===的运行机制

    1. 如果类型不同,就[不相等]
    2. 如果两个都是数值,并且是同一个值,那么[相等];例外的是,如果其中至少一个是NaN,那么[不相等]。(判断一个值是否是NaN,只能用isNaN()来判断)
    3. 如果两个都是字符串,每个位置的字符都一样,那么[相等];否则[不相等]。
    4. 如果两个值都是true,或者都是false,那么[相等]。
    5. 如果两个值都引用同一个对象或函数,那么[相等];否则[不相等]。
    6. 如果两个值都是null,或者都是undefined,那么[相等]。

    回头来验证一下[] == ![]
    第一步:根据运算符的优先级,!先执行,[]是一个对象,所以![]转化为false
    第二步:根据类型转换规则第一条——"如果一个运算数是Boolean值,在检查相等性之前,把它转化成数字值。false转化成0,true转换为1。"。所以false转换成0==右边得到0
    第三步:根据类型转换规则第三条——"如果一个运算数是对象,另一个是字符串,在检查相等性之前,要尝试把对象转换成字符串。"。左边的[]调用toString(),转换成空字符串''
    第四步:根据类型转换规则第二条——"如果一个运算数是字符串,另一个是数字,在检查相等性之前,要尝试把字符串转换成数字。"。''转化成0。(左边得到0
    第五步:比较两边大小0==0,因此结果为true

    总结

    转化规则那么多,鬼能记得住啊,总结一下,分两类去记就好:

    1. 原始类型(undefined、null、number、boolean、string)的比较。转成数字的优先级最高,也就是说一方出现数字,另一方也要转成数字比较。
    2. 原始类型和对象(引用)类型的比较。如果一个是对象,另一个是数值或字符串,把对象转换成基础(原始)类型的值再比较。对象转换成基础类型,利用它的object.toString()或者object.valueOf()方法。

    补充一点:虽然=====是比较运算符,但它只是结果返回Boolean值,转化到最后比较的一定不是俩个Boolean值。

  • 相关阅读:
    java 实现前面带零的数字进行加减运算(保留前面的0)
    java 判断字符串是否是整数(纯数字:正整数、负整数、0)、至少包含一位小数、数字(可以是整数或小数)
    java 抽象类使用@Autowrited注入对象,子类直接使用父类的该属性
    java、springboot使用proguard混淆代码
    idea 使用阿里云仓库下载的jar包出现证书校验问题(PKIX:unable to find valid certification path to requested target)
    windows10安装zookeeper-3.6.2并生成zookeeper服务
    zookeeper-3.4.8 集群搭建
    zookeeper安装和使用 windows环境
    Dubbo入门---搭建一个最简单的Demo框架
    服务端高并发分布式架构演进之路
  • 原文地址:https://www.cnblogs.com/chenwenhao/p/10923445.html
Copyright © 2011-2022 走看看