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规范运行内置函数返回左值,但目前还没有能返回左值的内置函数。
- JavaScript 数据类型转换(2017-1-3)
- JavaScript-1-4:数据类型转换
- javascript数据类型转换javascript
- JavaScript数据类型及数据类型转换
- JavaScript数据类型以及数据类型转换
- JavaScript-数据类型-隐式转换1
- JavaScript 1.2补充 数据类型转换 (转载)
- javascript 数据类型转换
- JavaScript 数据类型转换
- javascript 数据类型转换
- javascript 数据类型转换
- javascript 数据类型转换
- javascript数据类型转换
- javascript数据类型转换
- javascript数据类型转换
- javascript数据类型的转换
- javascript数据类型转换
- javascript数据类型转换
- cocos2d sprite精灵初始化
- SACD ISO提取DSF文件,添加封面
- VMware Workstation虚拟机打开 .vmx 文件没有反应--解决办法
- 创建Android快捷方式牛刀小试
- Kafka初涉
- JavaScript 数据类型转换(2017-1-3)
- halcon与opencv图片的数据结构转换
- 05-CSS 权重 盒模型 标准文档流 浮动
- 06-CSS 浮动的清除 margin Fireworks和精确盒子还原
- Gradle之依赖管理
- 数据库在windows下的坑
- PHP会话应用之COOKIE应用(一)
- MySQL子查询和联结表笔记
- 电脑播放SACD-ISO/DSD/DFF音乐