zoukankan      html  css  js  c++  java
  • JavaScript if(x),==和===解析(翻译整理)

    一、if()中的布尔判断

    if ( Expression ) 表达式会通过ES5定义的ToBoolean方法强制把Expression 转换成布尔值。

    数据类型 转换结果
    Undefined false
    Null false
    Boolean 不变
    Number  +0, −0, or NaN 转换为false;
     其他的转换为true.
    String 空字符串或长度为0的字符串转换为false;
    其他的转换为true.
    Object true

    示例:

    var trutheyTester = function(expr) {
        return expr ? "truthey" : "falsey";
    }
     
    trutheyTester({}); //truthey (an object is always true)
     
    trutheyTester(false); //falsey
    trutheyTester(new Boolean(false)); //truthey (an object!)
     
    trutheyTester(""); //falsey
    trutheyTester(new String("")); //truthey (an object!)
     
    trutheyTester(NaN); //falsey
    trutheyTester(new Number(NaN)); //truthey (an object!)

    二、==

     会对不同类型的数据进行强制转换以比较,记住两点即可:

    1. undefined和null永远互相相等
    2. 当两个不同类型的值进行比较,Object会被toPrimitive()转化为原始值,String和Boolean会被toNumber()转换为数字或NaN
    Type(x) Type(y) Result
    x和y是同一种数据类型 和===判断原则一样一样
    null Undefined true
    Undefined null true
    Number String x == toNumber(y)
    String Number toNumber(x) == y
    Boolean (any) toNumber(x) == y
    (any) Boolean x == toNumber(y)
    String or Number Object x == toPrimitive(y)
    Object String or Number toPrimitive(x) == y
    otherwise… false

    toNumber()的转换规则:

    形式参数类型 结果
    Undefined NaN
    Null +0
    Boolean

    true -->1;

    false-->+0;

    Number 不变
    String “abc” -> NaN
    “123” -> 123
    Object

    1. Let primValue be ToPrimitive(input argument, hint Number).
    2. Return ToNumber(primValue).

     ToPrimitive()转换规则:

    形式参数 结果
    Object (在做相等判断进行强制转换时)先调用valueOf(),没有返回值再调用toString(),还没有返回值则报错。
    otherwise… 不变

     示例:

    [0] == true;

     1 //EQUALITY CHECK...
     2 [0] == true;
     3  
     4 //HOW IT WORKS...
     5 //convert boolean using toNumber 
     6 [0] == 1;
     7 //convert object using toPrimitive
     8 //[0].valueOf() is not a primitive so use...
     9 //[0].toString() -> "0"
    10 "0" == 1;
    11 //convert string using toNumber
    12 0 == 1; //false!

    “potato” == true;

    //EQUALITY CHECK...
    "potato" == true;
     
    //HOW IT WORKS...
    //convert boolean using toNumber
    "potato" == 1;
    //convert string using toNumber
    NaN == 1; //false!

    “potato” == false;

    //EQUALITY CHECK...
    "potato" == false;
     
    //HOW IT WORKS...
    //convert boolean using toNumber
    "potato" == 0;
    //convert string using toNumber
    NaN == 0; //false!

    object with valueOf;

    //EQUALITY CHECK...
    crazyNumeric = new Number(1);
    crazyNumeric.toString = function() {return "2"};
    crazyNumeric == 1;
     
    //HOW IT WORKS...
    //convert object using toPrimitive
    //valueOf returns a primitive so use it
    1 == 1; //true!

    object with toString;

    //EQUALITY CHECK...
    var crazyObj  = {
        toString: function() {return "2"}
    }
    crazyObj == 1;
     
    //HOW IT WORKS...
    //convert object using toPrimitive
    //valueOf returns an object so use toString
    "2" == 1;
    //convert string using toNumber
    2 == 1; //false!

    三、===

    值和类型都必须严格相等:

    1. 不同类型永远不相等
    2. 对象必须引用自同一个对象才相等
    3. 字符串必须包含相同的字符集合
    4. 原型(primitives)共享同一个值才相等
    5. NaN, null and undefined永远不和其他类型相等
    6. NaN甚至不会和自己相等
    数据类型 结果
    二者类型不同 false
    Undefined or Null true
    Number 二者值相等,除了NaN true
    String 二者包含相同的字符 true
    Boolean 二者都是true或false true
    Object 二者引用自同一个对象 true
    otherwise… false

    参考资料:

    1. 《Truth, Equality and JavaScript  》:https://javascriptweblog.wordpress.com/2011/02/07/truth-equality-and-javascript/

  • 相关阅读:
    apache bench(ab)压力测试模拟POSt请求
    使用pabot并发执行robotframework的testSuite
    Python实现简单的HTTP服务器(支持文件上传下载)
    Mac OS启动服务优化高级篇(launchd tuning)
    在MacOS下Python安装lxml报错xmlversion.h not found 报错的解决方案
    模拟恶劣网络环境常用的几种解决方案
    Web缓存基础:术语、HTTP报头和缓存策略
    RTMP直播应用与延时分析
    用Redis作为Mysql数据库的缓存【转】
    缓存雪崩,缓存穿透解决方案
  • 原文地址:https://www.cnblogs.com/wuyanshun/p/6837954.html
Copyright © 2011-2022 走看看