变量在脚本中的第一次出现是在声明中。变量在第一次用到时就设置于内存中,便于后来在脚本中引用。使用变量之前先进行声明。可以使用 var 关键字来进行变量声明。
var count; //
单个声明。var count, amount, level; //
用单个var
关键字声明的多个声明。var count = 0, amount = 100; //
一条语句中的变量声明和初始化。
如果在 var 语句中没有初始化变量,变量自动取 JScript 值 undefined。尽管并不安全,但声明语句中忽略 var 关键字是合法的 JScript 语法。这时,JScript 解释器给予变量全局范围的可见度。当在过程级中声明一个变量时,它不能用于全局范围;这种情况下,变量声明必须用 var 关键字。
当要声明一个变量并进行初始化,但又不想指定任何特殊值,可以赋值为 JScript 值 null。下面给出示例。
var bestAge = null; var muchTooOld = 3 * bestAge; // muchTooOld
的值为0
。
如果声明了一个变量但没有对其赋值,该变量存在,其值为Jscript 值 undefined。下面给出示例。
var currentCount; var finalCount = 1 * currentCount; // finalCount
的值为NaN
,因为currentCount
为undefined
。
注意在 JScript 中 null 和 undefined 的主要区别是 null 的操作象数字 0,而 undefined 的操作象特殊值NaN (不是一个数字)。对 null 值和 undefined 值作比较总是相等的。
可以不用 var 关键字声明变量,并赋值。这就是隐式声明。
在 Jscript 中,可以对不同类型的值执行运算,不必担心 JScript 解释器产生异常。相反,JScript 解释器自动将数据类型之一改变(强制转换)为另一种数据类型,然后执行运算。例如:
运算 | 结果 |
---|---|
数值与字符串相加 | 将数值强制转换为字符串。 |
布尔值与字符串相加 | 将布尔值强制转换为字符串。 |
数值与布尔值相加 | 将布尔值强制转换为数值。 |
考虑下面的示例。
var x = 2000; //
一个数字。var y = "Hello"; //
一个字符串。x = x + y; //
将数字强制转换为字符串。document.write(x); //
输出2000Hello
。
要想显式地将字符串转换为整数,使用 parseInt 方法。要想显式地将字符串转换为数字,使用 parseFloat 方法。请注意,比较大小时字符串自动转换为相等的数字,但加法(连接)运算时保留为字符串。
另外,JScript包含特殊值数字。它们是:
- NaN (不是数)。当对不适当的数据进行数学运算时使用,例如字符串或未定义值。
- 正无穷大。在JScript中如果一个正数太大的话使用它来表示。
- 负无穷大。在JScript中如果一个负数太大的话使用它来表示。
- 正0和负0。Jscript区分正0和负0。
Null 数据类型
在 Jscript 中数据类型 null 只有一个值:null。关键字 null 不能用作函数或变量的名称。
请注意,在 Jscript 中,null 与 0 不相等(与在 C 和 C++ 中不同)。同时应该指出的是,Jscript中 typeof 运算符将报告 null 值为 Object 类型,而非类型 null。这点潜在的混淆是为了向下兼容。
Undefined 数据类型
如下情况使返回 undefined 值:
- 对象属性不存在,
- 声明了变量但从未赋值。
注意不能通过与 undefined 做比较来测试一个变量是否存在,虽然可以检查它的类型是否为“undefined”。
//
这种方法不起作用if (x == undefined)
//
作某些操作//
这个方法同样不起作用-
必须检查//
字符串"undefined"
if (typeof(x) == undefined)
//
作某些操作//
这个方法有效if (typeof(x) == "undefined")
//
作某些操作
考虑将 undefined 值与null做比较。
someObject.prop == null;
如下情况时,比较的结果为 true,
- 如果属性 someObject.prop 包含 null 值,
- 如果属性 someObject.prop 不存在。
- 要检查一个对象属性是否存在,可以使用新的 in 运算符:
if ("prop" in someObject) // someObject
有属性'prop'
== (相等)与 === (严格相等)的区别在于恒等运算符在比较前强制转换不同类型的值。例如,恒等对字符串 "1" 与数值 1 的比较结果将为 true。而严格相等不强制转换不同类型的值,因此它认为字符串 "1" 与数值 1 不相同。
基本的字符串、数值和布尔值是按值比较的。如果它们的值相同,比较结果为相等。对象(包括Array、Function、String、Number、Boolean、Error、Date以及 RegExp 对象)按引用比较。即使这些类型的两个变量具有相同的值,只有在它们正好为同一对象时比较结果才为 true。
例如:
//
具有相同值的两个基本字符串。
var string1 = "Hello";
var string2 = "Hello";
//
具有相同值的两个 String
对象。
var StringObject1 = new String(string1);
var StringObject2 = new String(string2);
//
比较结果为 true
。
if (string1 == string2)
//
执行某些命令(将要运行的)。
//
比较结果为 false
。
if (StringObject1 == StringObject2)
//
执行某些命令(不会运行)。
//
要比较 String
对象的值,
//
用 toString()
或者 valueOf()
方法。
if (StringObject1.valueOf() == StringObject2)
//
执行某些命令(将要运行的)。