字面量
字面量(英文:literal),是源代码中直接表示值的一种记法。
JavaScript中的字面量有以下几种类型:
- 整数字面量
- 浮点数字面量
- 字符串字面量
- 布尔值字面量
- 正規表現字面量
- 数组字面量
- 对象字面量
其中,对数组字面量,对象字面量的属性仍可进行更新,因此字面量并不完全等价于常数,取名为字面量的原因应该也就在此。
布尔字面量
(译注:即逻辑字面量) (Boolean literals)
布尔类型有两种字面量:true和false。
不要混淆作为布尔对象的真和假与布尔类型的原始值true和false。布尔对象是原始布尔数据类型的一个包装器。
布尔对象
布尔对象是原始布尔数据类型的包装对象,使用一下语法创建布尔对象。
var booleanObjectName = new Boolean(value);
不要把原始数据类型的true和false与布尔对象的true和false混淆在一起。任何对象的值都不是 undefined , null, 0, NaN 或者是空字符串,即使布尔对象的值是假,当执行条件语句是,也会被评定为真。
整数字面量
整数可以用十进制(基数为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 and -345 (十进制, 基数为10) 015, 0001 and -0o77 (八进制, 基数为8) 0x1123, 0x00111 and -0xF1A7 (十六进制, 基数为16或"hex") 0b11, 0b0011 and -0b11 (二进制, 基数为2)
浮点数字面量
浮点数字面值可以有以下的组成部分:
- 一个十进制整数,可以带正负号(即前缀“+”或“ - ”),
- 小数点(“.”),
- 小数部分(由一串十进制数表示),
- 指数部分。
指数部分以“e”或“E”开头,后面跟着一个整数,可以有正负号(即前缀“+”或“-”)。浮点数字面量至少有一位数字,而且必须带小数点或者“e”(大写“E”也可)。
简言之,其语法是:
[(+|-)][digits][.digits][(E|e)[(+|-)]digits]
例如:
3.14 -.2345789 // -0.23456789 -3.12e+12 // -3.12*1012 .1e-23 // 0.1*10-23=10-24=1e-24
字符串字面量
字符串字面量是由双引号(“)对或单引号(‘)括起来的零个或多个字符。字符串被限定在同种引号之间;也即,必须是成对单引号或成对双引号。下面的例子都是字符串字面值:
"foo" 'bar' "1234" "one line \n another line" "John's cat"
你可以在字符串字面值上使用字符串对象的所有方法——JavaScript会自动将字符串字面值转换为一个临时字符串对象,调用该方法,然后废弃掉那个临时的字符串对象。你也能用对字符串字面值使用类似String.length的属性:
console.log("John's cat".length) // 将打印字符串中的字符个数(包括空格) // 结果为:10
除非有特别需要使用字符串对象,否则,你应当始终使用字符串字面值。要查看字符串对象的有关细节,请参见字符串对象。
在字符串中使用的特殊字符
作为一般字符的扩展,你可以在字符串中使用特殊字符,如下例所示。
"one line \n another line"
以下表格列举了你能在JavaScript的字符串中使用的特殊字符。 译注:严格模式下,不能使用八进制转义字符。
转义字符
对于那些未出现在表2.1中的字符,其所带的前导反斜线'\'将被忽略。但是,这一用法已被废弃,应当避免使用。
通过在引号前加上反斜线'\',可以在字符串中插入引号,这就是引号转义。例如:
var quote = "He read \"The Cremation of Sam McGee\" by R.W. Service."; console.log(quote);
代码运行结果
He read "The Cremation of Sam McGee" by R.W. Service.
要在字符串中插入'\'字面值,必须转义反斜线。例如,要把文件路径 c:\temp 赋值给一个字符串,可以采用如下方式:
var home = "c:\\temp";
也可以在换行之前加上反斜线以转义换行(译注:实际上就是一条语句拆成多行书写),这样反斜线和换行都不会出现在字符串的值中。
var str = "this string \ is broken \ across multiple\ lines." console.log(str); // this string is broken across multiplelines.
文字 | 意思 |
---|---|
\b | Backspace |
\f | Form feed |
\n | 换行 |
\r | Carriage return |
\t | Tab |
\v | Vertical tab |
\' | Apostrophe or single quote |
\” | Double quote |
Backslash character | |
\XXX | - |
\xXX | - |
\uXXXX | - |
数组字面量
数组字面值是一个封闭在方括号对([])中的包含有零个或多个表达式的列表,其中每个表达式代表数组的一个元素。当你使用数组字面值创建一个数组时,该数组将会以指定的值作为其元素进行初始化,而其长度被设定为元素的个数。
下面的示例用3个元素生成数组coffees,它的长度是3。
var coffees = ["French Roast", "Colombian", "Kona"]; var a=[3]; console.log(a.length); // 1 console.log(a[0]); // 3
注意: 这里的数组字面值也是一种对象初始化器。
数组字面值中的多余逗号
(译注:声明时)你不必列举数组字面值中的所有元素。若你在同一行中连写两个逗号(,),数组中就会产生一个没有被指定的元素,其初始值是undefined。以下示例创建了一个名为fish的数组:
var fish = ["Lion", , "Angel"];
在这个数组中,有两个已被赋值的元素,和一个空元素(fish[0]是“Lion”,fish[1]是undefined,而fish[2]是“Angel”;译注:此时数组的长度属性fish.length是3)。
如果你在元素列表的尾部添加了一个逗号,它将会被忽略。在下面的例子中,数组的长度是3,并不存在myList[3]这个元素(译注:这是指数组的第4个元素噢,作者是在帮大家复习数组元素的排序命名方法)。元素列表中其它所有的逗号都表示一个新元素(的开始)
注意:尾部的逗号在早期版本的浏览器中会产生错误,因而编程时的最佳实践方式就是移除它们。
(译注:而“现代”的浏览器似乎鼓励这种方式,因为好多网页中都这么写?)
var myList = ['home', , 'school', ];
在下面的例子中,数组的长度是4,元素myList[0]和myList[2]缺失(译注:没被赋值,因而是undefined)。
var myList = [ , 'home', , 'school'];
再看一个例子。在这里,该数组的长度是4,元素myList[1]和myList[3]被漏掉了。(但是)只有最后的那个逗号被忽略。
var myList = ['home', , 'school', , ];
理解多余的逗号(在脚本运行时会被如何处理)的含义,对于从语言层面理解JavaScript是十分重要的。但是,在你自己写代码时:显式地将缺失的元素声明为undefined,将大大提高你的代码的清晰度和可维护性。
对象字面量
对象字面值是封闭在花括号对({})中的一个对象的零个或多个“属性名-值”对的(元素)列表。你不能在一条语句的开头就使用对象字面值,这将导致错误或产生超出预料的行为, 因为此时左花括号({)会被认为是一个语句块的起始符号。(译者:这 里需要对语句statement、块block等基本名词的解释)
以下是一个对象字面值的例子。对象car的第一个元素(译注:即一个属性/值对)定义了属性myCar;第二个元素,属性getCar,引用了一个函数(即CarTypes(“Honda”));第三个元素,属性special,使用了一个已有的变量(即Sales)。
var Sales = "Toyota"; function CarTypes(name) { return (name === "Honda") ? name : "Sorry, we don't sell " + name + "." ; } var car = { myCar: "Saturn", getCar: CarTypes("Honda"), special: Sales }; console.log(car.myCar); // Saturn console.log(car.getCar); // Honda console.log(car.special); // Toyota
更进一步的,你可以使用数字或字符串字面值作为属性的名字,或者在另一个字面值内嵌套上一个字面值。如下的示例中使用了这些可选项。
var car = { manyCars: {a: "Saab", "b": "Jeep"}, 7: "Mazda" }; console.log(car.manyCars.b); // Jeep console.log(car[7]); // Mazda
对象属性名字可以是任意字符串,包括空串。如果对象属性名字不是合法的javascript标识符,它必须用““包裹。属性的名字不合法,那么便不能用.访问属性值,而是通过类数组标记(”[]”)访问和赋值。
var unusualPropertyNames = { "": "An empty string", "!": "Bang!" } console.log(unusualPropertyNames.""); // 语法错误: Unexpected string console.log(unusualPropertyNames[""]); // An empty string console.log(unusualPropertyNames.!); // 语法错误: Unexpected token ! console.log(unusualPropertyNames["!"]); // Bang!
请注意:
var foo = {a: "alpha", 2: "two"}; console.log(foo.a); // alpha console.log(foo[2]); // two //console.log(foo.2); // Error: missing ) after argument list //console.log(foo[a]); // Error: a is not defined console.log(foo["a"]); // alpha console.log(foo["2"]); // two
参考
外部链接