JavaScript 数据类型转换(2017-1-3)

来源:互联网 发布:国外网上购物知乎 编辑:程序博客网 时间:2024/05/17 20:00

强制转换(显示类型转换)

通过Number()   String()  Boolean()手动将各类型的值转换为数值、字符串、布尔值。


Number()

可以将数据转换为数值类型

Number(324)  //324    数值直接转换为数值
Number(“325”) //325   字符串,如果可以解析为数值,转换为数值
Number('324abc') //NaN  字符串,如果不可以解析为数值,转换为NaN
Number(“”) //0  空字符串转换为0
Number(true) //1   布尔值,true转换为1
Number(false) //0 布尔值,false 转换为0
Number(undefined) //NaN   undefined转换为NaN
Number(null) // 0  

Number()转换字符串的时候要比parseInt()和parseFloat()严格,Number()是整体转换字符串,转换时只要字符串里有一个字符不是数字,就会转换为NaN。parseInt()和parseFloat()是逐个解析字符,只要字符串里包含数字,就会转换为对应的数值。Number(“32s5”) //NaN   parseInt(“32s5”) //32  

Number()可以过滤特殊字符,Number('\t\v\r12.34\n')  //12.34

Number()转换对象时的规则,简单说就是结果永远是NaN

Number({a:1}) //NaN
Number([1,2,3]) //NaN

但其实背后的规则要复杂的多,它的规则和步骤是这样的,首先调用对象的valueOf(),如果得到的结果是原始类型,则直接对其使用Number(),不再继续执行下面的步骤,如果得到的结果不是原始类型而是对象的话,则使用toString(),如果结果是原始类型,则直接对其使用Number(),不再继续下面的步骤,如果得到的还是对象,则直接报错。(如果该对象是Date的实例,则先执行toString())

Number(obj) 等同于

if(typeof obj.valueOf() === "object"){

Number( obj.toString() )

}else{

Number( obj.valueOf() )

}

上面代码中Number()想要将对象obj转换为数值,首先调用了obj的valueOf()方法,结果返回对象本身,于是开始调用toString()方法,返回字符串"[object Object]",对这个字符串使用Number()方法,返回NaN。
默认情况下对象的valueOf()方法都会返回对象本身,所以一般总是会调用toString()方法。
从上面的代码可以看出,valueOf()和toString()方法都是可以自定义的:
var obj = {
  valueOf: function () {
    return {};
  },
  toString: function () {
    return {};
  }
};
Number(obj)
// TypeError: Cannot convert object to primitive value
因为上面代码的valueOf()和toString()返回的都是对象,所以会报错



String()

可以将任何类型的值转换为字符串。

原始类型的值的转换规则:
String(123) // “123” 数值转为相应的字符串
String("sad56w") // “sad56w”转换后还是原来的值
String(false) // “false”   true转换为“true”,false转换为“false”
String(null) // 转换为“null”
String(undefined) // 转换为“undefined”


对象的转换规则:
String({name : "chen"}) //如果要转换的是对象,返回一个类型字符串  "[object Object]"
String([1,2,3]) // 如果要转换的是数组,返回该数组的字符串形式   “1,2,3”
String()背后的转换规则和Number()基本一样,只是互换了valueOf() 和 toString()的执行顺序

默认情况下对象的toString()方法都会返回字符串"[object Object]",所以一般只会调用toString()方法。


Boolean()

Boolean()可以将任意类型的值转换为布尔值

除了以下七个值之外,其它的值全部转换为true
false undefined  null  0  +0  -0  “”(空字符串)
所有对象(包括空对象)的转换结果都是true,甚至连false对应的布尔对象new Boolean(false)也是true






自动转换(隐式类型转换)

JavaScript会根据需要自行转换数据的类型,但一个值转换为另一个值并不意味着两个值一定相等。比如,如果在期望使用布尔值的地方使用了undefined,它将会自动转换为false,但这并不代表undefined==false。


JavaScript是动态类型语言,它的变量没有类型,变量可以随时保存任何类型的值。

var a = b ? 1 : "abc" ;

a保存的值类型到底是是字符串还是数值,只有在这段代码运行的时候才能决定。


虽然变量没有类型,但变量保存的值和各种运算符是有类型的,如果运算符发现数据的类型与预期不符,就会自动转换数据的类型,预期是什么类型的值,就会根据不同的情况以及相应的规则自动转换类型(隐式转换的规则和显示转换的规则大部分类似,但其实各有各的规则,并不完全一样),由于自动转换具有不确定性,且不易排错,所以最好在预期为字符串、布尔值、数值的地方最好使用强制转换。


"7" - "5"    // 2

减法运算符希望两边的操作数都是数值类型,但上面的代码中两边都是字符串类型,于是执行了自动转换,将两边的字符串转换成了数值类型。


下表按运算符的优先级排序,左大于右,上一行大于下一行,A代表运算符的结合性,L为左,R为右,N代表运算符可操作的数的个数,类型表示运算符预期的操作值的数据类型以及运算符的结果类型(在右箭头之后)

 

lval的意思为左值,左值的意思就是可以出现在赋值运算符左侧的值,如变量、对象的属性等,ECMAScript规范运行内置函数返回左值,但目前还没有能返回左值的内置函数。

0 0
原创粉丝点击