理顺 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 的示例:
理顺 JavaScript (4) - 变量、常量与数据类型_JavaScript



还有一个 "常量" 的问题.
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 */