原始类型 | 转为字符串 | 转为数值 | 转为布尔值 | 备注 |
false | "false" | 0 | false | |
true | "true" | 1 | true | |
0 | "0" | 0 | false | |
1 | "1" | 1 | true | |
"0" | "0" | 0 | true | |
NaN | "NaN" | NaN | false | |
Infinity | "Infinity" | Infinity | true | |
"" | "" | 0 | false | 判断字符串是否为有效 var a = " "; if(a && a.trim()) |
[] | "" | 0 | true | ""和[]不能互转, 判断数组是否为空的写法 if([].length>0) |
[20] | "20" | 20 | true | |
function(){} | "function(){}" | NaN | true | |
{} | "[object Object]" | NaN | true | |
null | "null" | 0 | false | |
undefined | "undefined" | NaN | false |
由于js语言的 数据类型是弱类型的, 检查,并不严格, 这就导致了 js隐式转换规则要相对复杂一些
参考: https://my.oschina.net/okabe/blog/1559380
https://www.cnblogs.com/mengxiangji/p/11080006.html
如何得到数据类型的返回值? (都是小写)
格式: typeof 数据
另外还有: null instanceof Object
基本类型:
string: 单引号, 双引号包裹的字符 "一段文本" 'string类型的文本'
number: 整数 浮点数 100 3.1415925 NaN Infinity(无穷大)
boolean: 布尔型 true false
undefined: 未定义
null: 空值对象
symbol: 独一无二(ES6 新增)
引用类型:
function: 各种函数的定义
object: null空值对象 new出来的对象(如: Array Date RegExp等)
NaN是一个特殊的Number类型, 表示的是一个 非Number, 且NaN不等于自己
正确: isNaN(Number("s"))
错误: Number("s")==NaN
null跟java中的null含义完全不同, 容易理解错
转换优先级
运算符优先级: 略 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Operator_Precedence
隐式转换优先级:
基本数据类型
1.在逻辑运算符场景时, 使用的是Boolean()函数 & | !
2.在连接符(有字符串)的场景, 运算参数通过String()函数转换 +
3.在数学运算符(+两边都是数字), 关系运算符的场景, 则是 Number()函数进行转换 > < == + - * /
引用类型:
1.与引用类型比较 是判断的内存地址
2.同基本类型比较, 先用String()函数, 转为字符型
[]空数组 {}空对象
String([]) // "" 空数组是空字符串
String({}) // [object Object] 空对象则是固定的字符, 如果是自定义的对象则是 xxx.valueOf().toString();
如下练习题:
var a = ???
if(a==1 && a==2 && a==3 ){
console.log(1); // 如何完善a, 使得改行成立
}
答案:
var a = {
i : 0,//声明一个属性i
valueOf:function ( ) {
return ++a.i;//每调用一次,让对象a的i属性自增一次并且返回
}
}
1.题: []+1 // "1" [] 是引用类型对象 使用了 String()函数 得到 "", ""+1 则为 "1"
2.题: ![]+1 // 1 ![]优先级最高得出 false, false 转换为整数0 0+1 则为1
=====
3.题: {}+1 // 1 解析: {}在console中识别为代码块,忽略掉了 +1则为1
改为: ({})+1 // "[object Object]1" 就跟预期的一样了
4.题: !{}+1 // 1 同2
//大坑
console.log ( [] == 0 );//true Number(false)为0 0==0
console.log ( ! [] == 0 );//true Boolean([]) 为true, !true 为false, Number(false)为0
//神坑
console.log ( [] == ! [] );//true 同上
console.log ( [] == [] );//false 引用对象都是新建的, 内存地址不一样所以为false
//史诗级坑
console.log({} == !{});//false Number({})结果是 NaN, 其实也好理解 对象无法转为数值
console.log({} == {});//false 内存地址不一样
总结:
!的优先级高
== 关系运算符两边的参数会转换 Number