在js中常見的六種資料型態:String類型、Null型別、Number型別、Boolean型別、Object型別。
1.typeof的注意點
涉及到資料類型,不免會提到,操作符typeof。要注意:
1.typeof是操作符,不是方法。雖然我們經常使用typeof()的方式來取得物件的資料類型。
2.對null 取typeof 是object(這是因為null是空的物件參考),對函數取typeof 是function
複製代碼代碼如下:
alert(typeof null); //回傳object
function demo(){
alert('demo');
}
alert(typeof demo); //回傳function
2、為各種資料類型的物件變數設定初始值
注意,如果Object類型的物件變數開始不知道賦值什麼,不要var demo={};最好是設定成null;
複製代碼代碼如下:
var d2=null;
d2={'key':"shit"};
var d3='';//字串默認
var d4=0; //Number 類型初始值設定為0
var d5=null; //對object 類型設定初始預設值
3、undefined 和null 的區別和注意點
1.如果用“==” 進行比較,他們是相等的,因為比較的是值
2.區分他們有兩種方法(他們的核心都是比較他們的資料類型)
1)使用typeof 將他們區分開
2)使用全等「===」 :比較的是值和資料類型,只有全都相同才會回傳true
複製代碼代碼如下:
alert(undefined == null); //true
alert(typeof undefined == typeof null); //false
alert(undefined === null); //true
4、Boolean的注意點
1、true 和1 比較相同,false 和0 比較是相同(是“==” 比較),因為內部會實現數據類型的轉化,將true 轉換成1,將false 轉換成0. js 內部有很多數據類型的自動轉換,這是大家一定要注意的。後面還會提到很多。 但是使用“===” 就不相等了,因為他們的資料型別是不等的。
2.顯示轉換成Boolean,使用Boolean()方法顯示轉換,需要注意的是各種資料型,什麼時候轉換成true 什麼時候轉換成false
1)String類型,只要不是空字串都會轉換成true
2)Number類型,只要不是0 ,就算是負數,都會轉換成true
3)Object類型,只要不是null 類型,就會轉換成true
4)Undefined類型,都會轉換成false
我就不做演示,大家可以自己試試看。
3、(***)if() 語句的() 內部就是呼叫了Boolean函數
5.Number類型注意點
1.float類型不能做精準運算
複製代碼代碼如下:
alert(0.1+0.2);//回傳0.300000000000000004
2、 支持科學計數法運算
3、NaN(Not a Number)
1)var d=0/0; 注意:在js 裡是不會報錯的,而是回傳NaN
2)可以透過Number.NaN 來獲取
3)NaN和任何物件做運算都會回傳NaN
4)isNaN()判斷是不是NaN
複製代碼代碼如下:
alert(isNaN(NaN));//true
alert(isNaN(12));//false
alert(isNaN('123'));//false:因為字串類型的數字可以自動轉換成數字
alert(isNaN('lew'));//true
alert(isNaN(false));//(*)false:因為bool 值可以轉換成數字,true變1,,false 變成0
5)isNaN()內部執行原理:同樣適用於物件。實作原理:首相呼叫物件的valueOf()方法,如果能轉換成數字就直接做判斷;如果不能就再呼叫toString()方法,然後測試回傳值。
valueOf()內部呼叫了toObject()方法,兩個方法的內部執行的原理:如下圖:
複製代碼代碼如下:
var box={
//重寫box 物件的toString() 方法
toString:function(){
return '123';
}
};
alert(isNaN(box));//false
alert(box);//123 alert()內部也是先呼叫了物件的valueOf() 然後呼叫toString()方法
6)將其他資料類型轉換成Number類型
含有三個函數:Number():可以針對所有的資料類型進行轉換;parseInt()和parseFloat() 只針對字串進行轉換。
複製代碼代碼如下:
alert(Number('123'));//123
alert(Number('0234'));//234
alert(Number(true));//1
alert(Number(null));//(**)0
//除了上面的其他的都是回NaN
alert(Number(undefined))//NaN
Number()內部實作的原理:同isNaN() 也是先呼叫valueOf() 然後再呼叫toString()。 。所以可想而知,性能是比較差的。 。所以所過只要要被轉型的物件是字串的話,就呼叫parseInt() 或parseFloat()因為他們內部不需要對類型做判斷。
parseInt() 和parseFloat() 呼叫注意:從第一個為數字的字元開始一直到第一個部位數字的字元的前一個數字的這部分字串轉換成數字
複製代碼代碼如下:
alert(parseInt('123leb'));//123
alert(parseInt('123leb345'));//123
alert(parseInt('len234'));//NaN
當parseInt()裡面的參數是float類型的那麼只取得數字的整數部分
複製代碼代碼如下:
alert(parseInt(56.12));//56
6、String類型
1)(*重要*)在ECMAScript中字串有不變性:字串創建之後就不會再改變。
要改變一個已經被賦值的字串變量,首先要銷毀變數中字串,然後再用一個包含新值的字串填入變數。
複製代碼代碼如下:
var d='hello';
d=d+' shit';//執行過程:先將'hello'賦值一份,然後將d 中的字串清空,將字串'hello' 和' shit'進行拼接,然後賦值給d 變數。 (所以字串的值一旦被創建之後就不會改變)
2)toString()方法將其他資料類型轉換成String類型。但是如果對null 或undefined 進行操作的話就會報錯。
3)但是String()方法同樣能實現toString()的效果,但是可以對null 和undefined進行運算。
內部原理:先呼叫toString(),如果可以轉換成字串,就將結果直接回傳。否,再進行判斷是null 還是undefined,然後回傳'null' 或'undefined'
總結:如果知道變數不可能是null 或undefined,就使用toString()效能比String(),因為String()內部還要判斷,所以有損效能。