转字符串类型
其他类型转成字符串类型的方法: String()
,toString()
String({name:'Tenderness'}); //结果是 "[object Object]"
({name:'Tenderness'}).toString(); //结果是 "[object Object]"
String(['a',1]); //结果是 "a,1"
['a',1].toString(); //结果是 "a,1"
String(null); //结果是 "null"
String(undefined); //结果是 "undefined"
String(100); //结果是 "100"
(100).toString(); //结果是 "100"
注意点
()
括号的另一种用法 — 表达式, 让浏览器正确识别数据类型null
和undefined
没有toString()
方法- 数字的
toString()
方法还可以接受一个number
类型的参数, 表示转进制, 如(100).toString(2)
表示数字100
(十进制)转成二进制的1100100
转数字类型
其他类型转数字类型的方法: Number()
, parseInt()
,parseFloat()
三种方法的区别
parseInt()
和parseFloat()
一般用于将字符串(string
类型)(如<input>
标签的value
属性)转成数字Number()
转数字的机制: 先调用内置的toString()
方法将参数转成字符串, 再将字符串转成数字, 非空且含有非数字字符的字符串转数字永远是NaN
, 因此number([])
结果是0
,Number({})
结果是NaN
parseInt()
和parseFloat
会将参数字符串从左到右读取, 如果先读取到数字就转成对应精准度的数字, 先遇到其他则转成NaN
Number('12px'); //结果是NaN parseInt('12px'); //结果是12 parseInt('px12'); //结果是NaN
Number() 转数字的特殊情况
Number(''); //结果是0
Number(' '); //结果是0
Number([]); //结果是0
Number({}); //结果是NaN
Number(null); //结果是0
Number(undefined); //结果是undefined
Number(true); //结果是1
Number(false); //结果是0
转布尔类型
其他类型转布尔类型的方法: Boolean()
注意点
- 除了
''
,0
,null
,undefined
,NaN
转布尔类型为false
外, 其他数据类型转布尔类型都是true
if
语句的条件表达中如果不使用比较运算符, 会默认调用Boolean()
方法将表达式中数据转成布尔类型, 如果结果是true
则条件成立
数据运算
在提及数据运算前, 先说一下运算时2个特殊的数据
NaN
特殊的数字类型, 全称 Not a Number, 和任何数据( 包括本身 )作比较时永远为false
, 和任何数字相加永远是NaN
- 字面量形式书写的基础对象, 如
{}
, 在浏览器控制台开头进行运算时, 会被认为是 代码块(block statement), 所以{}
就表示什么都没有; 如果在其他位置, 如({})
, 才会被识别成基础对象
本节代码均书写在浏览器控制台
算术运算
+
加号的作用: a) 数字求和 b) 字符串拼接1 + 2 //数字求和 结果是 3 NaN + 1 //数字求和 结果是 NaN, 任何数字和NaN相加都是NaN "I am "+"Tenderness" //字符串拼接 结果是 "I am Tenderness"
当一个数字和一个字符串进行相加时, 会将数字转成字符串然后进行拼接
"str" + 123 //结果是 "str123"
当一个数字和一个基本类型数据进行相加时, 会把基本类型数据转成数字后进行相加
null + 123 //结果是 123 undefined + 123 //结果是 NaN true + 123 //结果是124 false + 123 //结果是123
当一个数字和一个引用类型数据进行相加时, 会把引用类型数据转成字符串后进行拼接
[] + 123 //结果是 "123" [1,2,3] + 123 //结果是 "1,2,3123" {} + 123 //结果是 123, {}放在开头, 表示什么都没有 ({}) + 123 //结果是 "[object Object]123" 123 + {} //结果是 "123[object Object]" NaN + {} //结果是 "NaN[object Object]"
当2个非数字基本类型数据进行相加时, 会把基本类型数据转成数字后进行相加
null + undefined //结果是 NaN true + false //结果是 1
当2个引用类型数据进行相加时, 会把引用类型数据转成字符串后进行拼接
["a",1] + {} //结果是 "a,1[object Object]"
当一个非数字基本类型数据和一个引用类型数据进行向加时, 会把2个数据转成字符串后进行拼接
null + {} //结果是 "null[object Object]" undefined + {} //结果是 "undefined[object Object]" true + {} //结果是 "true[object Object]" false + {} //结果是 "false[object Object]"
-
减号,*
乘号,/
除号,%
取余的作用: a) 数字对应运算 b) 将纯数字字符串转成运算后的数字"1314" * 1 //结果是 1314, 利用这个特性, 可以快速的将纯数字字符串转成数字
一个数字和其他类型数据进行减、乘、除、取余运算, 会把其他类型数据转成数字后进行运算
"Tenderness" - 1 //结果是 NaN "" * 1 //结果是 0 true / 1 //结果是 1 false % 1 //结果是 0 [] - 1 //结果是 0 [123] - 1 //结果是 122 [123,456] - 1 //结果是 NaN ({}) - 1 //结果是 NaN
比较运算
大小比较
2个数字比较, 比较的是他们的数值
数字与其他数据比较, 会将其他数据转成数字, 再作比较
2个字符串比较, 从左到右依次比较每个字符的Unicode数值, 直到出现差值或者其中一个字符串结束
字符串与非数字数据比较, 会将非数字数据转成字符串, 再作比较
任何数据和
NaN
比较结果都是false
123 > 122 //数值比较, 结果是 true 123 > "abc" //"abc"转数字NaN, 结果是 false "a" > "b" //unicode值比较, 结果是 false "ab" > "b" //"a"和"b"的unicode值比较, 结果是 false "ab" > "ac" //"b"和"c"的unicode值比较, 结果是 false "abc123" > "abc" //"abc"字符串结束仍没有unicode差值, 比较字符串长度, 结果为 true "abc" > function fn () {} //函数转成字符串"function fn () {}", "a"和"f"的unicode值比较, 结果是 false
相等比较
===
和!==
会先比较数据类型, 再比较数据值==
和!=
只比较数据值, 涉及隐性转换(数据转类型)a) 布尔类型会先转成数字再比较,
true
转为1
,false
转为0
b) 数字和字符串比较, 字符串会转成数字后再作比较
c) 引用类型和基本类型作比较时, 引用类型会转成字符串再作比较
2个引用类型数据比较的是引用值( 堆内存中的地址 )
null
或者undefined
与其他数据作比较时, 不会发生转换null == undefined
结果为true
,null === undefined
结果为false
NaN
和任何数据比较都不相等, 包括本身, 即NaN == NaN
结果为false