二、变量

变量是用于存储数据(如数字或字符串)的容器,因此它们可以在脚本中多次使用。

声明变量

要创建一个变量,可以使用关键字var,后跟一个名称,称为标识符。变量的一个常见命名约定是,除了第一个单词,每个单词最初都要大写。

var myVar;

可以使用等号给变量赋值,这叫做赋值操作符(=)。这被称为分配或初始化变量。

myVar = 10;

声明和赋值可以合并成一条语句。当一个变量被赋值时,它就被定义了。

var myVar = 10;

通过使用逗号操作符(,),有一种在同一个语句中创建多个变量的简便方法。

var myVar = 10, myVar2 = 20, myVar3;

一旦变量被声明,就可以通过引用变量名来使用它。例如,通过将标识符传递给document.write方法,可以将变量的值打印到 web 文档中。

document.write(myVar); // "10"

请记住,变量标识符区分大小写,因此大写和小写字母有不同的含义。JavaScript 中的标识符可以包括字母、美元符号($)、下划线(_)和数字,但不能以数字开头。它们也不能包含空格或特殊字符,并且不能是保留关键字。

var _myVar32; // allowed

var 32Var;    // incorrect (starts with number)

var my Var;   // incorrect (contains space)

var var@32;   // incorrect (contains special character)

var var;      // incorrect (reserved keyword)

动态打字

JavaScript 是一种动态类型语言。因此,不需要指定变量的数据类型,任何变量都可以包含任何数据类型。

var myType = "Hi"; // string type

myType = 1.5;      // number type

此外,变量的值将根据需要自动转换,这取决于使用它的上下文。

// Number type evaluated as string type

console.log(myType); // "1.5"

由于这些隐式类型转换,知道变量的基础类型并不总是必要的。尽管如此,了解 JavaScript 在后台处理的数据类型还是很有用的。这六种类型如下:数字、布尔、字符串、对象、未定义和空。

数字类型

JavaScript 对于整数和浮点数只有一种类型。整数可以用十进制(基数为 10)、八进制(基数为 8)或十六进制(基数为 16)来表示。整数值上的前导零表示它是八进制的,前导 0x(或 0X)表示十六进制的。十六进制整数可以包括数字 0–9 和字母 A–F,而八进制整数只能包括数字 0–7。下面的整数文字都代表同一个数,在十进制记数法中是 10。

var dec = 10;  // decimal notation

var oct = 012; // octal notation

var hex = 0xA; // hexadecimal notation

浮点数可以用十进制或指数(科学)记数法来表示。指数记数法的用法是在十进制指数后加上E(或e)。

var num = 1.23;

var exp = 3e2; // 3*10^2 = 300

请记住,JavaScript 中的所有数字都在后台存储为双精度浮点数。

布尔类型

bool 类型可以存储布尔值,该值只能为 true 或 false。这些值由关键字truefalse指定。

var myBool = true;

布尔值通常与条件语句和循环语句一起使用,这将在后面的章节中讨论。

未定义的类型

JavaScript 有一个名为undefined的值,用来表示没有值。这是声明的变量在没有初始值的情况下得到的值。

var myUndefined;

console.log(myUndefined); // "undefined"

用于存储该值的数据类型也被命名为undefined。这可以通过使用typeof操作符来显示,它检索一个类型的字符串表示。

console.log(typeof myUndefined); // "undefined"

请记住,未定义的变量不同于未声明的变量。任何试图访问未声明变量的行为都将导致抛出ReferenceError异常,从而中止脚本的执行。

console.log(myUndeclared); // throws a ReferenceError

零点类型

类型和值 null 表示没有值的对象。与可能由语言级行为导致的 undefined 相反,null 值总是通过代码设置的。它通常用作指示异常或错误情况的函数返回值。

var myNull = null;

console.log(myNull); // "null"

虽然 null 是一种数据类型,但是typeof操作符会将这种类型作为一个对象来计算。这被认为是语言规范中的一个错误。

console.log(typeof myNull); // "object"

在布尔上下文中,null 和 undefined 都被评估为false。以下示例使用 not 运算符(!)将这些值强制转换为布尔类型。该运算符反转布尔结果,因此被两次用于检索原始值的布尔表示。

console.log(!!null);      // "false"

console.log(!!undefined); // "false"

相反,在数值上下文中,null 表现为 0,而 undefined 导致整个表达式计算为 NaN。

console.log(null * 5);      // "0"

console.log(undefined * 5); // "NaN"

特殊数值

JavaScript 有三个特殊的数值:Infinity、-Infinity 和 NaN。这些值用于表示在计算过程中发生了一些异常。例如,以下计算得出这三个值。

console.log(1 / 0);  // "Infinity"

console.log(-1 / 0); // "-Infinity"

console.log(0 / 0);  // "NaN"

值 NaN 是非数字的缩写,表示不可表示的数值。它是数学运算失败时通常使用的返回值。例如,从-1 中取平方根得到 NaN。这个计算可以使用全局 Math 对象的 sqrt 方法来执行。

var myNaN = Math.sqrt(-1);

console.log(myNaN);        // "NaN"

console.log(typeof myNaN); // "number"

尝试在数值上下文中计算非数值也会导致 NaN。

console.log("Hi" * 3); // "NaN"

NaN 有一个奇怪的特性,它与任何其他值都不相等,包括另一个 NaN 值。要确定一个值是否为 NaN,可以使用全局 is NaN 函数。

console.log(NaN == NaN);   // "false"

console.log(isNaN(myNaN)); // "true"