zoukankan      html  css  js  c++  java
  • 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 转载保留署名和出处,谢谢!

  • 相关阅读:
    Windows Server 2012配置开机启动项
    Windows Server 2019 SSH Server
    NOIP2017 senior A 模拟赛 7.7 T1 棋盘
    Noip 2015 senior 复赛 Day2 子串
    Noip 2015 senior复赛 题解
    Noip 2014 senior Day2 解方程(equation)
    Noip 2014 senior Day2 寻找道路(road)
    Noip 2014 senior Day2 无线网络发射器选址(wireless)
    Noip2014senior复赛 飞扬的小鸟
    Noip 2014 senior 复赛 联合权值(link)
  • 原文地址:https://www.cnblogs.com/wangmeijian/p/4639112.html
Copyright © 2011-2022 走看看