zoukankan      html  css  js  c++  java
  • javascript中的隐式类型转化

    javascript中的隐式类型转化 

    #隐式转换

    ## “+” 字符串和数字

    如果某个操作数是字符串或者能够通过以下步骤转换为字符串的话,+将进行拼接操作。
    如果其中一个操作数是对象(包括数组),则首先对其调用`ToPrimitive`抽象操作,该抽象操作再调用`[[DefaultValue]]`,以数字作为上下文。
    `[1,2]+[3,4]=='1,23,4'`
    原因,因为数组的valueOf操作无法得到简单的基本类型,于是它转而调用toString。因此上栗得到的是'1,23,4'。

    ## 布尔值到数字的隐式强制类型转换

    ```js
    function onlyOne(){
    var sum = 0;
    for(var i=0;i<arguments.length;i++){
    if(arguments[i]){ //跳过假值 undefined也是假值,避免NaN
    sum+=arguments[i];
    }
    }
    return sum === 1;
    }
    ```

    ## 隐式强制类型转换为布尔值

    `undefined null false +0 -0 NaN ""`会被转化为false

    # ==和===

    > ① `字符串、数字和布尔型的比较都会转换为数字类型进行比较`
    > ② `特殊的有null和undefined,他们去其它类型比较都为false`
    > ③ 对象和其它类型比较,都会将对象先转化为`primitive`值然后进行比较

    ## 字符串和数字

    `X==Y`
    规范:
    (1)如果Type(x)是数字,Type(y)是字符串,则返回`x==ToNumber(y)`的结果
    (2)如果Type(x)是字符串,Type(y)是数字,则返回`ToNumber(x)==y`的结果
    > `总而言之,==比较的是两个数字。`

    ## 其它类型和布尔类型之间的相等比较

    ```js
    var a = '22';
    var b = true;
    a == b // false
    var a = '22';
    var b = false;
    a == b // false
    ```
    '22'是一个真值,为什么==的结果不是true呢?很容易掉坑里面。需要重视。
    规范:
    (1)如果Type(x)是布尔值,则返回`ToNumber(x)==y`的结果
    (2)如果Type(y)是布尔值,则返回`x==ToNumber(y)`的结果

    ## null和undefined的比较

    规范:
    (1)如果x为`null`,y为`undefined`,结果为`true`
    (2)如果x为`undefined`,y为`null`,结果为`true`
    > `只要==一边出现null或者undefined,另一边是其它类型,结果都为false`
    ```js
    var a = null;
    var b;
    a==b //true
    a==null//true
    b==null // true
    a == false // false
    b == false // false
    a == '' //false
    b == '' //false
    a == 0 //false
    b == 0 //false
    ```

    ## 对象和非对象之间比较

    对象(对象|函数|数组)和标量基本类型(字符串|数字|布尔)之间的相等比较。
    规范:
    (1)如果`Type(x)`是字符串或者数字,`Type(y)`是对象,则返回`x == ToPrimitive()`的结果
    (2)如果`Type(x)`是对象,`Type(y)`是字符串或者数字,则返回`Toprimitive() == y`的结果
  • 相关阅读:
    为什么要持续输出
    从Libra看区块链的机遇
    windows 通过choco 安装 .net core windowshosting
    java 正则表达式空格无法匹配
    docker jenkins 安装
    docker jenkins 前端node项目 自动化部署异常 env: ‘node’: No such file or directory
    jenkin docker node 自动化部署配置
    centos docker redis 安装
    Windows server 2012 出现大量无名已断开连接用户清楚办法
    spring boot 打包jar后访问classes文件夹的文件提示地址不存在
  • 原文地址:https://www.cnblogs.com/sivkun/p/7533451.html
Copyright © 2011-2022 走看看