JavaScript高级程序设计(第3版)学习笔记4——运算符和操作符.doc_第1页
JavaScript高级程序设计(第3版)学习笔记4——运算符和操作符.doc_第2页
JavaScript高级程序设计(第3版)学习笔记4——运算符和操作符.doc_第3页
JavaScript高级程序设计(第3版)学习笔记4——运算符和操作符.doc_第4页
JavaScript高级程序设计(第3版)学习笔记4——运算符和操作符.doc_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

如果说数据类型是编程语言的砖瓦,那么运算符和操作符则是编程语言的石灰和水泥了,它是将各种数据类型的值有机组合的糅合剂,使得数据值不再只是一个孤立的值,而有了一种动态的灵性。在ECMAScript中,有非常丰富的运算符和操作符,在这篇文章中将按通常的分类来稍微整理一下,不过在整理之前,先说明一下:1、虽然标题是运算符和操作符,然而在我看来并没有多少严格区分的必要,在英文中,貌似也是用一个Operator来表示,所以在下文中我可能会混用。甚至,一些不属于运算符和操作符范畴的,我也整理在这里,只要我觉得必要。2、对于运算符的优先级,你无需一一牢记我相信你知道最简单的”先乘除,后加减”,至于其它的,如果你不确定,加上括号好了。在ECMAScript中,优先级相同的从左向右运算。3、对于一些编程语言通用的运算符,比如常用算术运算符(+-*/),我只会简单的列举一下,不会展开,但是请注意,并不是说这些不重要,相反,这些通用运算符甚至处于一个非常基础的地位,只是我觉得你应该早已经熟悉,没必要在这里花时间强调。4、那么,这里重点关注什么呢?就是一些在ECMAScript中比较特殊的操作符,或者我认为值得花时间强调的一些地方。运算符与操作符类别操作符描述说明一元操作符+自增11、自增(减)有前置和后置两种类型,前置先自增(减)再参与其它运算,后置先参与其它运算再自增(减)。2、在ES中,自增(减)不仅适用于整数,它们可以作用于任意值,对于不是Number类型的值,会先按前一篇文章中的规则隐式转换为Number,然后再自增(减),此时变量类型也会变成Number类型。-自减1+一元加一元加最主要的应用就是将操作数转变为Number类型,相当于调用Number()转换。 -一元减一元减则是在一元加的基础之上再取其相反数。算术操作符+加1、除了加(+)之外,如果操作数不是Number类型,会自动调用Number()转换为Number类型再进行计算。2、对于加减(+-),除了作为算术运算符。还可以作为一元操作符(见上)。当然,由于字符串操作中对加号(+)的重载,还可以用于将任意数值(的字符串)相连,这也是第1点中为什么要除了加(+),它在含有非Number类型值时,会将所有操作数转换为字符串相连接。3、与一般类C语言不同,在ES中,除(/)和取模(%)并不会区分整数和浮点数,比如 5 / 2 = 2.5 而不是2,5.3 % 3 = 2.3 而不是2。4、任意运算,只要操作数含NaN,结果就是NaN。但并不是结果为NaN就一定有一个操作数为NaN,比如0/0也返回NaN。5、对于含无穷Infinity的运算,规定比较多,这里就不列举了,可以参考原书,或者自行测试。-减*乘/除%取模逻辑操作符 (布尔操作符)!逻辑非首先将操作数转换为Boolean类型值,然后再取反。可以使用双重非!将一个数值转换为相应的Boolean值。&逻辑与1、当两个操作数相应的Boolean值均为true时,返回true2、短路:当第一个操作数相应的Boolean值为false时,会直接返回false,不会再计算第二个操作数。这常常被应用在判断一个变量(属性)是否有定义, 如:if(object & & = linjisong)这里会首先判断object存在,不存在的话就不会解析从而阻止错误的发生,同样,也只有存在,才会去比较这个值。|逻辑或1、当两个操作数相应的Boolean值至少有一个为true时,返回true2、短路:当第一个操作数相应的Boolean值为true时,会直接返回true,不会再计算第二个操作数。3、逻辑或,除了用于一般的判断之外,还常常被应用在提供默认值的情况,如:function Fn(obj)obj = obj | ;这里如果调用Fn未传入obj,则会自动给obj赋值为undefined,然后因为undefined的相应Boolean值为false,所以会将一个空对象赋值给obj,如果调用传入了obj,则因为任意对象的Boolean值为true,所以就不会取后面的,从而达到给obj一个默认值的效果。这种方式还被应用在大型JS库的多个相对独立的文件中:/jsLibvar jsLib;/file1(function (jsLib)jsLib = jsLib | ;)(jsLib);/file2(function (jsLib)jsLib = jsLib | ;)(jsLib);使用这种方式,无论先加载哪个文件,都会判断jsLib是否已经定义,如果未定义就提供一个默认值,这样做可以使得相对独立模块可以不用考虑加载顺序。关系操作符(比较操作符)小于1、只要有一个操作数是Number类型或Boolean类型值,就将两个操作数转换成Number类型值(如果需要转换)执行数值比较。2、字符串比较,会逐个比较字符编码值。3、操作符是对象时,调用valueOf()(如果没有,就调用toString()),再将结果按上面规则比较。4、任意数和NaN比较返回false。大于=大于或等于=相等1、相等和不等(=、!=)在比较时,只要有必要,就会隐式类型转换。2、全等和不全等(=、!=)在比较时,不会转换类型,如果类型不一致,直接为!=。3、结合1、2,可以知道,a=b则一定有a=b,而a!=b则一定有a!=b。!=不等=全等!=不全等赋值操作符=赋值复合算术赋值操作符算术运算符加=对应算术运算符,有+=、-=、*=、/=、%=复合按位赋值操作符按位运算符加=对应按位运算符,有=、&=、|=、=、=、=按位操作符按位非按位取反,也即返回反码&按位与按位对齐,逐位操作,只有两个操作位均为1才返回1,否则该位返回0,最后将所有位操作结果组合返回|按位或按位对齐,逐位操作,只有两个操作位均为0才返回0,否则该位返回1,最后将所有位操作结果组合返回按位异或按位对齐,逐位操作,两个操作位不相同时返回1,否则该位返回0,最后将所有位操作结果组合返回有符号右移二进制数向右移位,高位以符合位填充无符号右移二进制数向右移位,直接右移,对于正数,结果和相同,对于负数,会把负数的二进制补码当成正数的二进制码处理字符串操作符+字符串连接相当于concat()函数,会先将所有操作数转换为字符串,然后再连接。注意,字符串一旦创建就不会变更,执行字符串连接时,在后台会有一个中间的连接和销毁过程,这也是老旧浏览器在大量字符串连接操作时运行缓慢的原因。+=字符串连接复合a+=b,相当于a=a+b。对象操作符.属性访问符简单的对象属性访问符。属性或(类)数组访问通过,可以访问名称是一个变量或含有特殊字符的属性。new调用构造函数创建对象返回一个新创建的对象,在构造函数内部的this被指向这个新创建的对象。delete变量、属性删除删除属性(变量可以看成是全局对象或执行环境的一个属性)。void返回undefined。in判断属性对象属性或原型链上的属性。instanceof原型判断比较同一个上下文中的对象是否为另一个对象的原型。其它操作符?:条件操作符语法;var value = exp ? trueExp : falseExp。 相当于var value; if(exp) value = trueExp;elsevalue = falseExp;,逗号操作符主要用于声明多个变量,这也是很多JS库的流行做法。例如:var num1=1,num2=2,num3=3;()分组操作符主要用途:1、结合逗号操作符用于赋值。例如:var num = (5,1,4,8,0);这里num最后的值为0。2、转换为表达式。比如eval(+jsStr+);又比如:function fn()/函数声明,不能直接调用(function fn()();/使用()将函数括起来,便可以直接调用3、用于调用函数。比如fn();。typeof类型操作符返回一个字符串值:Undefined类型undefined、Null类型object、Boolean类型boolean、Number类型number、Stringstring、内置Function对象的实例function、其它Object类型object。(有些浏览器实现略有不同)说明几点:1、这里的分类并不十分严格,比如按位非()、逻辑非(!)、delete、void、typeof,都可以算是一元操作符,而自增(+)在很多资料中也被归为算术操作符之中。我在整理时则主要参考原书分类,也兼顾自然性。2、加号(+)的用法比较灵活,需注意,特别是用于计算时,忽略了其中的字符串,会很容易犯错误。3、typeof一般用来判断简单数据类型,如果是对象类型,因为大部分返回的都是object,没有多大实际用处,而instanceof的判断也需要满足同一个上下文的条件,否则也会出错,对于对象类别的判断会在后面讲述对象时再详细说明另外一种更为稳妥的方法。4、先看下面的代码:var numVal = 10.00, strVal = 10, strObj = new String(10); (numVal = strVal);/(typeof (strVal+strObj);/string第一个输出的竟然是true,是不是出乎你的意料?在这里,由于=比较符发生了隐式类型转换,会将Number类型转换为String类型,然后Number类型的10.00因为小数点后没有不是0的数值,会被解析成整数10,从而比较的时候会相等。第二个输出是string,这其实还是比较容易理解的,strVal是字符串,strObj是字符串对象,两者相加,会把对象转换成字符串,所以最终结果也是字符串类型。5、关于符号,重复一下几个流行的用法(这里不涉及正则表达式中的用法):(1)使用一元加号(+)转换为Number类型。(2)使用双重逻辑非(!)转换为Boolean类型。(3)使用逻辑与(&)来检测对象是否存

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论