理顺 JavaScript (4) - 变量、常量与数据类型
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(); /* 赋予一个正则表达式对象 */ 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 */