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 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章