[0]5種資料型態:
[0.1]基本資料型態:Undefined、Null、Boolean、Number、String
[0.1.1]基本型別值是指簡單的資料段,有5種基本型別是依數值存取的,因為可以操作儲存在變數中的實際值
[0.1.2]基本型別的值在記憶體中佔據固定大小的空間,並保存在堆疊記憶體中。從一個變數複製到另一個變數基本類型的值,就會建立這個值的一個副本。
[0.1.3]無法增加基本型別屬性
[0.2]引用資料型態:Object
[0.2.1]引用型態值是指那些可由多個數值所構成的物件。 js不允許直接存取記憶體中的位置,也就是無法直接存取操作物件的記憶體空間。在操作物件時,實際上是在操作物件的參考而不是實際的物件。
[0.2.2]所引用型別的值是對象,保存在堆記憶體中,包含引用型別值的變數實際上所包含的並不是對象本身,而是指向該對象的指標。從一個變數複製到另一個變數引用型別的值,複製的其實是指針,所以兩個變數最後都指向同一個物件。
[0.2.3]對於引用型別的值,可為其新增屬性與方法,也可變更及刪除其屬性及方法
[1]Undefined
[1.1]Undefined型別只有一個值,就是undefined
[1.2]var a var a = undefined;
[1.3]對於尚未聲明過的變量,只能執行一項操作,就是使用typeof操作符檢測其資料類型【但在嚴格模式下會導致錯誤】
[1.4]出現場景:
[1.4.1]已宣告未賦值的變項
[1.4.2]取得物件不存在的屬性
[1.4.3]無回傳值的函數的執行結果
[1.4.4]函數的參數沒有傳入
[1.4.5]void(expression)
[1.5]型別轉換
Boolean(undefined):false
Number(undefined):NaN
String(undefined):'undefined'
[2]Null
[2.1]Null型別只有一個值,就是null,邏輯角度看,null值表示一個空物件指標
[2.2]如果定義的變數將用於保存對象,最好將此變數初始化為null
[2.3]實際上undefined值是衍生自null值的,所以undefined == null
[2.4]出現場景:物件不存在時
[2.5]型別轉換
Boolean(null):false
Number(null):0
String(null):'null'
[注意1]null是空對象指針,而[]是空數組,{}是空對象,三者不相同
[注意2]null不能新增自訂屬性
[3]Boolean
[3.1]Boolean型別只有兩個值:true 與 false
[3.2]出現場景:
[3.2.1]條件語句導致系統執行的隱士型別轉換
[3.2.2]字面量或變項定義
[3.3]型別轉換
Number(true): 1 || Number(false) : 0
String(true):'true' || String(false):'false'
[3.4]Boolean()
Boolean(undefined):false
Boolean(null):false
Boolean(非空白物件包含空白陣列[]與空白物件{}):true
Boolean(非0): true || Boolean(0和NaN):false
Boolean(非空白包含空格字串):true || Boolean(''):false
[注意]true不一定等於1,false也不一定等於0
[4]Number
[4.1]Number型別使用IEEE754格式表示整數與浮點數
[注意]可以用一個值-0來將其轉換成一個數字
[4.2]三種字面量格式是十進位、八進位、十六進位
[4.2.1]八進製字面值的第一位必須是0,然後是八進制數字序列(0-7),如果字面值中的數值超出了範圍,那麼前導0將被忽略,後面的數值被當作十進制數解析
[4.2.2]八進位字面量在嚴格模式下是無效的,會導致js拋出錯誤
[4.2.3]十六進位字面值的前兩位必須是0x,後接十六進位數字序列,字母可大寫可小寫
[4.2.4]十六進位中字面數值中的數值走出範圍,如出現g,h等會報錯
[4.2.5]在進行算術計算時,所有以八進位和十六進位表示的數值最終都將轉換成十進制數值
[4.3]數值表示:
[4.3.1]js中可保存正0和負0,且被認為相等
[4.3.2]浮點數值:此數值中必須包含一個小數點,且小數點後面必須至少有一位數字。
[4.3.2.1]由於浮點型數值所需要的記憶體空間是保存整數值的兩倍,因此js會不失時機地將浮點數數值轉換成整數值,若小數點後沒有接任何數字或浮點數值本身表示的就是一個整數,這個數值會被當作整數值來保存。
[4.3.2.2]浮點數數值的最高精確度為17位元小數
[4.3.2.3]對於極大化或極小的數,可以科學數法e表示的浮點數值來表示
[4.3.2.4]預設情況下,js會將小數點後面帶有6個0以上的浮點數數值轉換為以e表示法表示的數值
[4.3.2.5]以IEEE754數值為基礎的浮點計算的通病是捨入誤差的問題。如:0.1 0.2 === 0.3(15個0)4
[4.3.3]js中的數值範圍是Number.MIN_VALUE(5e-324) —— Number.MAX_VALUE(1.7976931348623157e 308)
[4.3.3.1]若超出正數範圍,且輸出Infinity(正無窮大),超出負數範圍,輸出-Infinity(負無限大)
[4.3.3.2] -Infinity無法參與數值計算
[4.3.3.3]Number.MAX_VALUE 1 != Infinity,因為電腦最多保存52位元尾數位,保存不了1000多位,早就失去精度,即小數位全為0,所以相加不變
[4.3.3.4]Number.MIN_VALUE - 1 != -Infinity,也是同樣的原因,所以結果為-1[4.3.3.5]可以用isFinite()來決定一個數值是不是有窮的,包含隱式型別轉換Number()
[4.3.3.6]isFinite(NaN) //false
[4.3.4]NaN
[4.3.4.1]NaN與任何數值均相等,且包括NaN本身
[4.3.4.2]任何涉及NaN的作業都會回傳NaN
[4.3.4.3]isNaN()判斷這個數字是不是NaN,包含隱式類型轉換Number()
[4.4]數值轉換:Number()可用於任何類型,parseInt()和parseFloat專門用於將字串轉換成數值
[注意1]Number()、parseInt()、parseFloat()可以接受各種進位的數字,但對於含數字的字串並不適用
[注意2]Number()、parseInt()、parseFloat()中數字為1.2. 會報錯,但字串為'1.2.'則不會報錯
[4.4.1]Number()
Number(true):1 || Number(false):0
Number(各種進位的數字):運算後的十進位的數字,如1.0或1.或01會以1輸出
Number(undefined):NaN
Number(null):0
Number(字串):
Number(且包含數字的十進位與十六進位的字串):運算後的十進位的數字
[將]在字串中辨識出八進位,並依照十進位數字處理
Number(''且' '):0
Number(其他情境的字串):NaN
Number(物件):
Number([]與[0]與[-0]):0
Number([數位]):運算後的數字
Number([1,2]及{}及其他物件):NaN
[4.4.2]parseInt():在轉換字串時,會忽略字串前方的空格,直到找到第一個非空格字元。如果第一個字元不是數字字元或負號,parseInt()就會回傳NaN。如果是,則繼續解析,直到解析完成或遇到非數字字元。
[4.4.2.1]parseInt()可辨識各種進位的整數,但在解析八進位字面量的字串,ECMAScript3會解析八進位,但ECMAScript5沒有解析八進位的能力
[4.4.2.2]parseInt()函數提供第二個參數,並表示多少進制,如:parseInt('123',16或10或2)
[4.4.2.3]parseInt(各種進位的數字):運算後的十進位的數字,如1.0或1.或01會以1輸出
[4.4.2.4]因為parseInt()是專門用來處理字串轉換數字的,所以parseInt(其他類型包括'')//NaN
[4.4.3]parseFloat():類似parseInt(),會忽略字串前方的空格,直到找到第一個非空格字元
[4.4.3.1]parseFloat()且只能解析十進位字串
[4.4.3.2]parseFloat(各種進位的數字):運算後的十進位的數字,如1.0或1.或01會以1輸出
[5]String:由單引號或雙引號括起來的字元序列,任何字串的長度都可以透過存取length屬性來獲得
[5.1]字元字面量,也叫轉義序列
n 換行上
t 製表
b 空格
r 回車
f 進紙
\ 斜槓
' 單引號
" 雙引號
xnn 以十六進位nn表示一個字元(n為0-f),如x41表示'A'
unnnn 以十六進位nnnn表示一個Unicode字元(n為0-f),如u03a3表示希臘字元ε
[5.2]ECMAScript中的字串是不變的
[5.3]字串連線需要先建立新字串,然後在新字串中填入兩個需要拼接的字串,最後再銷毀原來的字串。這個過程在後台發生,也是在某些舊版瀏覽器(IE6)拼接字串速度慢的原因,但後來已經解決了這個低效率問題
[5.4]字串轉換
[5.4.1]toString()
Null且Undefined沒有此方法
Boolean、Object、String有方法
Number使用此方法可傳遞基數2、8、10、16,如var num = 10;num.toString(2);//1010
但10.toString(2)會錯誤使用,因為數位後面無法接上識別碼
[5.4.2]String()
有toString()方法,並使用toString()方法
String(null);//'null'
String(undefined);//'undefined'
[5.4.3]將某個值轉換為字串,並使用加號運算子把它與一個空字串''加在一起
[5.4.4]如果陣列中的某一項的值是null或undefined,那麼該值在join()、toLocaleString()、toString()和valueOf()方法傳回的結果以空字串表示
最後給大家一個簡單的例子說明下這五種基本類型的不同
var testString = "Hello"; var testBoobean = true; var testUndefined = undefined; var testUndefined1; var testNull = null; var testObject = {a:1}; var testFunction = function(){return;}; alert(testString);//"string" alert(testBoobean);//"boolean" alert(testUndefined);//"undefined" alert(testUndefined1);//"undefined" alert(testUndefined2);//"undefined" alert(testNull);//"object" alert(testObject);//"object" alert(testFunction);//"function"