js 隐式转换 规则 和 优先级

原始类型 转为字符串 转为数值 转为布尔值 备注
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 

 

你可能感兴趣的:(前端)