目录
2.对象和数组初始化器Object and Array Initializers
3.函数定义表达式Function Definition Expressions
4.属性访问表达式Property Access Expressions
条件属性访问Conditional Property Access
6.对象创建表达式Object Creation Expressions
2.操作数和结果类型Operand and Result Type
1.JavaScript 运算符通常会根据需要转换其操作数的类型
5.运算符关联性Operator Associativity
8 相等操作符Equality and Inequality Operators
表达式是 JavaScript 的一个短语phrase,可以通过计算来产生一个值be evaluated to produce a value。
- 嵌入在程序中的常量constant embedded literally in是一种非常简单的表达式。
- 变量名variable name也是一个简单的表达式,它计算为该变量分配的任何值whatever value has been assigned to that variable。
复杂表达式是从更简单的表达式构建的。
- 数组访问表达式array access expression由一个计算结果为数组的表达式后跟一个左方括号、一个计算结果为整数的表达式和一个右方括号组成。这个新的、更复杂的表达式计算出存储在指定数组的指定索引处的值。
- 函数调用表达式function invocation expression由一个计算结果为函数对象function object的表达式和零个或多个用作函数参数的附加表达式组成。
从更简单的表达式构建复杂表达式的最常见方法是使用运算符。
- 运算符以某种方式组合其操作数(通常是其中的两个)的值并计算为新值。
- 乘法运算符 * 是一个简单的例子。表达式 x * y 计算为表达式 x 和 y 的值的乘积。
- 为简单起见,我们有时会说运算符返回一个值,而不是“评估”一个值an operator returns a value rather than “evaluates to” a value
1.基本表达式Primary Expressions
基本表达式:最简单的表达式,不会包含任何更简单的表达式
- 常量constant或字面量值literal values
字面量是直接嵌入到程序中的常量值 Literals are constant values that are embedded directly in your program
1.23 // A number literal
"hello" // A string literal
/pattern/ // A regular expression literal
- 某些语言关键字
JavaScript 的一些保留字reserved words是基本表达式
true // Evalutes to the boolean true value 评估为布尔型真值
false // Evaluates to the boolean false value 估算为布尔假值
null // Evaluates to the null value
this // Evaluates to the "current" object **评估为“当前”对象**
this不是一个常数——它在程序的不同位置计算为不同的值。、
this 关键字用于面向对象的编程中。
在方法的主体中Within the body of a method, this 计算为调用该方法的对象the object on which the method was invoked。
- 变量引用variable references
对全局对象的变量、常量或属性的引用a reference to a variable, constant, or property of the global object
i // Evaluates to the value of the variable i.
sum // Evaluates to the value of the variable sum.
undefined // **The value of the "undefined" property of the global object 全局对象的“未定义”属性的值**
当任何标识符identifier在程序中单独出现时,JavaScript 假定它是全局对象的变量或常量或属性并查找其值。 如果不存在具有该名称的变量,则尝试评估不存在的变量会引发 ReferenceError
2.对象和数组初始化器Object and Array Initializers
对象和数组初始化器Object and array initializers是其值为新创建对象或数组whose value is a newly created object or array的表达式。
这些初始化式表达式有时被称为对象字面量和数组字面量object literals and array literals。然而,与真正的字面量不同,它们不是基本表达式,因为它们包含许多指定属性和元素值的子表达式subexpressions that specify property and element values。
1.数组初始化器
数组初始化式是用方括号括起来的逗号分隔的表达式列表。数组初始化器的值是一个新创建的数组。
[] // An empty array: no expressions inside brackets means no elements 空数组:方括号内没有表达式意味着没有元素
[1+2,3+4] // A 2-element array. First element is 3, second is 7
数组初始化器中的元素表达式element expressions本身可以是数组初始化器,这意味着这些表达式可以创建嵌套数组nested arrays
let matrix = [[1,2,3], [4,5,6], [7,8,9]];
只要在逗号之间省略一个值,就可以在数组字面量中包含未定义的元素Undefined elements。
例如,下面的数组包含5个元素,其中包括3个未定义的元素
let sparseArray = [1,,,,5]; //**4个逗号,里面省略了3个值**
在数组初始化器中的最后一个表达式之后允许使用单个尾随逗号,这样并不会创建未定义的元素。 数组访问表达式对于(最后一个表达式的索引+1)的索引求值的结果是undefined。
2.对象初始化器
对象初始化器表达式类似于数组初始化器表达式,但方括号被花括号取代,并且每个子表达式都以属性名和冒号作为前缀
let p = { x: 2.3, y: -1.2 }; // An object with 2 properties
let q = {}; // An empty object with no properties
q.x = 2.3; q.y = -1.2; // Now q has the same properties as p
在ES6中,对象字面量拥有更丰富的语法特性
对象字面量可以嵌套
let rectangle = {
upperLeft: { x: 2, y: 2 },
lowerRight: { x: 4, y: 5 }
};
3.函数定义表达式Function Definition Expressions
函数定义表达式定义了一个JavaScript函数,该表达式的值就是新定义的函数。
在某种意义上,函数定义表达式是一个**“函数字面量”“function literal”**,就像对象初始化器是一个“对象字面量”“object literal”一样。
函数定义表达式通常由关键字 function 后跟括号中的零个或多个标识符(参数名称)的逗号分隔列表和花括号中的 JavaScript 代码块(函数体)组成
// This function returns the square of the value passed to it.
let square = function(x) { return x * x; };
函数定义表达式也可以包含函数名a name for the function。
函数也可以使用函数语句function statement而不是函数表达式来定义。
在ES6及以后版本中,函数表达式可以使用紧凑的新“箭头函数”语法a compact new “arrow function” syntax。
4.属性访问表达式Property Access Expressions
属性访问表达式的计算结果为对象属性object property或数组元素array element的值。
JavaScript定义了两种属性访问语法
expression . identifier
expression [ expression ]
第一种: 是一个表达式,后跟一个句点和一个标识符。 表达式指定对象,标识符指定所需属性的名称。
第二种: 在第一个表达式(对象或数组)之后使用方括号中的另一个表达式(指定所需属性的名称或所需数组元素的索引)
let o = {x: 1, y: {z: 3}}; // An example object
let a = [o, 4, [5, 6]]; // An example array that contains the object
o.x // => 1: property x of expression o
o.y.z // => 3: **property z of expression o.y**
o["x"] // => 1: property x of object o
a[1] // => 4: element at index 1 of expression a
a[2]["1"] // => 6: element at index 1 of expression a[2]
a[0].x // => 1: property x of expression a[0]
- 对于任一类型的属性访问表达式,. 或者方括号之前的表达式将首先被评估。
- 如果第一个表达式计算出的值为 null 或未定义undefined,则表达式将引发 TypeError,因为null 或未定义undefined两个值是不能具有属性的
- 如果对象表达式后跟一个点和一个标识符,则该标识符命名的属性的值成为表达式的整体值。
- 如果对象表达式后跟方括号中的另一个表达式,则计算第二个表达式并将其转换为字符串。表达式的整体值就是由该字符串命名的属性的值。
- 在任何一种情况下,如果命名属性不存在,则属性访问表达式的值是未定义的undefined。
第一种访问表达式语法较简单的一种,但如果属性名称包含空格