javasscript有5種簡單數據類型(也成爲基本數據類型):
Undefined、Null、Boolean、Number、String
1種複雜數據類型:
Object
在javascript中所有值的數據類型就是上述6種之一了。那麼我們需要一個方法來檢測給定變量到底是那種數據類型,typeof操作符就可以幫助我們解決問題。
var msg="博客園"; alert(typeof msg); // "string" alert(typeof 110); // "number"
使用typeof 操作符,返回下列某個字符串:
"undefined" --該值未定義
"boolean"--布爾值
"string"--字符串
"number"--數值
"object"--對象或null
"function"--函數
看到這裏我們對"object"--對象或null有些疑惑,爲什麼 typeof null 會返回object,這裏我們需要記住的是null是一個特殊類型,他表示對一個空對象的引用,所以會返回object。
華麗的分割線 ----------------------------------------------------------------------------------------------------------------------------------------------------------------
1.Undefined類型
當我們聲明一個變量時沒有對其進行初始化,這個變量的值就是undefined:
var msg; alert(msg==undefined); // true
例子中聲明變量msg,並沒有對其進行初始化,所以會彈出undefined。
所以聲明變量時我們也可以使用undefined來初始化變量:var msg=undefined,
但是未經初始化的值會默認取得undefined,這種寫法也沒必要了。
var msg; // 聲明變量,默認取得undefined // 變量name沒有聲明 // var name alert(msg); // "undefined" alert(name); // 產生錯誤
上述代碼name變量並沒有被聲明,傳遞給alert函數時產生一個錯誤。
這時我們用typeof檢測一下我們的變量:
var msg; // 聲明變量,默認取得undefined // 變量name沒有聲明 // var name alert(typeof msg); // "undefined" alert(typeof name); // "undefined"
結果是未初始化和未聲明的變量執行typeof都返回了undefined,這個結果有其邏輯上的合理性。因爲雖然這兩種變量從技術上角度看有本質區別。
即便未初始化的變量會自動賦予undefined值,但養成顯式初始化變量(即在聲明變量的同時給變量賦值)的習慣。如果能夠做到這一點,那麼當typeof操作符返回undefined
時,我們就知道被檢測的變量是有還是沒有被聲明的,而不是尚未初始化的了。
2.Null類型
前面說過null是一個特殊的類型,表示對一個空對象的引用。
但是undefined和null之間有什麼關係呢?看下面的代碼:
alert(null==undefined); // true
實際上,undefined值派生自null值,因此ECMA-262規定它們的相等測試要返回teue。
儘管有這樣的關係,但他們的用途完全不同。前面也說過聲明變量沒有必要顯示的初始化爲undefined,會默認取得。對於null卻不能這樣了,也就是說聲明一個變量來保存對象,只要
變量還沒有保存,就應該讓變量明確保存null值。這樣既能體現null作爲空對象指針的特性,又能區分null和undefined。
3.boolean類型
boolean類型只有兩個值:true和false。這兩個值與數值值不是一回事,因此true不一定等於1,false也不一定等於0。
boolean類型的字面值true和false是區分大小寫的。像True和False都不是boolean值,而是標識符。
雖然boolean類型的值只有兩個,但是其他類型的值都有與這兩個boolean值等價的值。將一個值轉換爲其對應的boolean值,需要調用Boolean()函數。
var msg="博客園"; alert(Boolean(msg)); // true
在上述代碼中字符串msg被轉換成了一個boolean值。可以對任何數據類型的值調用Boolean()函數,而且總會返回一個boolean值。這個值是true還是false取決於被轉換數值的數據類型和具體的值。
看如下各數據類型及對應的轉換規則:
數據類型 轉換爲true的值 轉換爲false的值
boolean true false
string 非空字符串 ""空字符串
number 非零數值 0 和 NaN
objeact 任何對象 null
undefined ----不適用 undefined
通過這些轉換規則,可以幫我們很好的理解控制流語句if自動執行相應的Boolean轉換:
var msg="博客園"; if(msg) { alert("變量msg被轉換爲true"); }
運行上述代碼,就會顯示一個警告框。字符串msg被自動的轉換爲對應的Boolean值。明白這個原理,我們就能很好的在控制語句if中使用變量了。
4.number類型
3.1整數,最常用的就是十進制整數了。當然還有八進制、十六進制,這裏不做講解了。
需要注意的是在做算術計算時,所有以八進制和十六進制表示的數值最終都會被轉換成十進制數值。
3.2浮點數值,就是該數值中必須包含一個小數點,小數點後面必須有一位數字。
var num1=1.1; var num2=1.2; var num3=.3; // 有效,但不推薦
由於保存浮點數值需要的內存空間是保存整數值的兩倍,因此ECMAScript會自動把相應的浮點數值轉換爲整數值。如果小數點後面沒有跟數值(2.)或者後面跟了一個零(2.0),
這個值就會被作爲整數值來保存:
var num1=2.; alert(num1); // 2,小數點後沒有數值解析爲2 var num2=2.0; alert(num2); // 2,本身就是一個整數解析爲2
對於那些極大或者極小的數值,可以用e表示法(科學計數法)來表示浮點數值。
科學計數法的格式:整數/浮點數 + e/E + 10的冪中的指數
3.125 e 7 ==
var num1=3.125e7; // 31250000
3.3數值範圍,由於內存的限制,並不能保存所有的數值。
能表示的最小值:Number.MIN_VALUE,這個值是5e-324。
能表示的最大值:Number.MAX_VALUE,這個值是1.7976931348623157e+308。
如果你的某次計算得到的值不在javascript最小和最大值這個範圍內,那麼你的值會被自動轉換成特殊的Infinity值。
如果這個值是負數,會轉換成-Infinity(負無窮);如果是正數,則是轉成Infinity(正無窮)。
3.4 NaN:非數值。有兩個特點:
一、任何涉及NaN的操作都會返回NaN(例如NaN/5).
二、NaN與任何值都不相等,包括本身。
alert(NaN==NaN); // false
針對NaN的這兩個特點,javascript定義了isNaN()函數。這個函數接收一個參數,該參數可以是任何類型,函數會幫我們確定這個參數是否“不是數值”。
isNaN()在收到一個值後,會嘗試將這個值轉換爲數值,某些不是數值的值會直接轉換爲數值,(字符串“10”或Boolean),任何不能被轉換的都會返回true
alert(isNaN(NaN)); // true alert(isNaN(10)); // false 10是數值 alert(isNaN("10")); // false "10"可以被轉換爲數值10 alert(isNaN("博客園")); // true 不能轉換爲數值 alert(isNaN(false)); // false 可以被轉換爲0
5.String類型
字符串是 JavaScript 的一種基本的數據類型。
String 對象的 length 屬性聲明瞭該字符串中的字符數。
String 類定義了大量操作字符串的方法,例如從字符串中提取字符或子串,或者檢索字符或子串。
6.object類型
一組數據和功能的集合,對象可以通過new操作符來創建對象。
var obj=new Object();
可以自定義對象的屬性或方法:
var obj=new Object(); obj.name="張三"; obj.say=function(){ alert(this.name) }
還可以這麼寫:
var obj={ name:"張三", say:function(){ alert(this.name) } }
結果是一樣的。
在javascript中object是所有對象的基礎,因此所有的對象都具有object的屬性和方法。