对象和数组的初始化表达式、属性访问表达式

对象和数组初始化表达式
实际上是一个新创建的对象和数组。有时也称对象直接量和数组直接量,但它们不是原始表达式,因为它们所包含的成员或者元素都是子表达式。

数组初始化表达式是通过一对方括号和其内部由逗号隔开的列表构成,初始化的结果是一个新创建的数组,数组的元素是逗号分隔的表达式的值。并且,数组初始化表达式中的元素初始化表达式也可以是数组的初始化表达式,也就是说,这些表达式是可以嵌套的。
js对数组初始化表达式进行求值的时候,数组初始化表达式中的元素也都会各自计算一次,也就是说,数组初始化表达式每次计算的值有可能不同。
数组直接量中的列表逗号之间的元素可以省略,省略的空位会填充值undefined。结尾处也可以留下逗号,但并不会创建一个新的值为undefined的元素。
对象初始化和数组初始化很相似,只是方括号被花括号代替,并且每个子表达式都包含 一个属性和一个冒号作为前缀。
像数组一样,对象直接量也可以嵌套。
同样,js求对象初始化表达式的值的时候,对象的表达式也都会各自计算一次, 并且它们不必包含常数值,它可以是任意的js表达式,同样,对象直接量中的属性名称可以是字符串,而不是标识符。
属性访问表达式
属性访问表达式运算得到一个对象属性或一个数组元素的值,js为属性访问定义了两种语法:
expression.identifier
表达式后跟随一个句点和标识符。表达式指定对象,标识符则指定需要访问的属性名称
expression[expression]:
使用方括号,方括号内是另外一个表达式(这种方式适用于对象和数组),方括号内的表达式指定要访问的属性的名称,或者代表要访问数组元素的索引。
不管使用哪种形式的属性访问表达式,在".“和”["之前的表达式总是会首先计算。
如果计算结果是null或者undefined,表达式会抛出一个类型错误异常,因为这两个值都不能包含任意属性。
如果计算结果不是对象或者数组,js会将其转换为对象。
如果对象表达式后面跟随句点和标识符,则会查找这个标识符所指定的属性的值,并将其作为整个表达式的值返回。
如果对象表达式后跟随一对方括号,则会计算方括号内的表达式的值,并将其转换成字符串。
不管哪种情况,如果命名的属性不存在,则整个属性访问表达式的值就是undefined。

expression.identifier这种表达式的写法更加简单,但是需要注意,
这种表达式只适用于要访问的属性名称是合法的标识符,并且需要知道要访问的属性名字。
如果属性名称是一个保留字或者包含空格和标点符号,或者是一个数字,则必须用方括号写法。
如果属性名是通过运算得出的值,而不是固定值得时候,必须用方括号写法。

对象创建表达式
对象创建表达式创建一个对象并调用一个函数初始化新对象的属性。
如果一个对象创建表达式不需要传入任何参数给构造函数时,可以省略圆括号。
当计算一个对象表达式的值时,和对象初始化表达式通过{}创建对象的做法一样,js首先会创建一个空对象,然后,js通过传入指定的参数并将这个新对象当做this的值来掉用一个指定的函数,这个函数可以使用this来初始化这个新创建对象的属性。
那些被当成构造函数的函数,不会返回一个值,并且这个新创建的并被初始化后的对象,就是整个对象创建表达式的值。

猜你喜欢

转载自blog.csdn.net/qq_40699600/article/details/90454564