[TOC]
JavaScript是一种动态类型语言,变量没有类型限制,可以随时赋予任何值。
变量的类型无法再编译阶段确定,必须要在运行时才能知道。
虽然变量类型不确定,但各种运算符对数据类型是有要求的,如果运算符发现变量的类型与预期不符,就会自动转换类型。如减法运算符期望左右两侧的变量是数值,如果不是就会自动将他们转换为数值:
'250' - '50' // 200
主要使用Number(obj)
、String(obj)
、Boolean(obj)
三个函数,手动将其他类型的变量转换为数字、字符串、布尔值。
介绍:将其他类型的值转化成数字。Number函数整体转换,有一个无法转换就会返回NaN,parseInt和parseFloat则是逐个解析字符。
参数:value:待转换的值
参数类型 | 转为数值的规则 | 举例 |
---|---|---|
Number | 不变 | Number(123) // 123 |
String | 如果可以被解析,转为相应数值,否则为NaN,空串和空白符( 空格、制表符、换页符和换行符)转为0 | '123' => 123, '12ab' => NaN, '' =>0, '\n' => 0 |
Boolean | true:1,false:0 | true => 1, false => 0 |
undefined | 转为 NaN | undefined => NaN |
null | 转为0 | null => 0 |
Object | 转为NaN,但:包含单个数值的数组会返回对应数值 | {} => NaN, [1] => 1, |
-
Number对于对象的转换规则:
- 调用对象自身的
valueOf
方法,如果是原始类型的值,则直接使用Number函数,结束 - 如果
valueOf
方法返回的还是对象,则调用对象的toString
方法,如果返回原始类型,则直接使用Number函数,结束 - 如果
toSrting
方法返回的是对象,就报异常(Uncaught TypeError: 对象不能转为原始类型),结束
var obj = { valueOf: function () { return {}; }, toString: function () { return {}; } }; Number(obj)
- 调用对象自身的
介绍:解析一个字符串参数,并返回一个指定数字进制格式(二、十、十六进制)。
参数:String:字符串,如果不是字符串会被转为字符串,radix:个2到36之间的整数值,用于指定转换中采用的基数,如2,10,16。如果忽该参数,可能会产生不同结果。
转换结果:
- 如果输入的参数无法转化为数值类型,则返回NaN, 空字符串也返回Nan。
- 字符串的开头的空白字符会被忽略,直到找到第一个非空白字符开始转换。
- 从第一个字符开始,直到遇到非数字字符或结尾结束,返回解析的整数部分,非数字部分忽略。
- 如果设置了第二个参数,则可以把数字转换到相应进制(二进制、十进制、十六进制)
parseInt(" \n132.44ddd"); // 132
parseInt("0xF", 16); // 15
parseInt("546", 2); // Nan , 除了“0、1”外,其它数字都不是有效二进制数字
arseInt(" \nddd"); // NaN
介绍:把一个字符串解析为浮点数并返回,parseFloat是个全局函数,不属于任何对象.
参数: String:需要解析的字符串
转换结果:
- 如果参数不能解析成数字,则返回NaN,parseFloat只能返回十进制数
- 如果遇到了与浮点数无关的字符,则函数停止解析,返回已经解析到的浮点数,
- 字符串的头部空白字符会被忽略
- 如果字符串没有小数点或小数点后都是零,则返回整数,字符串中第一个小数点是有效的。第二则无效。
- 与浮点数相关的字符:正负号(+或-),数字(0-9),小数点,或者科学记数法中的指数(e或E)
parseFloat("0.0314E+2"); // 3.14
parseFloat(' \n .12345'); // 0.12345
parseFloat(' \n .12.345'); // 0.12
rseFloat('dsss') // NaN
介绍:String函数可以将任意类型的值转化成字符串,
参数: 待转换的值。
参数类型 | 返回结果 | 举例 |
---|---|---|
Number | 转为相应的字符串 | String(123) // "123" |
String | 不变 | String('abc') // "abc" |
Boolean | true: "true", false: "false" | String(true) // "true" |
undefined | "undefined" | String(undefined) // "undefined" |
null | " null" | String(null) // "null" |
Object | {a: 1} : "[object Object]", 数组: 数组的字符串形式 |
String([1, 2, 3]) // "1, 2, 3" |
NaN | "NaN" | String(NaN) // NaN" |
-
String对于对象的转换规则:
- 先调用对象的toString方法,如果返回原始类型的值,则调用String函数,结束
- 如果toString方法返回的是对象,再调用对象的valueOf方法,如果返回原始类型的值,则调用String函数,结束。
- 如果valueOf方法返回的是对象,就报异常(Uncaught TypeError: 对象不能转为原始类型),结束
var obj = { valueOf: function () { return {}; }, toString: function () { return {}; } }; String(obj)
- "" + value
- value.toString()
Boolean
函数可以将任意类型的值转为布尔值。
值 | 转换结果 |
---|---|
undefined | false |
null | false |
0(-0,+0) | false |
NaN | false |
''(空字符串) | false |
所有对象(包括空对象)(new Boolean(false)) | true |
其他 | true |
所有对象的布尔值都是true,是JavaScript出于性能的考虑,统一规定,如:obj1 && obj2
// 浏览器打开开发者工具, Console里面测试
Boolean(undefined) // false
Boolean(null) // false
Boolean(0) // false
Boolean(NaN) // false
Boolean('') // false
Boolean({}) // true
Boolean([]) // true
Boolean(new Boolean(false)) // true
自动转换是以强制转换为基础的,JavaScript会自动转换数据类型。
==
非严格判断相等- 不同的数据类型互相运算
- 条件判断中:数据求布尔值
- 对非数值的变量使用一元运算符(+,-)
123 + 'abc' // "123abc"
if ('abc') {}
+ {foo: 'bar'}
- [1, 2, 3]
'123' == 1
在使用==
判断相等的时候,如果两个值类型相等,那么执行严格相等判断,如果类型不同,则会自动做类型转换为相同然后在执行严格相等判断。
对于a == b
的比较规则:
类型 | 转换规则 |
---|---|
都是原始类型的值 | 转换成数值类型再进行比较 |
对象与原始类型的值 | 对象转化成原始类型的值,再进行比较。 |
undefined 和 null | 与其他类型的值比较时,结果都为false ,它们互相比较时结果为true |
1 == true // true 等同于 1 === Number(true)
2 == true // false 等同于 2 === Number(true)
'true' == true // false 等同于 Number('true') === Number(true) => NaN === 1
'' == 0 // true 等同于 Number('') === 0
'' == false // true 等同于 Number('') === Number(false)
'\n 123 \t' == 123 // true
[1] == 1 // true 等同于 Number([1]) == 1
[1] == '1' // true 等同于 Number([1]) == Number('1')
[1] == true // true 等同于 Number([1]) == Number(true)
false == undefined // false
0 == undefined // false
undefined == null // true
详细:相等运算符 阮一峰
JavaScript遇到期望布尔值的时候(如if语句),就会将非布尔值的参数转为布尔值,系统自动调用Boolean函数。
if (!undefined) {} //
expression ? true : false
!! expression
遇到期望为字符串的地方,就会将参数转为字符串,转换规则:先将复合类型的值转为原始类型的值,再将原始类型的值转为字符串。
- 当字符串与其他变量做加法运算的时候,如果变量不是字符串,变量就会转为字符串。
'5' + 1 // '51'
'5' + true // "5true"
'5' + false // "5false"
'5' + {} // "5[object Object]"
'5' + [] // "5"
'5' + function (){} // "5function (){}"
'5' + undefined // "5undefined"
'5' + null // "5null"
var obj = { width: '100' };
obj.width + 20 // "10020"
遇到期望为数值的地方,就会将参数自动转为数值,系统自动调用Number函数。
- 除加法运算符(+)有可能把变量转为字符串,其他运算符都会把变量自动转为数值:
'5' - '2' // 3
'5' * '2' // 10
true - 1 // 0
false - 1 // -1
'1' - 1 // 0
'5' * [] // 0
false / '5' // 0
'abc' - 1 // NaN
null + 1 // 1
undefined + 1 // NaN
-
一元运算符也会把运算子转成数值
+'abc' // NaN -'abc' // NaN +true // 1 -false // 0