字面量

js/literals2026-08-24 19:46:25

在 JavaScript 中,你可以使用各种 字面量。这些字面量是脚本中按字面意思给出的固定的值,而不是变量。

null 字面量

Null 类型有一种字面量 null。

此外,undefined 不是字面量。

布尔字面量

布尔类型有两种字面量:true 和 false。

数字字面量

JavaScript 数字字面量包括多种基数的整数字面量和以 10 为基数的浮点数字面量。

值得一提的是,语言标准要求数字字面量必须是无符号的。但是像 -123.4 这样的代码片段还是没有问题的,会被解释为一元操作符 - 应用于数字字面量 123.4。

整数字面量

整数可以用十进制(基数为 10)、十六进制(基数为 16)、八进制(基数为 8)以及二进制(基数为 2)表示。

  • 十进制整数字面量由一串数字序列组成,且没有前缀 0。
  • 八进制的整数以 0(或 0O、0o)开头,只能包括数字 0-7。
  • 十六进制整数以 0x(或 0X)开头,可以包含数字(0-9)和字母 a~f 或 A~F。
  • 二进制整数以 0b(或 0B)开头,只能包含数字 0 和 1。

严格模式下,八进制整数字面量必须以 0o 或 0O 开头,而不能以 0 开头。

例如:

0, 117, -345 // (十进制,基数为 10)
015, 0001, -0o77 // (八进制,基数为 8)
0x1123, 0x00111, -0xF1A7 // (十六进制,基数为 16 或"hex")
0b11, 0b0011, -0b11 // (二进制,基数为 2)

浮点数字面量

浮点数字面值可以有以下的组成部分:

  • 一个十进制整数,可以带正负号(即前缀“+”或“-”),
  • 小数点(“.”),
  • 小数部分(由一串十进制数表示),
  • 指数部分。

指数部分以“e”或“E”开头,后面跟着一个整数,可以有正负号(即前缀“+”或“-”)。浮点数字面量至少有一位数字,而且必须带小数点或者“e”(大写“E”也可)。

简言之,其语法是:

[(+|-)][digits][.digits][(E|e)[(+|-)]digits]

例如:

3.1415926
.123456789
3.1E+12
.1e-23

BigInt 字面量

BigInt 字面量通过在整数后面加上 n 来表示。

const bigIntLiteral = 1234567890123456789012345678901234567890n;

字符串字面量

普通字符串字面量

字符串字面量是由双引号(")对或单引号(')括起来的零个或多个字符。字符串被限定在同种引号之间;也即,必须是成对单引号或成对双引号。下面的例子都是字符串字面值:

'foo'
"bar"
'1234'
'one line \n another line'
"Joyo's cat"

你可以在字符串字面值上使用字符串对象的所有方法——JavaScript 会自动将字符串字面值转换为一个临时字符串对象,调用该方法,然后废弃掉那个临时的字符串对象。你也能用对字符串字面值使用类似 String.length 的属性:

console.log("John's cat".length);
// 将打印字符串中的字符个数(包括空格)
// 结果为:10

模板字符串字面量

在 ES2015 (ES6) 中,还提供了一种模板字面量,模板字符串提供了一些语法糖来帮你构造字符串。这与 Perl、Python 还有其他语言中的字符串插值的特性非常相似。

除此之外,你可以在通过模板字符串前添加一个 tag 来自定义模板字符串的解析过程,这可以用来防止注入攻击,或者用来建立基于字符串的高级数据抽象。

`In JavaScript this is
 not legal.`;

`Hello ${name}, how are you ${time}?`;

参见模版字符串。

在字符串中使用的特殊字符

作为一般字符的扩展,你可以在字符串中使用特殊字符,如下例所示。

"one line \n another line";

以下表格列举了你能在 JavaScript 的字符串中使用的特殊字符。

字符 意思
\0 Null 字节
\b 退格符
\f 换页符
\n 换行符
\r 回车符
\t Tab (制表符)
\v 垂直制表符
\' 单引号
\" 双引号
\\ 反斜杠字符(\)
\XXX 由从 0 到 377 最多三位八进制数XXX表示的 Latin-1 字符。例如,\251 是版权符号的八进制序列。
\xXX 由从 00 和 FF 的两位十六进制数字 XX 表示的 Latin-1 字符。例如,\ xA9 是版权符号的十六进制序列。
\uXXXX 由四位十六进制数字 XXXX 表示的 Unicode 字符。例如,\ u00A9 是版权符号的 Unicode 序列。见Unicode escape sequences (Unicode 转义字符).
\u*{XXXXX}* Unicode 代码点 (code point) 转义字符。例如,\u{2F804} 相当于 Unicode 转义字符 \uD87E\uDC04 的简写。

转义字符

通过在引号前加上反斜线 \,可以在字符串中插入引号,这就是引号转义。

"He read \"The Cremation of Sam McGee\" by R.W. Service.";

要在字符串中插入 \ 字面值,必须转义反斜线。

var home = "c:\\temp";

也可以在换行之前加上反斜线以转义换行,这样反斜线和换行都不会出现在字符串的值中。

var str =
  "this string \
is broken \
across multiple\
lines.";
console.log(str); // this string is broken across multiplelines.

Javascript 没有 “heredoc” 语法,但可以用行末的换行符转义和转义的换行来近似实现。

var poem =
  "Roses are red,\n\
Violets are blue.\n\
Sugar is sweet,\n\
and so is foo.";

对象字面量

对象字面量是封闭在花括号对({})中的一个对象的零个或多个“属性名—值”对的(元素)列表。

var car = { myCar: "Saturn", getCar: CarTypes("Honda"), special: Sales };

对象字面量返回一个 Object 对象。

你不能在一条语句的开头就使用对象字面值,这将导致错误或产生超出预料的行为,因为此时左花括号({)会被认为是一个语句块的起始符号。

对象属性名

对象属性名字可以是任意字符串,包括空串。如果对象属性名字不是合法的 javascript 标识符,它必须用引号包裹。

属性的名字不合法,那么便不能用点(.)访问属性值,而是通过方括号表示法([])来访问。

const unusualPropertyNames = {
  1: "数字",
  '': '空字符串',
  '!': '砰!'
}
console.log(unusualPropertyNames[1]);
console.log(unusualPropertyNames[""]);
console.log(unusualPropertyNames["!"]);

增强的对象字面量

在 ES2015 (ES6),对象字面值扩展支持在创建时设置原型,简写了 foo: foo 形式的属性赋值,方法定义,支持父方法调用,以及使用表达式动态计算属性名。

var obj = {
  // __proto__
  __proto__: theProtoObj,
  // Shorthand for ‘handler: handler’
  handler,
  // Methods
  toString() {
    // Super calls
    return "d " + super.toString();
  },
  // Computed (dynamic) property names
  ["prop_" + (() => 42)()]: 42,
};

数组字面量

数组字面值是一个封闭在方括号对 ([]) 中的包含有零个或多个表达式的列表,其中每个表达式代表数组的一个元素。当你使用数组字面值创建一个数组时,该数组将会以指定的值作为其元素进行初始化,而其长度被设定为元素的个数。

var coffees = ["French Roast", "Colombian", "Kona"];

数组字面量返回一个 Array 对象。

多余逗号

你不必列举数组字面值中的所有元素。若你在同一行中连写两个逗号(,),数组中就会产生一个没有被指定的元素,其初始值是 undefined。以下示例创建了一个名为 fish 的数组:

var fish = ["Lion", , "Angel"];

在这个数组中,有两个已被赋值的元素,和一个空元素(fish[0] 是 "Lion",fish[1] 是 undefined,而 fish[2] 是 "Angel")。

尾部的多余逗号

如果你在元素列表的尾部添加了一个逗号,它将会被忽略。如果尾部有多个多余逗号,只有最后的多余逗号会被忽略。

var myList = ["home", , "school", ,];
// 该数组的长度是 4, 元素 myList[1] 和 myList[3] 被漏掉了

尾部的逗号在早期版本的浏览器中会产生错误,因而编程时的最佳实践方式就是移除它们。显式地将缺失的元素声明为 undefined,将大大提高你的代码的清晰度和可维护性。

正则表达式字面量

一个正则表达式是字符被正斜杠(/)围成的表达式。下面是一个正则表达式字面量的一个例子:

var re = /ab+c/;

正则表达式字面量返回一个 RegExp 对象。

以下三种表达式都会创建相同的正则表达式:

/ab+c/i; //字面量形式
new RegExp("ab+c", "i"); // 首个参数为字符串模式的构造函数
new RegExp(/ab+c/, "i"); // 首个参数为常规字面量的构造函数

参考

语法和数据类型
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Grammar_and_types#string_literals

字面量
https://developer.mozilla.org/zh-CN/docs/Glossary/Literal

本页目录