var v1 = 123; /* 聲明變數、同時初始化為數字 */var v2 = 'ABC'; /* 聲明變數、同時初始化為字串 */var v3,v4; /* 已聲明還沒有初始化的變數, 類型未知(未知也是一種類型: undefined) */x = 1; y = 2; /* 缺失 var(未聲明)的變數也可以使用, 但會讓編譯器在幕後補充聲明; 最好別這樣 */alert(x + y); /* 3 */
JavaScript 到底有幾種資料類型? 不如從例子中去解析:
var X; /* 先聲明一個變數 X */alert(typeof X); /* 用 typeof 函數查看其類型是: undefined */X = 123; /* 賦予數字值 */alert(typeof X); /* 此時的類型是: number */X = 'ABC'; /* 賦予字串值 */alert(typeof X); /* 此時的類型是: string */X = true; /* 賦予布爾值(true 或 false) */alert(typeof X); /* 此時的類型是: boolean */X = function(){}; /* 賦予一個函數 */alert(typeof X); /* 此時的類型是: function */X = new Array(1,2,3); /* 賦予一個數組 */alert(typeof X); /* 此時的類型是: object */X = new Date(); /* 賦予一個日期值 */alert(typeof X); /* 此時的類型是: object */X = new RegExp(); /* 賦予一個Regex對象 */alert(typeof X); /* 此時的類型是: object */X = new String(); /* 賦予一個字串對象 */alert(typeof X); /* 此時的類型是: object */X = new Boolean(); /* 賦予一個布爾對象 */alert(typeof X); /* 此時的類型是: object */X = new Number(); /* 賦予一個數字對象 */alert(typeof X); /* 此時的類型是: object */X = new Error(); /* 賦予一個 Error 對象 */alert(typeof X); /* 此時的類型是: object */X = new Object(); /* 賦予一個 Object 對象 */ alert(typeof X); /* 此時的類型是: object */
從例子中總結出 JavaScript 的資料類型:
undefined /* 沒有賦值或不存在的變數的類型 */number /* 數字類型 */string /* 字串類型 */boolean /* 布爾類型 */function /* 函數類型 */object /* 物件類型, 其中數組等都屬於 object 類型 */
可以從實踐中求證一下:
alert(typeof window); /* object */alert(typeof window.screen); /* object */alert(typeof window.closed); /* boolean */alert(typeof window.document); /* object */alert(typeof window.document.body); /* object */alert(typeof window.document.body.offsetWidth); /* number */alert(typeof window.document.body.clientHeight); /* number */alert(typeof window.document.title); /* string */alert(typeof window.document.Title); /* undefined *//* 上面最後一個是 undefined, 這表示對象或屬性不存在; 因為 JS 區分大小寫, document 對象不包含 Title 對象或屬性, document 的標題屬性應該是 title */
從前面看到:
既有一個 string 類型, 又有一個 String 對象;
既有一個 number 類型, 又有一個 Number 對象;
既有一個 boolean 類型, 又有一個 Bollean 對象...
這是 JS 為了簡單而帶來的麻煩, 其實不用考慮那麼多, 可以把 string 與 String 混起來使用, JS 編譯器會在幕後處理一切; 譬如:
var X = new String('ABC'); /* 此時 X 是 String 對象 */var Y = new String('123'); /* 此時 Y 是 String 對象 */var XY = X + Y; /* 此時 XY 是 string 類型 */alert(XY); /* ABC123 */alert(XY.length); /* 6 */var X = 'ABC'; /* 此時 X 是 string 類型 */var Y = '123'; /* 此時 Y 是 string 類型 */var XY = new String(X + Y); /* 此時 XY 是 String 對象 */alert(XY); /* ABC123 */alert(XY.length); /* 6 *//* 上面的字串長度屬性(length) 本來是屬於 String 對象的, string 類型的字串照樣使用; 這有可能是編譯器迅速做了個轉換; 在 JS 中任何類型的轉換都是方便自由的. */
說到 JavaScript 類型的簡單化, 它的數實值型別只有一個 number(類似與 Delphi 的 Double);
也沒有單個字元類型, 需要時給長度是 1 的字串就是了.
和 Delphi 的指標類似, 可以給 JS 的變數賦空值: null; 這個 null 和上面的 undefined 不好區別.
null 是已賦值, 但是空值;
undefined 是沒賦值或不存在.
alert(undefined == null); /* true ; 簡單地看, 它們差不多 */alert(undefined === null); /* false ; 仔細地看, 它們不一樣 *//* null 作為空白值(相當與 0)可以參與數值運算 */var X;X = 123 + null; alert(X); /* 123 */X = 123 + undefined; alert(X); /* NaN *///JS 的理念應該是這樣的://未知類型也是類型, 沒有賦值也是值: undefined;//空值也是值: null.
再展示一個遭遇 null 和 undefined 的樣本:
還有一個 "常量" 的問題.
JS 本來沒有常量, 所謂的常量不過是提前賦值的變數而已.
Infinity; /* 無窮大 */NaN; /* 非數字值 */Number.MAX_VALUE; /* 最大數值(JS 可以表示的) */Number.MIN_VALUE; /* 最小數值(JS 可以表示的) */Number.NaN; /* 非數字值 */Number.NEGATIVE_INFINITY; /* 負無窮大 */Number.POSITIVE_INFINITY; /* 無窮大 *//* 取值測試: */alert(Number.MAX_VALUE); /* 1.7976931348623157e+308 */alert(Number.MIN_VALUE); /* 5e-324 */alert(Number.NaN); /* NaN */alert(Number.NEGATIVE_INFINITY); /* -Infinity */alert(Number.POSITIVE_INFINITY); /* Infinity */alert(Infinity); /* Infinity */alert(NaN); /* NaN *//* 常量還有其它, 譬如(IE7): */alert(window.navigator.appCodeName); /* Mozilla - 瀏覽器代碼*/alert(window.navigator.appName); /* Microsoft Internet Explorer - 瀏覽器名稱 */alert(window.navigator.appVersion); /* 4.0 ... - 瀏覽器版本 */
另外, 瀏覽器中 JS 的全域變數都直屬瀏覽器的 window 對象, 儘管常常省略這個首碼:
var X = 111;alert(window.X); /* 111 */window.Y = 222; alert(Y); /* 222 */function MyFun(x, y) { return x + y;}alert(MyFun(1, 2)); /* 3 */alert(window.MyFun(1, 2)); /* 3 */