如果在 var 语句中没有初始化变量,变量自动取 JScript 值 undefined。尽管并不安全,但声明语句中忽略var 关键字是合法的 JScript 语法。这时,JScript 解释器给予变量全局范围的可见度。当在过程级中声明一个变量时,它不能用于全局范围;这种情况下,变量声明必须用var 关键字。
当要声明一个变量并进行初始化,但又不想指定任何特殊值,可以赋值为 JScript 值 null。下面给出示例。
var bestAge = null; var muchTooOld = 3 * bestAge; // muchTooOld 的值为 0。
如果声明了一个变量但没有对其赋值,该变量存在,其值为Jscript 值 undefined。下面给出示例。
注意在 JScript 中 null 和 undefined 的主要区别是 null 的操作象数字 0,而 undefined 的操作象特殊值 NaN (不是一个数字)。对 null 值和 undefined 值作比较总是相等的。var currentCount; var finalCount = 1 * currentCount; // finalCount 的值为 NaN,因为 currentCount 为 undefined。
在 Jscript 中,可以对不同类型的值执行运算,不必担心 JScript 解释器产生异常。相反,JScript 解释器自动将数据类型之一改变(强制转换)为另一种数据类型,然后执行运算。例如:
运算 | 结果 |
---|---|
数值与字符串相加 | 将数值强制转换为字符串。 |
布尔值与字符串相加 | 将布尔值强制转换为字符串。 |
数值与布尔值相加 | 将布尔值强制转换为数值。 |
要想显式地将字符串转换为整数,使用 parseInt 方法。要想显式地将字符串转换为数字,使用 parseFloat 方法。请注意,比较大小时字符串自动转换为相等的数字,但加法(连接)运算时保留为字符串。
JScript 中没有表示单个字符的类型(如 C++ 的 char)。要表示 Jscript 中的单个字符,应创建一个只包含一个字符的字符串。包含零个字符("")的字符串是空(零长度)字符串。
- NaN (不是数)。当对不适当的数据进行数学运算时使用,例如字符串或未定义值。
- 正0和负0。Jscript区分正0和负0。
可以使用任意表达式作比较表达式。任何值为0、null、未定义或空字符串的表达式被解释为 false。其他任意值的表达式解释为 true。
可以通过给一个变量赋 null 值来清除变量的内容。
在 Jscript 中,null 与 0 不相等(与在 C 和 C++ 中不同)。同时应该指出的是,Jscript中 typeof 运算符将报告 null 值为Object 类型,而非类型 null。这点潜在的混淆是为了向下兼容。
如下情况使返回 undefined 值:
- 对象属性不存在,
- 声明了变量但从未赋值。
注意不能通过与 undefined 做比较来测试一个变量是否存在,虽然可以检查它的类型是否为“undefined”。在以下的代码范例中,假设程序员想测试是否已经声明变量 x :
// 这种方法不起作用 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) //执行某些命令(将要运行的)。
JScript 提供了一种特别的循环方式来遍历一个对象的所有用户定义的属性或者一个数组的所有元素。
// 创建具有某些属性的对象 var myObject = new Object(); myObject.name = "James"; myObject.age = "22"; myObject.phone = "555 1234"; // 枚举(循环)对象的所有属性 for (prop in myObject) { // 显示 "The property 'name' is James",等等。 window.alert("The property '" + prop + "' is " + myObject[prop]); }
// 测试全部的 3 个值,看其是否为整数? if (((a % 1) == 0) && ((b % 1) == 0) && ((c % 1) == 0))
Jscript 支持四种类型的对象:内部对象、生成的对象、宿主给出的对象(如 Internet 浏览器中的window 和document)以及 ActiveX 对象(外部组件)。
// 将属性‘foodgroup’加到 pasta 原型对象 // 中,这样 pasta 对象的所有实例都可以有该属性, // 包括那些已经生成的实例。 pasta.prototype.foodgroup = "carbohydrates"
可以在对象的定义中包含方法(函数)。一种方法是在引用别处定义的函数的构造函数中添加一个属性。例如,下面的示例扩充上面定义的 pasta 构造函数以包含 toString 方法,该方法将在显示对象的值时被调用。
// pasta 是有四个参数的构造器。 // 第一部分与上面相同。 function pasta(grain, width, shape, hasEgg) { // 用什么粮食做的? this.grain = grain; // 多宽?(数值) this.width = width; // 横截面形状?(字符串) this.shape = shape; // 是否加蛋黄?(boolean) this.hasEgg = hasEgg; // 这里添加 toString 方法(如下定义)。 // 注意在函数的名称后没有加圆括号; // 这不是一个函数调用,而是 // 对函数自身的引用。 this.toString = pastaToString; } // 实际的用来显示 past 对象内容的函数。 function pastaToString() { // 返回对象的属性。 return "Grain: " + this.grain + "\n" + "Width: " + this.width + "\n" + "Shape: " + this.shape + "\n" + "Egg?: " + Boolean(this.hasEgg); } var spaghetti = new pasta("wheat", 0.2, "circle", true); // 将调用 toString() 并显示 spaghetti 对象 // 的属性(需要Internet 浏览器)。 window.alert(spaghetti);
Microsoft Jscript 提供了 11 个内部(或“内置”)对象。它们是Array、Boolean、Date、Function、Global、Math、Number、Object、RegExp、Error 以及 String 对象。
Number.NaN 是一个特殊的属性,被定义为“不是数值”。例如被 0 除返回 NaN。试图解析一个无法被解析为数字的字符串同样返回Number.NaN。把NaN 与任何数值或本身作比较的结果都是不相等。不能通过与 Number.NaN 比较来测试 NaN 结果,而应该使用 isNaN() 函数。