原始類型 | 轉爲字符串 | 轉爲數值 | 轉爲布爾值 | 備註 |
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