一 數據類型分類
1. 普通類型: string number boolean null undefined
2. 對象類型(object): function Array Date RegExp Error
二 類型檢測
Js 中類型檢測方法:
1.typeof
2.instanceof (obj instanceof Object)
instanceof 運算符用於一個構造函數的prototype屬性所指向的對象是否存在另外一個要檢測的對象上。
instanceof坑:不一樣window或iframe之間的對象類型檢測不能使用instanceof!
instanceof在判斷對象是否是數組,Data,正則等時很好用。
(1) 普通用法
(2) 繼承中判斷實例是否屬於它的父類
(3) 複雜用法
總結
模擬函數 A instanceof B
//一張圖理解prototype、proto和constructor的三角關係 (參考此博文,能夠詳細瞭解原型鏈)
https://www.cnblogs.com/xiaohuochai/p/5721552.html
3.Object.prototype.toString
須要注意的是IE6/7/8中 Object.prototype.toString.apply(null)返回「[object Object]」。
4.constructor
//一張圖理解prototype、proto和constructor的三角關係 (參考此博文,能夠詳細瞭解原型鏈)
https://www.cnblogs.com/xiaohuochai/p/5721552.html
5.如何檢測一個變量是字符串
有另一種方法:將變量和空字符拼接後再和原來變量作全等判斷
三 顯式轉換和隱式轉換
A.顯式轉換:
1. Number:
(1)原始類型值的轉換規則
Number: 不變
String: 若是能夠被解析爲數值,則轉換爲相應的數值,不然獲得NaN。空字符串轉爲0。
Boolean:true轉成1,false轉成0。
undefined:轉成NaN。
null:轉成0。
(2)對象的轉換規則
先調用對象自身的valueOf方法,若是該方法返回原始類型的值(數值、字符串和布爾值),則直接對該值使用Number方法,再也不進行後續步驟。
若是valueOf方法返回複合類型的值,再調用對象自身的toString方法,若是toString方法返回原始類型的值,則對該值使用Number方法,再也不進行後續步驟。
若是toString方法返回的是複合類型的值,則報錯。
2. String
(1)原始類型值的轉換規則
數值:轉爲相應的字符串。
字符串:轉換後仍是原來的值。
布爾值:true轉爲「true」,false轉爲「false」。
undefined:轉爲「undefined」。
null:轉爲「null」
(2)對象的轉換規則
若是要將對象轉爲字符串,則是採用如下步驟。
先調用toString方法,若是toString方法返回的是原始類型的值,則對該值使用String方法,再也不進行如下步驟。
若是toString方法返回的是複合類型的值,再調用valueOf方法,若是valueOf方法返回的是原始類型的值,則對該值使用String方法,再也不進行如下步驟。
若是valueOf方法返回的是複合類型的值,則報錯。
// String方法的這種過程正好與Number方法相反
Boolean函數
如下六個值的轉化結果爲false,其餘的值所有爲true。
undefined
null
-0
+0
NaN
''(空字符串)
(2)對象的轉換規則
全部對象的布爾值都是true,甚至連false對應的布爾對象也是true。
Boolean(new Boolean(false))
// true
請注意,空對象{}和空數組[]也會被轉成true。
Boolean([]) // true
Boolean({}) // true
B.隱式轉換
+ 200 + '3' 變成字符串
- * / % '200' - 3 變成數字
++ -- 變成數字
> < 數字的比較 、字符串的比較
! 取反 把右邊的數據類型轉成布爾值
==
// alert( Number('……') ); NaN
// alert( '……'-9 ); NaN
//NaN 數據類型轉換失敗的時候,會返回NaN;
// alert( '2' == 2 ); //true
// alert('10'>9) 返回true, 此時是數字的比較
// alert( '10000000' > '9' ); 返回false,此時是字符串的比較,比較的是兩者的編碼;
// > < 是數字的比較與字符串的比較
// alert(!'ok'); 這時候返回false
在預期爲布爾值的地方,系統會自動調用內部的Boolean方法來轉換
// Boolean方法 能夠將任意類型的變量轉爲布爾值
'+'運算符
字符串: 兩個運算子之中,只要有一個是字符串,則另外一個無論是什麼類型,都會被自動轉爲字符串,而後執行字符串鏈接運算
兩個運算子都爲數值或布爾值 // 這種狀況下,執行加法運算,布爾值轉爲數值(true爲1,false爲0)
運算子之中存在對象(或者準確地說,存在非原始類型的值),則先調用該對象的valueOf方法。若是返回結果爲原始類型的值,則運用上面兩條規則;不然繼續調用該對象的toString方法,對其返回值運用上面兩條規則。
'a==b'
'123' == 123
0 == false
null == undefined
new Object() == new Object()
[1,2] == [1,2]
'a===b'
null === null
true
undefined === undefined
true
NaN === NaN
false
new Object() === new Object()
false
四 常見面試題分享
1.JS變量按照存儲方式區分爲哪些類型,並描述其特色
答案:值類型和引用類型 值類型存儲的是值 賦值以後原變量的值不改變 引用類型存儲的是地址 賦值以後是把原變量的引用地址賦值給新變量 新變量改變原來的會跟着改變