黄子涵

第3章 类型、值和变量

计算机程序的运行需要对值(value)(比如数字3.14或文本“hello world”)进行操作。

在编程语言中,能够表示并操作的值的类型称做数据类型(type),编程语言最基本的特性就是能够支持多种数据类型。当程序需要将值保存起来以备将来使用时,便将其赋值给(将值“保存”到)一个变量(variable)。

变量是一个值的符号名称,可以通过名称来获得对值的引用。变量的工作机制是编程语言的另一个基本特性。

JavaScript 的数据类型分为两类:原始类型(primitive type)和对象类型(object type)。JavaScript 中的原始类型包括数字、字符串和布尔值。

JavaScript 中有两个特殊的原始值:null(空)和 undefined(未定义),它们不是数字、字符串和布尔值。它们通常分别代表了各自特殊类型的唯一的成员。

JavaScript 中除了数字、字符串、布尔值、null 和 undefined 之外的就是对象了。对象(object)是属性(property)的集合,每个属性都由“名/值对”(值可以是原始值,比如数字、字符串,也可以是对象)构成。其中有一个比较特殊的对象——全局对象(global object)。

普通的 JavaScript 对象是“命名值”的无序集合。JavaScript 同样定义了一种特殊对象——数组(array),表示带编号的值的有序集合。JavaScript 为数组定义了专用的语法,使数组拥有一些和普通对象不同的特有行为特性。

JavaScript 定义了另一种特殊对象——函数。函数是具有与它相关联的可执行代码的对象,通过调用函数来运行可执行代码,并返回运算结果。和数组一样,函数的行为特征和其他对象都不一样。JavaScript 为使用函数定义了专用语法。对于 JavaScript 函数来讲,最重要的是,它们都是真值,并且 JavaScript 可以将它们当做普通对象来对待。

如果函数用来初始化(使用new运算符)一个新建的对象,我们称之为构造函数(constructor)。每个构造函数定义了——类(class)对象一一由构造函数初始化的对象组成的集合。类可以看做是对象类型的子类型。除了数组(Array)类和函数(Function)类之外,JavaScript语言核心定义了其他三种有用的类。日期(Date)类定义了代表日期的对象。正则(RegExp)类定义了表示正则表达式(一种强大的模式匹配工具)的对象。错误(Error)类定义了那些表示 JavaScript 程序中运行时错误和语法错误的对象。可以通过定义自己的构造函数来定义需要的类。

JavaScript 解释器有自己的内存管理机制,可以自动对内存进行垃圾回收(garbage collection)。这意味着程序可以按需创建对象,程序员则不必担心这些对象的销毁和内存回收。当不再有任何引用指向一个对象,解释器就会知道这个对象没用了,然后自动回收它所占用的内存资源。

JavaScript 是一种面向对象的语言。不严格地讲,这意味着我们不用全局的定义函数去操作不同类型的值,数据类型本身可以定义方法(method)来使用值。例如,要对数组 a 中的元素进行排序,不必要将 a 传入 sort() 函数,而是调用 a 的一个方法 sort():

a.sort(); // sort(a)的面向对象的版本
var a = [1, 9, 1, 2, 4, 8, 9, 6, 0, 1, 7];
console.log(a.sort());
[Running] node "e:\HMV\JavaScript\JavaScript.js"
[
  0, 1, 1, 1, 2,
  4, 6, 7, 8, 9,
  9
]

[Done] exited with code=0 in 0.737 seconds

从技术上讲,只有 JavaScript 对象才能拥有方法。然而,数字、字符串和布尔值也可以拥有自己的方法。在 JavaScript 中,只有 null 和 undefined 是无法拥有方法的值。

JavaScript 的类型可以分为原始类型和对象类型,也可分为可以拥有方法的类型和不能拥有方法的类型,同样可分为可变(mutable)类型和不可变(immutable)类型。可变类型的值是可修改的。对象和数组属于可变类型:JavaScript 程序可以更改对象属性值和数组元素的值。数字、布尔值、null 和 undefined 属于不可变类型——比如,修改一个数值的内容本身就说不通。字符串可以看成由字符组成的数组,你可能会认为它是可变的。然而在 JavaScript 中,字符串是不可变的:可以访问字符串任意位置的文本,但 JavaScript 并未提供修改已知字符串的文本内容的方法。

JavaScript 可以自由地进行数据类型转换。比如,如果在程序期望使用字符串的地方使用了数字,JavaScript 会自动将数字转换为字符串。如果在期望使用布尔值的地方使用了非布尔值,JavaScript 也会进行相应的转换。JavaScript 中灵活的类型转换规则对“判断相等” (equality)的定义亦有影响。

JavaScript变量是无类型的(untyped),变量可以被赋予任何类型的值,同样一个变量也可以重新赋予不同类型的值。使用 var 关键字来声明(declare)变量。JavaScript 采用词法作用域(lexical scoping)。不在任何函数内声明的变量称做全局变量(global variable),它在 JavaScript 程序中的任何地方都是可见的。在函数内声明的变量具有函数作用域(function scope),并且只在函数内可见。

3.1 数字

3.2 文本

3.3 布尔值

3.4 null和undefined

3.5 全局对象

3.6 包装对象

3.7 不可变的原始值和可变的对象引用

3.8 类型转换

3.9 变量声明

3.10 变量作用域

posted @ 2022-05-25 10:45  黄子涵  阅读(36)  评论(0编辑  收藏  举报