Javascript核心读书有感之表达式和运算符(2)


            var side = 1;
            var square = {"left":{x:p.x,y:p.y},
            'right':{x:p.x+side,y:p.y+side}}

第6 7章还会再次讨论对象和数组的初始化表达式。

3.函数表达式

函数定义表达式定义一个javascript函数。表达式的值是这个新定义的函数。从某种意义上将,函数定义表达式可以成为函数直接量,函数表达式可称为“函数直接量”,毕竟对象初始化表达式也称为“对象直接量”。一个典型的函数定义表达式包含关键字function,其后是一对圆括号,括号以内是逗号分隔的列表,列表包含0或多个标识符(参数名)。然后跟随花括号包裹的javascript代码段(函数体).

var square = function(x){ return x*x};
函数定义表达式同样可以包含函数的名字。函数也可以通过函数语句来定义,而不是函数表达式。更多内容会在第八章描述。

4.属性访问表达式

属性访问表达式运算得到一个对象或者一个数组元素的值。javascript为属性访问定义了两种方法。

复制代码 代码如下:


        expression . indentifier
        expression [expression]

第一种写法是一个表达式后跟随一个句点和标识符。表达式指定对象,标识符则指定要访问的属性明川。
第二章写法是使用方括号,方括号内是一个表达式(这种方法适用于对象和数组)。第二个表达式指定要访问的属性的明川或者代表要访问数组元素的索引。这里有一些具体的例子

复制代码 代码如下:


    o.x //=>1表达式o的x属性
        o.y.z //=>3 表达式o.y的z属性
        o.["x"] //=>1的对象o的x属性
        a[1]  //=>4 表达式a索引为1的元素
        a[2]["1"]//=>6 表达式a[2]中索引为1的元素
        a[0].x //=>1: 表达式a[0]的x属性

不管使用哪种形式的属性访问表达式,在"."和"["之前的表达式总会首先计算。如果计算结果为null或者undefined,表达式会抛出类型错误异常,因为这两个值都不能包含任意属性。如果运算结果不是对象或数组,javascript会将其转换为对象(3章6节内容)

虽然.identifier的写法更加简单,但需要注意的是,这种方式只适用于要访问的属性名称是合法的标识符。并且需要知道要访问的属性名字。如果属性名称是一个保留字或者包含空格和标点符号,是一个数字(对于数组来说),则必须使用方括号的写法。当属性名是通过运算符得出的值而不是固定值的时候,这时候必须使用方括号的写法。(6章2节1小节)

5.调运表达式

javascript中的调用表达式(invocation expression)是一种调用(或者执行)函数或方法的语法表示。它以一个函数表达式开始,这个函数表达式指代了要调用的函数。函数表达式后跟随一对圆括号,括号内是一个以逗号隔开的参数列表。参数可以有0个也可以有多个。

f(0) //f是一个函数表达式:0是一个参数表达式。
            Math.max(x,y,z)  //Math.max是一个函数;x,y和z是参数
            a.sort() //a.sort()是一个函数,它没有参数。
当调用表达式进行求值的时候,首先计算函数表达式,然后计算参数表达式,得到一组参数值。如果函数表达式的值不是一个可调用的对象,则抛出一个类型错误异常.然后参数的值依次被赋值给形参,这些形参是定义函数时定义的。接下来执行函数体。如果函数使用return语句给出一个返回值,那么这个返回值就是整个调用表达式的值。否则,调用表达式的值就是undefined.函数调用--包括形参表达式的个数和函数定义中实参的个数不匹配的时候运行的情况--的细节将会在第八章详细说明。

任何一个调用表达式都包含一对圆括号和左圆括号之前的表达式,如果这个表达式是一个属性访问表达式,那么这个调用叫做“方法调用”(method invication)。在方法调用中执行函数体的时候,作为属性访问主体的对象和数组便是其调用方法内this的指向。这种特性使得在面向对象编程的范例中,函数(其OO名称为“方法”)可调用其宿主对象(第9章会有更多相关内容)。

6.对象创建表达式

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wgffgj.html