• Javascript数据类型转换规则


    前言

    Javascript有7种数据类型,包括5种原始类型(也叫原始值)number、Boolean、string、null、undefined和2种复合类型object、array,它们之间可以根据某种规则相互转换。《Javascript权威指南》列出了在Javascript中如何进行类型转换,如下表:

    其中原始值之间的转换没什么可说的,记住就好了,我们要关注的是复合值(即对象)与原始值之间的转换。原始值转换成对象直接调用Object()方法即可(null和undefined不可调用该方法),而对象转换成原始值呢?如空数组[]转换成数字为什么是0呢?

    对象转换成原始值

    对象转换成布尔值所有对象转换成布尔值都是true,包括包装对象new Boolean(false)转换成布尔值也是true。

    对象转换成字符串:如果对象有toString()方法,则调用这个方法,如果它返回原始值,将原始值转换成字符串后返回;如果对象没有toString()方法或调用toString()方法方法返回的不是原始值,则调用valueOf()方法,然后将valueOf()方法返回的原始值转换成字符串返回,如果valueOf()方法返回的还不是原始值,没救了,浏览器只好抛出类型异常的错误。

    对象转换成数字:和对象转换成字符串过程类似,只不过先调的是valueOf()方法。

    根据以上规则就可以知道为什么空数组转换成数字结果是0了:空数组先调用了valueOf()方法,返回了“”字符串,“”字符串是个原始值,再根据上面的表格,“”字符串转换成数字0。

    隐式类型转换

    来看一个例子:

    "123" == 123

    大家都知道结果是true,==运算符两边的操作数属于不同的数据类型,要判断是否相等,需要经过隐式类型转换成相同的数据类型才行。然而,是运算符左边的“123”转换成了数字123还是运算符右边的123转换成了字符串“123”呢?

    规则是:

    • 如果一个值是null,另一个是undefined,那么它们相等
    • 如果一个值是数字,另一个是字符串,先将字符串转为数字再比较
    • 如果其中一个值是true,将true转为1再比较,同理false转换成0再比较
    • 如果一个值是对象,另一个是数字或字符串,则将对象转换成原始值再进行比较(日期对象转换成字符串,其它对象先尝试调用valueOf()方法再尝试使用toString())
    • 其它不同类型的比较都不相等

    显然上面的例子属于第二种情况,“123”被隐式转换为123了。

    除了==运算符,诸如+、-、*、/、!、<、<=、>、>=等运算符两边的操作数类型不同时,都会发生隐式类型转换,还包括while()语句和if()语句内的条件语句,alert()语句会将()内的值隐式转换成字符串后再弹出。 

    “+”运算符

     二元加法运算符“+”可以对两个数字做加法,也可以做字符串连接操作:

    1 + 1               // 2
    "hello" + "world"   // "hello world"

    当二元加法运算符“+”遇到下面的运算时操作数会如何转换呢?试着想想答案再往下看

    1 + true
    "1" + true
    1 + "1"
    {} + 1
    {} + {}

    隐式转换规则:

    • 如果其中一个操作数是对象,对象会转换成原始值:日期对象通过toString()方法转换,其他对象通过valueOf()方法转换,如果valueOf()返回值不是原始值再使用toString()方法转换。
    • 在进行了对象到原始值的转换后,如果其中一个操作数是字符串的话,另一个操作数也会转换为字符串,然后进行字符串拼接。
    • 否则,两个操作数都将转换为数字(转换不了的将转换为NaN),然后进行加法操作。

    根据规则,以上的例子结果是:

    1 + true       // true转换为1,然后加法得出结果2
    "1" + true     // true转换为"true",然后字符串拼接得出结果"1true"
    1 + "1"        // 数字1转换为"1",然后字符串拼接得出结果"11"
    {} + 1         // {}对象调用toString()方法转换为字符串"[object Object]",变成了"[object Object]" + 1,匹配第二条规则,1将转换为字符串"1",然后字符串拼接得出结果"[object Object]1"
    {} + {}        // 自己想想过程吧

    当“+”做为一元运算符时,会把操作数转换为数字(转不了的转成NaN)

    “-”运算符

    当“-”做为二元运算符时,会把操作数转换为数字(转不了的转成NaN) 

    当“-”做为一元运算符时,会把操作数转换为数字(转不了的转成NaN),同时改变运算结果的符合 

    比较运算符(">"、">="、"<"、"<=")

    比较操作符的操作数可能是任意类型,然而只有数字和字符串才能真正执行比较操作,因此其它类型的操作数都将进行类型转换,具体规则如下:

    • 如果操作数为对象,那么这个对象将转换为原始值:同上,日期对象通过toString()方法转换,其他对象通过valueOf()方法转换,如果valueOf()返回值不是原始值再使用toString()方法转换。
    • 在对象转换为原始值后,如果两个操作数都是字符串,将依次比较每个字符串的Unicode大小。
    • 在对象转换为原始值后,如果至少有一个操作数不是字符串,那么两个操作数都将转换为数字进行比较,如果其中某个操作数无法转换为数字,这个操作数将转换为NaN,比较结果为false。

    "*"、"/"、"%"、"!"

     "*"、"/"、"%"会把操作数转换为数字(转不了的转成NaN) 

    "!"会把操作数转换为布尔值

    by王美建整理from:http://www.cnblogs.com/wangmeijian/p/4639112.html 转载保留署名和出处,谢谢!

  • 相关阅读:
    一致性哈希的理解与实践
    nil in Go
    为什么Go没有math.Min/Max(int, int) 函数?
    What happens when I type kubectl run?
    kubelet简要分析
    编译安装nginx和模块
    nginx与tengine添加check模块(nginx_upstream_check_module)
    多台ESXI 6.5 添加 iSCSI 共享存储 --centos 7.4 作为target
    Cannot open the disk '/vmfs/volumes/5e97f429-a56d6ea0-1ef3-000c29a09445/oracle_node1/oracle_node1_1.vmdk' or one of the snapshot disks it depends on.
    RabbitMQ windows2016 镜像模式 haproxy+keepalived
  • 原文地址:https://www.cnblogs.com/wangmeijian/p/4639112.html
Copyright © 2020-2023  润新知