字面量
字面量,就是按字面意思给出的具体的、固定的值。
在 JS 中可以表示出字面量的数据至少包括,原始类型数据(7种)和部分引用类型数据(数组、正则、自定义对象等)。
原始类型数据的字面量
数、大整数
- JS 中的常规数字以 64 位的
IEEE-754
格式进行存储,称为“双精度浮点数”; BigInt
用于表示任意长度的整数,常规整数取值范围在 -(253-1) 到 (253-1)。
整数、浮点数
- 关于数的字面量,整数的字面量可以用十进制、二进制、八进制以及十六进制表示:
- 十进制整数字面量由一串数字序列组成,不以 0 开头(没有前缀 0);
- 二进制整数以
0b/0B
开头,只能包含数字 0 和 1; - 八进制的整数以
0/0o/0O
开头,只能包括数字 0-7; - 十六进制整数以
0x/0X
开头,可以包含数字(0-9)和字母 a~f / A~F。
11 // 11 - 10进制
011 // 9 - 8进制
0o11 // 9 - 8进制
0b11 // 3 - 2进制
0x11 // 17 - 16进制
0X1e // 30 - 16进制
- 一般的,浮点数的字面量的语法是 [ ( + ∣ − ) ] [ d i g i t s 1 ] [ . d i g i t s 2 ] [ ( E ∣ e ) [ ( + ∣ − ) ] d i g i t s 3 ] [(+|-)][digits1][.digits2][(E|e)[(+|-)]digits3] [(+∣−)][digits1][.digits2][(E∣e)[(+∣−)]digits3],也就是四部分:
- 符号部分
[
(
+
∣
−
)
]
[(+|-)]
[(+∣−)]:正负号(
+/-
),当作一元运算符; - 整数部分 [ d i g i t s 1 ] [digits1] [digits1]:一个常规十进制数;
- 小数部分
[
.
d
i
g
i
t
s
2
]
[.digits2]
[.digits2]:使用小数点
.
衔接一个十进制数; - 指数部分
[
(
E
∣
e
)
[
(
+
∣
−
)
]
d
i
g
i
t
s
3
]
]
[(E|e)[(+|-)]digits3]]
[(E∣e)[(+∣−)]digits3]]:使用
E/e
衔接一个正 / 负十进制数,表示10的正/负次幂
。
小数部分可以单独成立,也可以只和符号部分或指数部分整合。
.12 // 0.12
-.12 // -0.12
.12e-2 // 0.0012
.12e1 // 1.2
大整数
大整数(BigInt
)是特殊的数字类型,允许表达任意长度整数。创建方式有两种:
- 在一个整数字面量后面加
n
; - 调用
BigInt()
函数,传入字符串、数字等中生成大整数 。
123456789012345678901234567890n
10n // 10n
BigInt(10) // 10n
使用下划线 _
连接的数
现在的 JS 中,允许使用下划线对数的字面量进行分段书写,使得更加直观地看出数的结构。
100_0000 // 1百万
1_000_000 // 1百万
1_000e-3 // 1
字符串
字符串字面量是由双引号对(""
)、单引号对(''
)或者反引号对(``
)包围起来的零个或多个字符。由反引号对(``
)表示的字符串字面量也就是模板字面量。
转义字符
- 转义字符的意义是表示一些特殊字符,如换行、制表符、16进制数等等;
- 反斜线
\
的在这里含义是转义,需要转义才能表示反斜线本身; - 在字符串字面量中,引号也需要通过转义表示本身。
字符 | 意思 |
---|---|
\0 | Null 字节 |
\b | 退格符 |
\f | 换页符 |
\n | 换行符 |
\r | 回车符 |
\t | Tab (制表符) |
\v | 垂直制表符 |
\' | 单引号 |
\" | 双引号 |
\\ | 反斜杠字符(\) |
\X 、\XX 、\XXX | (\0 ~ \377 )一到三位八进制数表示的 Latin-1 字符。十进制范围 0 ~ 255 ,例如,\251 是版权符号©。 |
\xXX | (\x00 ~ \xFF )两位十六进制数字表示的 Latin-1 字符。十进制范围 0 ~ 255 ,例如,\xA9 是版权符号©。 |
\uXXXX | (\u0000 ~ \uFFFF )四位十六进制数字表示的 Unicode 字符。例如,\ u00A9 是版权符号© 。 |
\u{XXXXX } | Unicode 代码点 (code point) 转义字符。例如,\u{2F804} 相当于 Unicode 转义字符 \uD87E\uDC04 的简写。 |
使用转义,可以使得长句子进行多行书写,在行末加上 \
表示书写换行了。
let str = '\
\
在行末加上反斜线,然后换行,\
一行中没有内容,也要加上反斜线,\
这是一个长句子。\
\
'
str // 在行末加上反斜线,然后换行,一行中没有内容,也要加上反斜线,这是一个长句子。
模板字符串字面量
模板字面量是用反引号对(``
)包围起来的字面量。
- 允许字符串多行内容一起书写(以往需要使用
\n\
转义);
let sentence = `山上有座庙,
庙里有个老和尚,
。。。
`
/* \n 代表内容换行了,再加上 \ 表示书写换行了 */
let sentence2 = '山上有座庙,\n\
庙里有个老和尚,\n\
。。。\n\
'
- 嵌入表达式:模板字符串则可以通过占位符
${表达式}
嵌入表达式的值(以往可以使用+
拼接完成字符串插值);
let name = '旺财'
let str = `我的狗名字叫做${name},我上个月刚领养的。`
let str2 = '我的狗名字叫做' + name + ',我上个月刚领养的。'
- 一种叫带标签的模板的特殊结构。
注意:
- 使用反引号对
``
的字符串,反引号以及占位符需要转义才能表示本身; - 有占位时,必须要传入表达式。
布尔值
布尔类型有两种字面量:true
和 false
。
null、undefined
- null 的字面量就是
null
,大小写敏感; - undefined 的字面量就是
undefined
,大小写敏感。
symbol
symbol 值用来表示唯一标识符,通过调用 Symbol
函数进行创建(不是构造器,所以归纳为字面量)。Symbol()
可以传入任意参数,不同的参数有意外的结果,例子如下:
Symbol(11) // Symbol(11)
Symbol(1.1) // Symbol(1.1)
Symbol('ID') // Symbol(ID)
Symbol(false) // Symbol(false)
Symbol(null) // Symbol(null)
Symbol(undefined) // Symbol() 相当于没有传参
Symbol([]) // Symbol() 相当于 Symbol([].join())
Symbol([1, 2, 3]) // Symbol(1,2,3) 相当于 Symbol([1, 2, 3].join())
let o = {}
Symbol(o) // Symbol([object Object]) 相当于 Symbol(o.toString())
Symbol({a:1}) // Symbol([object Object])
function f() {}
Symbol(f) // Symbol(function f() {}) 相当于 Symbol(f.toString())
Symbol(()=>{}) // Symbol(()=>{})
引用类型数据的字面量
也就是对象的字面量,特殊的对象包括数组、正则表达式等以及自定义对象都有字面量。
数组
数组是一个索引为数字、包含 length
属性、原型为 Array(0)
的对象:
- 数组字面量:使用方括号对(
[]
)包围、逗号(,
)连接的、包含有零个或多个表达式的数据列表,每个表达式是数组的一个元素; - 使用数组字面量创建一个数组时,将包括空位(undefined)在内的元素进行初始化,而其长度被设定为元素的个数。
let arr1 = [1, , 3] // length=3, arr[1]=undefined
let arr2 = [, 1, , 3] // length=4, arr[0]=arr[2]=undefined
let arr3 = [1, 2, 3, ] // length=3, 末尾的逗号不会占位
let arr = { 0: 1, 1: 2, length: 2 }
arr.__proto__ = Array(0).__proto__
arr
正则表达式
- 一个最基本的正则表达式,是字符被正斜线对(
//
)围成的表达式,是一个对象; - 在正则表达式中,有形式变体,也有包含许多特殊含义的字符;
- 正则的相关语法不能说复杂,但用法灵活。下面只做一个简单例子:
let re = /[0-9]*[.]\d*w/
re.exec('编号:189a\n岗位:教师\n薪资:1.2w') // 匹配到 1.2w
自定义对象
自定义对象字面值,使用花括号对({}
)包围、零个或多个“键值对”的(元素 )列表。
- 属性名可以是任意字符串或者Symbol标识符:
- 合法的字符串标识符可以不用引号包围,
- 计算属性名需要被
[]
包围;
- 属性值可以是任何值。
let o = {
'': '',
'': '!',
name: 'jack',
age: 18,
show: function () { console.log(this.name); },
birthday() { this.age++; },
[Symbol('ID')]: 1,
[1+11]: 12
}