在 js 中常見的六種數(shù)據(jù)類型:String 類型、Null 類型、Number 類型、Boolean 類型、Object 類型。
涉及到數(shù)據(jù)類型,不免會提到,操作符 typeof。要注意:
alert(typeof null); // 返回 object
function demo(){
alert('demo');
}
alert(typeof demo); // 返回 function
注意,如果 Object 類型的 對象變量開始不知道賦值什么,不要 var demo={};最好是 設置成 null;
var d2=null;
d2={'key':"shit"};
var d3='';// 字符串 默認
var d4=0; //Number 類型 初始值設置為 0
var d5=null; // 對 object 類型設置初始默認值
1、如果用 “==” 進行比較,他們是相等的,因為比較的是值
2、區(qū)分他們有兩種方法(他們的核心都是比較他們的 數(shù)據(jù)類型)
1)使用 typeof 將他們區(qū)分開
2)使用全等 “===” :比較的是 值和 數(shù)據(jù)類型,只有全都相同 才返回 true
alert(undefined == null); //true
alert(typeof undefined == typeof null); //false
alert(undefined === null); //true
1、true 和 1 比較是相同,false 和 0 比較是相同(是 “==” 比較),因為內(nèi)部會實現(xiàn) 數(shù)據(jù)類型的 轉化,將 true 轉換成 1,將 false 轉換成 0. js 內(nèi)部有很多數(shù)據(jù)類型的自動轉換,這是大家一定要注意的。后面還會提到很多。但是使用 “===” 就不相等了,因為 他們的數(shù)據(jù)類型是不等的。
2、顯示轉換成 Boolean,使用 Boolean() 方法顯示轉換,需要注意的是各種數(shù)據(jù)類型,什么時候轉換成 true 什么時候轉換成 false
1)String 類型,只要不是 空字符串 都會 轉換成 true
2)Number 類型,只要不是 0 ,即使是 負數(shù),都會轉換成 true
3)Object 類型,只要 不是 null 類型,都會轉換成 true
4)Undefined 類型,都會轉換成 false
我就不做演示,大家可以自己動手試一下。
3、(***)if()語句的()內(nèi)部就是調(diào)用了 Boolean 函數(shù)
1、float 類型 不能做精準運算
alert(0.1+0.2);// 返回 0.300000000000000004
2、 支持 科學計數(shù)法 運算
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: 因為 字符串類型 的數(shù)字 可以自動轉換成 數(shù)字
alert(isNaN('lew'));//true
alert(isNaN(false));//(*)false: 因為 bool 值 可以轉換成數(shù)字,true 變 1,,false 變 0
5)isNaN()內(nèi)部執(zhí)行原理:同樣適用于對象。實現(xiàn)原理:首相調(diào)用對象的 valueOf()方法,如果能轉換成數(shù)字就直接做判斷;如果不能就再調(diào)用 toString()方法,然后測試返回值。
valueOf()內(nèi)部調(diào)用了 toObject()方法,兩個方法的內(nèi)部執(zhí)行的原理:如下圖:
http://wiki.jikexueyuan.com/project/brief-talk-js/images/1.png" alt="" />
var box={
// 重寫 box 對象的 toString() 方法
toString:function(){
return '123';
}
};
alert(isNaN(box));//false
alert(box);//123 alert() 內(nèi)部也是 先調(diào)用了 對象的 valueOf() 然后調(diào)用 toString() 方法
6)將其他數(shù)據(jù)類型轉換成 Number 類型
含有三個函數(shù):Number(): 可以針對所有的數(shù)據(jù)類型進行轉換;parseInt()和 parseFloat()只針對 字符串進行轉化。
alert(Number('123'));//123
alert(Number('0234'));//234
alert(Number(true));//1
alert(Number(null));//(**)0
// 除了 上面的 其他的都是 返回 NaN
alert(Number(undefined))//NaN
Number()內(nèi)部實現(xiàn)的原理:同 isNaN()也是先調(diào)用 valueOf()然后調(diào)用 toString()。所以可想而知,性能是比較差的。所以所過只要要被轉型的對象是字符串的話,就調(diào)用 parseInt()或者 parseFloat()為他們內(nèi)部不需要對類型做判斷。
parseInt()和 parseFloat()調(diào)用注意:從第一個為數(shù)字的字符開始一直到第一個部位數(shù)字的字符的前一個數(shù)字的這部分字符串轉換成數(shù)字
alert(parseInt('123leb'));//123
alert(parseInt('123leb345'));//123
alert(parseInt('len234'));//NaN
當 parseInt()里面的參數(shù)是 float 類型的那么只取得數(shù)字的整數(shù)部分
alert(parseInt(56.12));//56
1)( 重要 )在 ECMAScript 中 字符串有不變性:字符串創(chuàng)建之后就不會再改變。
要改變一個已經(jīng)被賦值的字符串變量,首先要先銷毀變量中字符串,然后再用一個包含新值的字符串填充變量。
var d='hello';
d=d+'shit';// 執(zhí)行過程:先將 'hello'賦值一份,然后將 d 中的字符串清空,將字符串 'hello' 和 'shit'進行拼接,然后賦值給 d 變量。(所以 字符串 的值 一旦 被 創(chuàng)建之后 就不會 改變)
2)toString()方法將其他數(shù)據(jù)類型轉換成 String 類型。但是如果對 null 或 undefined 進行操作的話就會報錯。
3)但是 String()方法同樣能實現(xiàn) toString()的效果,但是 可以對 null 和 undefined 進行操作。
內(nèi)部原理:先 調(diào)用 toString(),如果可以轉換成字符串,就將結果直接返回。否,再進行判斷是 null 還是 undefined,然后返回‘null' 或 ‘undefined'
總結:如果知道 變量不可能是 null 或 undefined,就使用 toString()性能比 String(),因為 String()內(nèi)部還要做判斷,所以有損性能。