ECMAScript5学习笔记-第11章

11.表达式

11.1  主值表达式  语法:PrimaryExpression : this;执行为当前执行环境的ThisBinding

                       Identifier ;执行遵循 标识符解析 的标识符查找。标识符执行的结果总是一个 Reference 类型的值。

                       Literal;

                       ArrayLiteral;一个零个或者多个表达式的序列,其中每一个表示一个数组元素,并且用方括号括起来

当元素列表中的一个逗号没有被 AssignmentExpression 优先处理(如,一个逗号在另一个逗号之前。)的情况下,缺失的数组元素仍然会对数组长度有贡献,并且增加后续元素的索引值。省略数组元素是没有定义的。假如元素在数组末尾被省略,那么元素不会贡献数组长度。

                       ObjectLiteral ( Expression ):对象初始化是一个以直接量的方式描述对象的初始化过程的表达式。它是用花括号括起来的由零或者多对属性名 / 关联值组成的列表,值不需要是直接量,每次对象初始化被执行到时他们会执行一次

11.4.6  一元+-运算符

  一元+-运算符会将其操作数转换为类型

  1. 令 expr 为解释执行 UnaryExpression 的结果 .
  2. 返回 ToNumber(GetValue(expr)).

11.4.8 按位非运算符 ~unaryExpression

  1. 令 expr 为解释执行 UnaryExpression 的结果 .
  2. 令 oldValue 为 ToInt32(GetValue(expr)).
  3. 返回 oldValue 按位取反的结果。结果为 32 位有符号整数。

11.4.9  逻辑非运算符  !UnaryExpression

  1. 令 expr 为解释执行 UnaryExpression 的结果 .
  2. 令 oldValue 为 ToBoolean(GetValue(expr)).
  3. 如果 oldValue 为 true ,返回 false.
  4. 返回 true.

11.5  乘法运算符

  语法:MultiplicativeExpression : UnaryExpression ;MultiplicativeExpression * UnaryExpression; MultiplicativeExpression / UnaryExpression ;MultiplicativeExpression % UnaryExpression

  1. 令 left 为解释执行 MultiplicativeExpression 的结果 .
  2. 令 leftValue 为 GetValue(left).
  3. 令 right 为解释执行 UnaryExpression 的结果 .
  4. 令 rightValue 为 GetValue(right).
  5. 令 leftNum 为 ToNumber(leftValue).
  6. 令 rightNum 为 ToNumber(rightValue).
  7. 返回将特定运算符 (*, /, or %) 作用于 leftNum 和 rightNum 的结果

11.5.1  使用*运算符

*运算符表示乘法,产生操作数的乘积。乘法运算满足交换律。因为精度问题,乘法不总是满足结合律。

浮点数的乘法遵循IEEE 754二进制双精度幅度浮点算法规则:

  • 若两个操作数之一为NaN,结果为NaN。
  • 假如两个操作数的正负号相同,结果就是正的,如果不同就是负的。
  • 无穷大被零乘结果是NaN。
  • 无穷大被无穷大乘结果就是无穷大。符号按照前面说过的规则决定。
  • 无穷大被有穷的非零值乘结果是带正负号的无穷大。符号仍然按照前面说过的规则决定。
  • 其它情况下,既没有无穷大也没有NaN参与运算,结果计算出来后会按照IEEE 754 round-to-nearest模式取到最接近的能表示的数。如果值过大不能表示,则结果为相应的正负无穷大。如果值过小不能表示,则结果为相应的正负零。ECMAScript要求支持IEEE 754规定的渐进下溢。

11.5.2  使用/运算符

/运算符表示除法,产生操作数的商。左操作数是被除数,右操作数是除数。ECMAScript不支持整数除法。所有除法运算的操作数和结果都是双精度浮点数。浮点数的除法遵循IEEE 754二进制双精度幅度浮点算法规则:

  • 若两个操作数之一为NaN,结果为NaN。
  • 假如两个操作数的正负号相同,结果就是正的,如果不同就是负的。
  • 无穷大被零除结果是NaN。
  • 无穷大被无穷大除结果是NaN。
  • 无穷大被零除结果是无穷大。符号按照前面说过的规则决定。
  • 无穷大被非零有穷的值除结果是有正负号的无穷大。符号按照前面说过的规则决定。
  • 有穷的非零值被无穷大除结果是零。符号按照前面说过的规则决定。
  • 零被零除结果是NaN;零被其它有穷数除结果是零,符号按照前面说过的规则决定。
  • 有穷的非零值被零除结果是有正负号的无穷大。符号按照前面说过的规则决定。
  • 其它情况下,既没有无穷大也没有NaN参与运算,结果计算出来后会按照IEEE 754 round-to-nearest模式取到最接近的能表示的数。如果值过大不能表示,则结果为相应的正负无穷大。如果值过小不能表示,则结果为相应的正负零。ECMAScript要求支持IEEE 754规定的渐进下溢

11.5.3  使用%运算符

%运算符产生其运算符在除法中的余数。左操作数是被除数,右操作数是除数。

在C和C++中,余数运算符只接受整数为操作数;在ECMAScript,它还接受浮点操作数。

浮点数使用%运算符的余数运算与IEEE 754所定义的"remainder"运算不完全相同。IEEE 754 “remainder”运算做邻近取整除法的余数计算,而不是舍尾除法,这样它的行为跟通常意义上的整数余数运算符行为不一致。而ECMAScript语言定义浮点操作%为与Java取余运算符一致;可以参照C库中的函数fmod。

ECMAScript浮点数的取余法遵循IEEE 754二进制双精度幅度浮点算法规则:

  • 若两个操作数之一为NaN,结果为NaN。
  • 结果的符号等于被除数。
  • 若被除数是无穷大或者除数是零,或者两者皆是,结果就是NaN。
  • 若被除数有穷而除数为无穷大,结果为被除数。
  • 若被除数为零且除数非零且有穷,结果与被除数相同。
  • 其它情况下,既没有0,无穷大也没有NaN参与运算,从被除数n和除数d得到浮点数余数r以数学关系式 r = n − (d × q) 定义,其中q是个整数,在n/d为负时为负,在n/d为正时为正,它应该在不超过n和d的商的前提下尽可能大。结果计算出来后会按照IEEE 754 round-to-nearest模式取到最接近的能表示的数

11.6  加法运算发

  11.6.1 加号运算符:

产生式 AdditiveExpression : AdditiveExpression + MultiplicativeExpression 按照下面的过程执行 :

  1. 令 lref 为解释执行 AdditiveExpression 的结果 .
  2. 令 lval 为 GetValue(lref).
  3. 令 rref 为解释执行 MultiplicativeExpression 的结果 .
  4. 令 rval 为 GetValue(rref).
  5. 令 lprim 为 ToPrimitive(lval).
  6. 令 rprim 为 ToPrimitive(rval).
  7. 如果 Type(lprim) 为 String 或者 Type(rprim) 为 String,则: 返回由 ToString(lprim) 和 ToString(rprim) 连接而成的字符串
  8. 返回将加法运算作用于 ToNumber(lprim) 和 ToNumber(rprim) 的结果

在步骤5和6中的ToPrimitive调用没有提供hint,除了Date对象之外所有ECMAScript对象将缺少hint的情况当做Number处理;Date对象将缺少hint的情况当做hint为字符串。宿主对象可能将缺少hint的情况当做别的处理。

  11.6.2  减号运算符

产生式 AdditiveExpression : AdditiveExpression - MultiplicativeExpression 按照下面的过程执行 :

  1. 令 lref 为解释执行 AdditiveExpression 的结果 .
  2. 令 lval 为 GetValue(lref).
  3. 令 rref 为解释执行 MultiplicativeExpression 的结果 .
  4. 令 rval 为 GetValue(rref).
  5. 令 lnum 为 ToNumber(lval).
  6. 令 rnum 为 ToNumber(rval).
  7. 返回返回将减法运算作用于 ToNumber(lprim) 和 ToNumber(rprim) 的结果

  11.6.3  加法用于数字

+运算符作用于两个数字类型的操作数时表示加法,产生两个操作数之和。-运算符表示减法,产生两个数字之差。

加法是满足交换律的运算,但是不总满足结合律。

加法遵循IEEE 754二进制双精度幅度浮点算法规则:

  • 两个正负号相反的无穷之和为NaN。
  • 两个正负号相同的无穷大之和是具有相同正负的无穷大。
  • 无穷大和有穷值之和等于操作数中的无穷大。
  • 两个负零之和为-0。
  • 两个正零,或者两个正负号相反的零之和为+0。
  • 零与非零有穷值之和等于非零的那个操作数。
  • 两个大小相等,符号相反的非零有穷值之和为+0。
  • 其它情况下,既没有无穷大也没有NaN或者零参与运算,并且操作数要么大小不等,要么符号相同,结果计算出来后会按照IEEE 754 round-to-nearest模式取到最接近的能表示的数。如果值过大不能表示,则结果为相应的正负无穷大。如果值过小不能表示,则结果为相应的正负零。ECMAScript要求支持IEEE 754规定的渐进下溢。

-运算符作用于两个数字类型时表示减法,产生两个操作数之差。左边操作数是被减数右边是减数。给定操作数a和b,总是有a–b产生与a + ( -b )产生相同结果。

11.7  位运算移位运算符

语法:ShiftExpression : AdditiveExpression ;ShiftExpression << AdditiveExpression ;ShiftExpression >> AdditiveExpression ;ShiftExpression >>> AdditiveExpression

11.7.1  左移运算符

表示对左操作数做右操作数指定次数的按位左移操作。

产生式 ShiftExpression : ShiftExpression << AdditiveExpression 按照下面的过程执行 :

  1. 令 lref 为解释执行 ShiftExpression 的结果 .
  2. 令 lval 为 GetValue(lref).
  3. 令 rref 为解释执行 AdditiveExpression 的结果 .
  4. 令 rval 为 GetValue(rref).
  5. 令 lnum 为 ToInt32(lval).
  6. 令 rnum 为 ToUint32(rval).
  7. 令 shiftCount 为用掩码算出 rnum 的最后五个比特位 , 即计算 rnum & 0x1F 的结果。
  8. 返回 lnum 左移 shiftCount 比特位的结果。结果是一个有符号 32 位整数。

11.7.2  带符号右移运算符

产生式 ShiftExpression : ShiftExpression >> AdditiveExpression 按照下面的过程执行 :

  1. 令 lref 为解释执行 ShiftExpression 的结果 .
  2. 令 lval 为 GetValue(lref).
  3. 令 rref 为解释执行 AdditiveExpression 的结果 .
  4. 令 rval 为 GetValue(rref).
  5. 令 lnum 为 ToInt32(lval).
  6. 令 rnum 为 ToUint32(rval).
  7. 令 shiftCount 为用掩码算出 rnum 的最后五个比特位 , 即计算 rnum & 0x1F 的结果。
  8. 返回 lnum 带符号扩展的右 移 shiftCount 比特位的结果 . The most significant bit is propagated. 结果是一个有符号 32 位整数。

11.7.3  无符号右移运算符

产生式 ShiftExpression : ShiftExpression >>> AdditiveExpression 按照下面的过程执行 :

  1. 令 lref 为解释执行 ShiftExpression 的结果 .
  2. 令 lval 为 GetValue(lref).
  3. 令 rref 为解释执行 AdditiveExpression 的结果 .
  4. 令 rval 为 GetValue(rref).
  5. 令 lnum 为 ToUint32(lval).
  6. 令 rnum 为 ToUint32(rval).
  7. 令 shiftCount 为用掩码算出 rnum 的最后五个比特位 , 即计算 rnum & 0x1F 的结果。
  8. 返回 lnum 做 0 填充右移 shiftCount 比特位的结果 . 缺少的比特位填 0。 结果是一个无符号 32 位整数 .
时间: 2024-08-07 08:19:50

ECMAScript5学习笔记-第11章的相关文章

锋利的jQuery第2版学习笔记8~11章

第8章,用jQuery打造个性网站 网站结构 文件结构 images文件夹用于存放将要用到的图片 styles文件夹用于存放CSS样式表,个人更倾向于使用CSS文件夹 scripts文件夹用于存放jQuery脚本,个人更倾向于使用JS文件夹存放所有的js及jQuery脚本 编写CSS样式 推荐首先编写全局样式,接着编写可大范围内重用的样式,最后编写细节样式,这样根据CSS最近优先原则,可以较容易地对网站进行从整体到细节样式的定义 第9章,jQuery Mobile jQuery Mobile主要

&lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第11章 | 文件和素材

打开文件 open(name[mode[,buffing]) name: 是强制选项,模式和缓冲是可选的 #如果文件不在,会报下面错误: >>> f = open(r'D:\text.txt','r') Traceback (most recent call last): File "<stdin>", line 1, in <module> IOError: [Errno 2] No such file or directory: 'D:\\

&amp;lt;&amp;lt;Python基础教程&amp;gt;&amp;gt;学习笔记 | 第11章 | 文件和素材

打开文件 open(name[mode[,buffing]) name: 是强制选项,模式和缓冲是可选的 #假设文件不在.会报以下错误: >>> f = open(r'D:\text.txt','r') Traceback (most recent call last): File "<stdin>", line 1, in <module> IOError: [Errno 2] No such file or directory: 'D:\\

【算法导论】学习笔记——第11章 散列表

11.1 直接寻址表当关键字的全域U很小,可采用直接寻址的方式.假设动态集合S的元素都取自全域U={0, 1, ..., m-1}的一个关键字,并且没有两个元素具有相同的关键字.为表示动态集合,使用直接寻址表(diret-address table),记为T[0...m-1],其中的每个位置称为槽(slot).直接寻找表就是按照数组索引,缺点明显.基本操作如下: 1 DIRECT-ADDRESS-SEARCH(T, k) 2 return T[k] 3 4 DIRECT-ADDRESS-INSE

算法导论学习笔记——第11章 散列表

直接寻址表 1 DIRECT-ADDRESS-SEARCH(T,k) 2 return T[k] 3 4 DIRECT-ADDRESS-INSERT(T,x) 5 T[key[x]]←x 6 7 DIRECT-ADDRESS-DELETE(T,x) 8 T[key[x]]←nil

ECMAScript5学习笔记-第10章

10 可执行代码与可执行环境 10.1 可执行代码类型:全局代码(作为ECMA脚本被解析的源代码),eval(在特定的一次对eval的调用过程中,eval代码作为改程序的#global-code部分),函数代码(作为函数体被解析的源代码,不包括嵌套函数的函数体被解析的源代码) 10.1.1  严格模式下的代码 以指令序言开始,包含一个使用严格模式的指令序言 在严格模式下的代码中通过直接调用eval函数时即为严格eval代码 函数声明,函数表达式或函数赋值访问器处在严格模式下的代码中,或者函数代码

ECMAScript5学习笔记--第十三章 函数定义

语法: FunctionDeclaration : function Identifier ( FormalParameterListopt ) { FunctionBody } FunctionExpression : function Identifieropt ( FormalParameterListopt ) { FunctionBody } FormalParameterList : Identifier FormalParameterList , Identifier Functi

【算法导论】学习笔记——第6章 堆排序

堆这个数据结构应用非常广泛,数字图像处理的算法里也见过.似乎记得以前老师上课说需要用树结构实现堆排序,看了一下算法导论才明白其精髓.堆虽然是一棵树,但显然没必要非得用树结构实现堆排序.堆排序的性质很好,算法时间复杂度为O(nlgn). 1. 堆排序的简要说明.二叉堆可以分为两种形式:最大堆和最小堆.在最大堆中,最大堆性质是指除了根以外的所有结点i都要满足: A[PARENT(i)] >= A[i]:在最小堆中,最小堆性质是指除了根以外的所有结点i都要满足: A[PARENT(i)] <= A[

APUE学习笔记:第九章 进程关系

9.1 引言 本章将更详尽地说明进程组以及POSIX.1引入的会话的概念.还将介绍登陆shell(登录时所调用的)和所有从登陆shell启动的进程之间的关系. 9.1 终端登陆 系统管理员创建通常名为/etc/ttys的文件,其中每个终端设备都有一行,每一行说明设备名传递给getty程序的参数.当系统自举时,内核创建进程ID为1的进程,依旧是init进程.init进程使系统进入多用户状态.init进程读文件/etc/ttys,对每一个允许登陆的终端设备,init调用一次fork,所生成的子进程则