JavaScript变量、常量、数据类型和注释

代码中,数据处理是非常重要的一环,如数值的计算、日期和时间的获取和推算、字符串的处理、逻辑关系的处理等;本文介绍JavaScript数据处理的基础知识,包括变量、常量、各种数据类型的字面量和类型判断,以及如何在代码中添加注释等内容。

整数

数值在计算机中处理时又分为整数(integer)和浮点数(float)。JavaScript中的整数,除了使用十进制数据,还可以使用0b为前缀的二进制数据,使用数字0为前缀的八进制数据,使用0x为前缀的十六进制数据。如下面的数值都表示十进制数11:

  • 11
  • 0b1011
  • 013
  • 0x0B

可以使用alert()函数显示它们,结果都会显示11。

浮点数

浮点数可以处理包含小数部分的的数据,但需要注意,在计算机中处理浮点数时都会有精度限制,JavaScript中使用64位浮点数标准,数值的处理范围在Number.MIN_VALUE和Number.MAX_VALUE值之间,一般处理精度在15到17位,建议在实际应用中使用小于15位的数据;对于浮点数,可以截取固定的小数位进行处理。

字符串

字符串用于处理文本内容,在JavaScript代码中,字符串字面量可以使用一对单引号(')、一对双引号(")或者一对反单引号(`)定义。

单引号和双引号定义的字符串并没有本质区别,如果文本内容包含单引号,可以使用双引号定义,如"I'm a worker.";相对的,如果文本内容中包含双引号,则可以使用单引号定义,如'字符串可以使用双引号(")定义'。

在字符串中还可以使用\符号定义转义字符,如下表所示。

转义字符表示字符
\0NUL
\b退格符
\t水平制表符
\n换行符
\v垂直制表符
\f进纸符
\r回车符
\"双引号(")
\'单引号(')
\`反单引号(`)
\$美圆符号($)
\\反斜线(\)
\xNNNN为两位十六进制数据,表示Unicode字符编码。
\uNNNNNNNN为四位十六进制数据,表示Unicode字符编码。
\u{N}N为一到六位十六进制数据,表示Unicode字符编码。

使用单引号或双引号定义的字符串中,如果内容过长,可以使用\符号说明下一行代码是本行代码的继续,如下面的代码。

JavaScript
<script>
    let s = "文本一 \
文本二";
    alert(s);
</script>

本例,虽然文本一和文本二写在两行,但其中并不包含换行符(\n),执行代码显示效果如下图所示。

使用\符号连接文本

在单引号和双引号中如果需要换行,则必须使用\n转义字符。

反单引号定义的字符串称为“模板字符串”,其中的换行符可以保留,不必使用\n转义字符定义;同时可以使用“${<变量名>}”格式将变量的值合并到字符串中,简化了字符串的组合操作。

布尔类型

布尔类型(boolean),也称为逻辑类型,只处理true和false两个值,其运算包括:

  • 逻辑与运算,使用&&运算符。两个运算数都是true时,运算结果为true,只要有一个运算数为false则运算结果为false。
  • 逻辑或运算,使用||运算符。两个运算数中有一个为true时,运算结果为true,两个运算数都是false时,运算结果为false。
  • 逻辑非运算,使用!运算符。只需要一个运算数,true值取反为false,false值取反为true。

变量

变量(variant)是在代码中处理数据和对象的标识符,其要素包括变量名称和数据,如果没有赋予数据或对象实例,则为空值(null)。在早期的JavaScript中,使用var关键字声明变量,这种变量会自动提升作用域,先来看下面的代码。

JavaScript
<script>
    function fn() {
        for (var i = 0; i < 10; i++) {
        }
        alert(i);
    }
    //
    fn();
</script>

代码中使用function关键字定义了函数fn(),然后调用它。fn()函数的for语句结构中使用var关键字定义了循环控制变量i,此时,变量i的作用域会提升到fn()函数,而不只是在for语句结构中;for语句结构结束后,使用alert(i)语句显示i的值,此时会显示循环结束后的值10。

在ES6标准中增加了let关键字定义变量,此关键字定义的变量作用域只限于定义它的结构中,如下面的代码。

JavaScript
<script>
    function fn() {
        for (let i = 0; i < 10; i++) {
        }
        alert(i);
    }
    //
    fn();
</script>

执行此代码并不会显示信息,因为在for语句结构外并没有定义变量i,所以,由于变量i不存在而出错,在Chrome浏览器中,可以使用Ctrl+Shift+I组合键查看错误信息,如下图所示。

未定义变量错误

传统的JavaScript中,变量名可以使用字母、美圆符号($)或下画线(_)开始,然后由字母、下画线和数字组成。实际上,JavaScript已全面支持Unicode字符,在代码中可以使用有效的Unicode字符作为变量名,如中文,下面的代码演示了相关应用。

JavaScript
<script>
    let 拾 = 10;
    alert(拾);
</script>

打开页面会通过消息对话框显示变量“拾”的值10,如下面所示。

使用中语言变量名

常量

在ES6标准中,新增了const关键字来定义常量。常量是在代码执行过程中,数据不会改变的标识符,如下面的代码。

JavaScript
<script>
    const BUFFER_SIZE = 255;
    alert(BUFFER_SIZE);
</script>

常量名习惯上由大写字母、下画线(_)和数字组成,执行本例代码会显示BUFFER_SIZE常量的值255。

请注意,如果常量指定的是一个对象的实例,虽然不能修改常量指向的对象,但可以修改对象中的数据,在面向对象编程中会有详细讨论。

特殊的值

JavaScript代码中有几个特殊的值需要注意,包括:

  • NaN,表示不是一个数值(Not a Number)。判断一个数据是否为数值时可以使用isNaN()函数,当参数为数值时返回false,不是数值时返回true。
  • Infinity,表示正无穷,也可以使用-Infinity表示负无穷。判断数据是否为无穷时可以使用isFinite()函数。
  • null,空值,表示变量没有初始化,即没有可用的数据。
  • undefined,表示变量没有定义。

数据类型的判断

前面的示例中,并没有出现数据类型的关键字;JavaScript代码中,变量和常量的数据类型由其值的类型来确定。判断数据字面量、变量或常量数据的类型,可以使用typeof运算符,此运算符会返回一个表示数据类型名称的字符串,如:

  • number,表示数值类型。整数、浮点数、NaN值、Infinity值的类型都会返回number。
  • string,字符号类型。
  • boolean,布尔类型。
  • object,对象类型,在面向对象编程(OOP)概念中也就是类(class)类型。请注意,null值的类型会返回object。
  • undefined,没有定义的对象。使用 typeof运算符判断没有定义的标识符时会返回undefined。

下面的代码演示了typeof运算符的应用。

JavaScript
<script>
    let x = "abc";
    alert(typeof x);
</script>

本例会显示string,可以修改变量x的值来观察运行结果。

都是对象

实际上,JavaScript中的字面量、变量、常量都可以作为对象来操作,不同类型的对象会有不同的操作方法,如数值可以使用toFixed()方法确定保留的小数位数,下面的代码演示了相关应用。

JavaScript
<script>
    alert(12.34567.toFixed(2));
</script>

执行代码会显示浮点数12.34567保留两位小数的形式,即12.35;这里,多余的数据位会四舍五入。

通过变量名和常量名也可以调用相应的方法,如下面的代码。

JavaScript
<script>
    let x = 12.345;
    const PI = 3.1415926;
    alert(x.toFixed(2)); // 12.35
    alert(PI.toFixed(4)); // 3.1416
</script>

执行代码会显示12.35和3.1416。

注释

注释是代码中的说明内容,并不是真正的执行代码,可以用于添加开发者、版本、代码的功能等信息。JavaScript中可以使用行注释和块注释。

行注释使用//定义,从//到本行结束的内容都作为注释处理。请注意,包含在字符串中的//并不是行注释的标识,如下面代码中变量s的内容就不是行注释。

JavaScript
<script>
    let s = "//不是行注释";
    alert(s);  // 行注释,显示变量s的内容
    // 这也是行注释
</script>

块注释使用/*开始,使用*/结束,在此之间的内容都作为注释,无论这些内容是在一行还是在多行。同样的,块注释的开始和结束标识不应在字符串中。如下面的代码。

JavaScript
<script>
    let s = `/*不是块注释
            */`;
    alert(s);
    /* 块注释
       显示变量s的内容
    */
</script>

代码执行结果如下图所示。

块注释与模板字符串