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/

  • 相关阅读:
    Myeclipse 找不到Convert to maven project选项
    myeclipse中disable maven nature
    运行Maven是报错:No goals have been specified for this build
    Maven 工程错误Failure to transfer org.codehaus.plexus:plexus-io:pom:1.0,Failure to transfer org.codehaus.plexus:plexus-archiver:jar:2.0.1
    -Dmaven.multiModuleProjectDirectory system propery is not set. Check $M2_HOME environment variable and mvn script match.
    新建web工程Jdk怎么不是自己安装的, 是自带的
    AGC024B Backfront
    AGC037C Numbers on a Circle
    如何看待现在的教育?自己以后怎么做!!!!
    当局者迷
  • 原文地址:https://www.cnblogs.com/wuyanshun/p/6837954.html
Copyright © 2011-2022 走看看