你不知道的JavaScript(下卷)
上QQ阅读APP看书,第一时间看更新

1.7 变量

大多数的实用程序都需要跟踪值的变化,因为程序在执行任务时会对值进行各种操作,值会不断发生变化。

在程序中实现这一点的最简单方法是将值赋给一个符号容器,这个符号容器称为变量,使用这个名字是因为这个容器中的值是可以变化的。

在某些编程语言中,你需要声明一个变量(容器)用于存放指定类型的值(如数字或字符串)。通过避免不想要的值转换,人们认为这种静态类型(也称为类型强制)提高了程序的正确性。

其他语言强调的是值的类型而不是变量的类型。弱类型(也称为动态类型)允许一个变量在任意时刻存放任意类型的值。这种方式允许一个变量在程序的逻辑流中的任意时刻代表任意类型的值,人们认为这样可以提高程序的灵活性。

JavaScript采用了后一种机制——动态类型,这也就是说,变量可以持有任意类型值而不存在类型强制。

前面提到过,我们使用var语句声明一个变量。注意,声明中没有额外的类型信息。考虑以下这个简单的程序:

        var amount = 99.99;
        amount = amount * 2;




        console.log( amount );      // 199.98


        // 将amount转化为一个字符串,并在开头添加 "$"
        amount = "$" + String( amount );


        console.log( amount );      // "$199.98"

变量amount开始时持有值99.99,然后持有amount * 2的结果值,也就是199.98。

第一个console.log(..)命令需要隐式地转换类型,将数字值转换为字符串用于输出。

然后语句amount = "$" + String(amount)显式地将值199.98转换为字符串,并在开头加上字符"$"。此时,amount持有字符串值"$199.98",所以第二个console.log(..)语句打印输出时就不需要转换类型了。

JavaScript开发者应该注意到变量amount表示值99.99、199.98和"$199.98"的这种灵活性。静态类型的狂热支持者可能会单独使用一个变量,例如,使用amountStr来保存最后的"$199.98",因为这是一个不同的类型。

无论是哪一种方式,你都会注意到amount保存的值会随着程序运行而有所变化,这展示了变量的主要用途:管理程序状态

换句话说,状态跟踪了值随着程序运行的变化。

变量的另一个常见用法是集中设置值。更常见的说法是常量,即声明一个变量,赋予一个特定值,然后这个值在程序执行过程中保持不变。

这些常量的声明通常放在程序的开头,所以如果需要改变这些值的话,那么就会有一个很方便的集中位置。通常来说,在JavaScript中作为常量的变量用大写表示,多个单词之间用下划线分隔。

以下是一个简单的示例:

        var TAX RATE = 0.08; // 8%的营业税


        var amount = 99.99;


        amount = amount * 2;


        amount = amount + (amount * TAX RATE);
        console.log( amount );              // 215.9784
        console.log( amount.toFixed( 2 ) ); // "215.98"

console.log(..)是作为console值的一个对象属性的函数log(..),与此类似,toFixed(..)是一个可以通过数字值访问的函数。JavaScript的数字不会自动格式化为美元表示法,因为引擎无法了解你的意图,也没有适合现金的类型。toFixed(..)可以帮助我们指定保留数字小数点后的几位,并按照期望生成字符串值。

变量TAX RATE是依靠惯例而定的一个常量,程序中没有任何特殊实现可以防止它被修改。而如果这个城市的营业税提高到9%,那么我们可以很容易地修改程序,只需要在唯一一处修改TAX RATE值为0.09,而不是在程序中搜索多个0.08,然后修改所有的值。

在编写本部分时,最新版本的JavaScript(一般被称为“ES6”)提供了一个新的常量声明方法,使用const代替了var:

        // 自ES6起:
        const TAX RATE = 0.08;


        var amount = 99.99;
        // ..


常量和值不变的变量一样有用,而且常量还可以防止值在最初设定后被无意修改。如果想要在初始声明后给TAX RATE赋其他值,那么程序会拒绝这个修改(严格模式下会失败退出,参见2.4节)。

另外,这种防止出错的“保护”措施与静态类型相似,所以你应该可以理解其他语言中的静态类型是多么具有吸引力了!

有关如何在程序中使用变量中的不同值,参见本系列《你不知道的JavaScript(中卷)》第一部分中的前两章。