
目录1. 运算符1.1 赋值运算符1.1.1 解构1.2 比较运算符1.3 算术运算符1.4 位运算符1.4.1 位逻辑运算符1.4.2 移位运算符1.4.3 逻辑运算符1.4.3.1 短路求值1.5 字符串运算符1.6 条件运算符1.7 逗号操作符1.8 一元操作符1.8.1 delete1.8.1.1 删除数组元素1.8.2 typeof1.8.3 void1.9 关系运算符1.9.1 in1.9.2 instanceof1.10 运算符优先级2. 表达式2.1 基本表达式2.1.1 this2.1.2 分组操作符2.2 左值表达式2.2.1 new2.2.2 super参考待了解1. 运算符JavaScript拥有如下类型的运算符。赋值运算符比较运算符算术运算符位运算符逻辑运算符字符串运算符条件运算符逗号运算符一元运算符关系运算符1.1 赋值运算符赋值运算符将它右边操作数的值赋给它左边的操作数。最简单的赋值运算符是它将右边的操作数值赋给左边的操作数。x y就是将y的值赋给x。名字简写的运算符含义赋值x yx y加法赋值x yx x y减法赋值x - yx x - y乘法赋值x * yx x * y除法赋值x / yx x / y求余赋值x % yx x % y求幂赋值x ** yx x ** y左移位赋值x yx x y右移位赋值x yx x y无符号右移位赋值x yx x y按位与赋值x yx x y按位异或赋值x ^ yx x ^ y按位或赋值x | yx x | y逻辑与赋值(x为真时赋值)x f()x (x f())逻辑或赋值(x为假时赋值)x || f()x || (x f())逻辑空赋值(x为空值时赋值)x ?? f()x ?? (x f())1.1.1 解构对于更复杂的赋值解构语法时一个能从数组或对象对应的数组结构或对象字面量里提取数据的JavaScript表达式。letfoo[1,2,3];let[one,two,three]foo;console.log(one,two,three);1.2 比较运算符比较运算符比较它的操作数并返回一个基于表达式是否为真的逻辑值。操作数可以是数字字符串逻辑对象值。字符串比较是基于标准的字典顺序使用Unicode值。在多数情况下如果两个操作数不是相同的类型JavaScript会尝试转换它们为恰当的类型来比较。这种行为通常发生在数字作为操作数的比较。类型转换的例外是和!操作它们会执行严格的相等和不相等比较。这些运算符不会在检查相等之前转换操作数的类型。letvar13;letvar24;运算符描述返回true的示例等于如果两边操作数相等时返回true3 var1“3” var13 ‘3’不等于!如果两边操作数不相等时返回truevar1 ! 4var2 ! “3”全等两边操作数相等且类型相同时返回true3 var1不全等!两边操作数不相等或类型不同时返回truevar1 ! “3”3 ! ‘3’大于左边的操作数大于右边的操作数返回truevar2 var1“12” 2大于等于左边的操作数大于或等于右边的操作数返回truevar2 var1var1 3小于左边的操作数小于右边的操作数返回truevar1 var2“2” 12小于等于左边的操作数小于或等于右边的操作数返回truevar1 var2var2 51.3 算术运算符算术运算符使用数值(字面量或者变量)作为操作数并返回一个数值。标准的算术运算符就是加减乘除。当操作数是浮点数时这些运算符表现得跟它们在大多数编程语言中一样(特殊要注意的是除零会产生Infinity)。1/2;// 0.51/21.0/2.0;// true除了加减乘除之外JavaScript还提供了下表中的算术运算符。运算符描述示例求余%二元运算符。返回相除之后的余数12 % 5返回2自增一元运算符。将操作数的值加一。如果放在操作数前面x则返回加一后的值如果放在操作数后面x则返回操作数原值然后再将操作数加一var x 3;console.log(x); // 4console.log(x); // 4var y 3;console.log(y); // 3console.log(y); // 4自减–一元运算符。将操作数的值减一。前后缀两种用法的返回值类似自增运算符var x 3;console.log(–x); // 2, x 2var y 3;console.log(y–); // 3, y 2一元负值符-一元运算符返回操作数的负值var x 3;console.log(-x); // -3一元正值符一元运算符如果操作数在之前不是数值试图将其转换为数值console.log( ‘3’ ); // 3console.log( ‘3’ ); // ‘3’console.log( true ); // 1指数运算符**计算底数base的指数exponent次方表示为base^exponent2 ** 3返回8.10 ** -1返回0.11.4 位运算符位运算符将它的操作数视为32位元的二进制串而非十进制八进制或十六进制。例如十进制数字9用二进制表示为1001位运算符就是在这个二进制表示上执行运算但是返回结果是标准的JavaScript数值。下表总结了JavaScript的位运算符。操作符用法描述按位与ANDa b在a,b的位表示中每一个对应的位都为1则返回1否则返回0按位或ORa | b在a,b的位表示中每一个对应的位只要有一个为1则返回1否则返回0按位异或XORa ^ b在a,b的位表示中每一个对应的位两个不相同则返回1否则返回0按位非NOT~ a反转被操作数的位左移shifta b将a的二进制串向左移动b位右边移入0算术右移a b把a的二进制表示向右移动b位丢弃被移出的所有位(算术右移左边空出的位是根据最高位是0和1进行填充的)无符号右移(左边空出位用0填充)a b把a的二进制表示向右移动b位丢弃被移出的所有位并把左边空出的位都填充为01.4.1 位逻辑运算符概念上来讲位逻辑运算符工作流程如下操作数被转换为32bit整数以位序列(0和1组成)表示。若超过32bits则取低位32bit如下所示Before: 11100110111110100000000000000110000000000001 After: 10100000000000000110000000000001第一个操作数的每一位都与第二位操作数的对应位组对第一位对应第一位第二位对应第二位以此类推。运算符被应用到每一对位上最终的运算结果由每一对位的运算结果组合起来。例如十进制9的二进制表示是1001十进制数15的二进制表示是1111。因此当位运算符应用到这两个值时结果如下表达式结果二进制描述15 991111 1001 100115 | 9151111 | 1001 111115 ^ 961111 ^ 1001 0110~15-16~0000 0000 … 0000 1111 1111 1111 … 1111 0000~9-10~0000 0000 … 0000 1001 1111 1111 … 1111 0110注意位运算符非将所有的32位取反而至的最高位位1则表示负数(2-补码表示法对补码表示取反后最低位加1)。1.4.2 移位运算符移位运算符带两个操作数第一个是待移位的数第二个是指定第一个数要被移多少位的数。移位的方向由运算符来控制。移位运算符把操作数转为32bit整数然后得出一个与待移位数相同种类的值。运算符描述示例将第一个操作数向左移动指定数量的位。左边移出位被抛弃。左边多出的空位由0补齐9 2产生361001移位2比特变为10010036将第一个操作数向右移动指定数量的位。右边移出位被抛弃。左边多出的空位由原值的最左边数字补齐9 2产生21001移位2位向右变为102。-9 21111 1111 … 0111移位两位向右变为1111 1111 … 1101-3将一个操作数向右移动指定数量的位。右边移出位被抛弃。左边多出的空位由0补齐192产生410011移位2位向右变为001004。对非负数值补零右移和带符号右移产生相同结果。1.4.3 逻辑运算符逻辑运算符常用于布尔逻辑值之间当操作数都是布尔值时返回值也是布尔值。不过实际上和||返回的是一个特定的操作数的值所以当它用于非布尔值的时候返回值就可能是非布尔值。逻辑运算符的描述如下。运算符范例描述逻辑与expr1 expr2如果expr1能被转换为false那么返回expr1否则返回expr2。因此用于布尔值时当操作数都为true返回true否则返回false逻辑或||expr1 || expr2如果expr1能被转换为true那么返回expr1否则返回expr2。因此||用于布尔值时当任何一个操作数为true则返回true如果操作数都是false则返回false逻辑非!!expr如果操作数能够转换为true则返回false否则返回true能被转换为false的值有null0NaN空字符串和undefined。leta1truetrue;// t t returns trueleta2truefalse;// t f returns falseleta3falsetrue;// f t returns falseleta4false34;// f f returns falseleta5CatDog;// t t returns Dogleta6falseCat;// f t returns falseleta7Catfalse;// t f returns falseleto1true||true;// t || t returns trueleto2false||true;// f || t returns trueleto3true||false;// t || f returns trueleto4false||34;// f || f returns falseleto5Cat||Dog;// t || t returns Catleto6false||Cat;// f || t returns Catleto7Cat||false;// t || f returns Catletn1!true;// !t returns falseletn2!false;// !f returns trueletn3!Cat;// !t returns false1.4.3.1 短路求值作为逻辑表达式进行求值是从左到右它们是为可能的短路的出现而使用以下规则进行测试false anything // 被短路求值为falsetrue || anything // 被短路求值为true逻辑的规则保证这些评估总是正确的。上述表达式的anything部分不会被求值所以这样做不会产生任何副作用。1.5 字符串运算符除了比较运算符它可以在字符串值中使用连接操作符连接两个字符串值相连接返回另一个字符串它是两个操作数串的结合。console.log(my string);简写操作符也可以用来拼接字符串。letmyStringalpha;myStringbet;console.log(myString);1.6 条件运算符条件运算符是JavaScript中唯一需要三个操作数的运算符。运算的结果根据跟定条件在两个值中取其一。条件?值1:值2如果条件为真则结果取值1否则取值2。你能够在任何允许使用标准运算符的地方使用条件运算符。letage19;letstatusage18?adult:minor;console.log(status);1.7 逗号操作符逗号操作符,对两个操作数进行求值并返回最终操作数的值。它常常用在for循环中在每次循环时对多个变量进行更行。逗号操作符,对两个操作数进行求值并返回最终操作数的值。它常常用在for循环中在每次循环时对多个变量进行更新。 例如假如 a 是一个二维数组每个维度各有10个元素以下代码利用逗号操作符来同时改变两个变量的值。这段代码的功能是打印出该二维数组的对角线元素的值 js 复制varx[0,1,2,3,4,5,6,7,8,9];vara[x,x,x,x,x];// i, j这个逗号才是逗号操作符for(vari0,j9;ij;i,j--)console.log(a[i][j] a[i][j]);1.8 一元操作符一元操作符仅对应一个操作数。1.8.1 deletedelete操作符删除一个对象的属性或者一个数组中某一个键值。deleteobjectName.property;deleteobjectName[index];deleteproperty;objectName是一个对象名property是一个已经存在的属性index是数组中的一个已经存在的键值的索引值。第三行的形式只在with声明的状态下是合法的从对象中删除一个属性。你能使用delete删除各种各样的隐式声明但是被var声明的除外。如果delete操作成功属性或者元素会变成undefined。如果delete可行会返回true否则返回false。x42;vary43;myobjnewNumber();myobj.h4;deletex;// truedeletey;// falsedeleteMath.PI;// falsedeletemyobj.h;// truedeletemyobj;// true1.8.1.1 删除数组元素删除数组中的元素时数组的长度是不变的例如删除a[3]a[4]a[4]和a[3]仍然存在变成了undefined。delete删除数组中的一个元素这个元素就不在数组中了。lettreesnewArray(redwood,bay,cedar,oak,maple);deletetrees[3];if(3intrees){// 不会被执行}如果想让数组中存在一个元素但是是undefined值使用undefined关键字而不是delete操作。lettreesnewArray(redwood,bay,cedar,oak,maple);tree[3]undefined;if(3intrees){// 会被执行}1.8.2 typeoftypeof操作符可通过下面2种方式使用。typeofoperandtypeof(operand);typeof操作符返回一个表示operand类型的字符串值。operand可为字符串、变量、关键词或对象其类型将被返回。operand两侧的括号为可选。letmyFunnewFunction(5 2);letshaperound;letsize1;lettodaynewDate();typeofmyFunc;// functiontypeofshape;// stringtypeofsize;// numbertypeoftoday;// objecttypeofdontExist;// undefinedtypeoftrue;// booleantypeofnull;// objecttypeofdocument.lastModified;// stringtypeofwindow.length;// numbertypeofMath.LN2;// number1.8.3 voidvoid运算符运用方法如下。voidexpression;void(expression);void运算符表明一个运算没有返回值。expression是JavaScript表达式括号中的表达式是一个可选项当然使用该方式是一种好的形式。你可以使用void运算符指明一个超文本链接。该表达式是有效的但是并不会在当前文档中进行加载。a hrefjavascript:void(0)Click here todonothing/aa hrefjavascript:void(document.form.submit())Click here to submit/a1.9 关系运算符关系运算符对操作数进行比较根据比较结果真或假返回相应的布尔值。1.9.1 inin操作符如果所指定的属性确实存在于所指定的对象中则会返回true。propNameOrNumberinobjectName;propNameOrNumber可以是一个代表着属性名的字符串或者一个代表着数组索引的数值表达式objectName是一个对象名。lettreesnewArray(redwood,bay,cedar,oak,maple);0intrees;// true3intrees;// true6intrees;// falsebayintrees;// falselengthintrees;// true 属性PIinMath;// trueletmyStringnewString(coral);lengthinmyString;// trueletmycar{make:Honda,model:Accord,year:1998};makeinmycar;// truemodelinmycar;// true1.9.2 instanceof如果所判别的对象确实是所指定的类型则返回true。objectNameinstanceofobjectType;objectName是需要做判别的对象的名称而objectType是假定的对象的类型。当你需要确认一个对象在运行时的类型时可使用instanceof。例如需要catch异常时你可以针对抛出异常的类型来做不同的异常处理。lettheDaynewDate(1995,12,17);if(theDayinstanceofDate){//}1.10 运算符优先级运算符的优先级用于确定一个表达式的计算顺序。在你不能确定优先级时可以通过使用括号显示声明运算符的优先级。下表列出了操作符的优先级从高到低。. []() new! ~ - – typeof void delete* / % - in instanceof ! !^|||?: -- * / % ^ |,2. 表达式表达式是一组代码的集合它返回一个值。每一个合法的表达式都能计算成某个值但从概念上讲有两种类型的表达式有副作用的和单纯计算求值的。表达式x7是第一类型的一个例子。该表达式使用运算符将值7赋予变量x。这个表达式自己的值等于7。表达式3 4是第二个表达式类型的一个例子。该表达式使用运算符把3和4加到一起但并没有把结果7赋值给一个变量。JavaScript有以下表达式类型算术得出一个数字。字符串得出一个字符串。逻辑值得出true或者false。基本表达式javascript中基本的关键字和一般表达式。左值表达式分配给左值。2.1 基本表达式2.1.1 thisthis关键字被用于指代当前的对象通常this指代的是方法中正在被调用的对象。this[propertyName];this.propertyName;假设一个用于验证对象value属性的validate函数传参有对象最高值和最低值。functionvalidate(obj,lowval,hival){if(obj.valuelowval||obj.valuehival)console.log(Invalid Value!);}你可以在任何表单元素的onchange事件处理中调用validate函数用this来指代当前的表单元素。pEnter a number between 18 and 99;/pinputtypetextnameagesize3onChangevalidate(this,18,99);/2.1.2 分组操作符分组操作符()控制了表达式中计算的优先级。leta1;letb2;letc3;// 默认优先级ab*c;// 7// 现在使加法优先于乘法(ab)*c;// 92.2 左值表达式左值可以作为赋值的目标。2.2.1 new你可以使用new运算符创建一个自定义类型或者预设类型的对象实例。// []表示可选letobjectNamenewobjectType([param1,param2,...,paramN]);2.2.2 supersuper关键字可以用来调用一个对象父类的函数它在用来调用一个类的父类的构造函数时非常有用。super([arguments]);super.functionOnParent([arguments]);参考1、表达式与运算符待了解1、赋值2、加法赋值3、减法赋值4、乘法赋值5、除法赋值6、求余赋值7、求幂赋值8、左移位赋值9、右移位赋值10、无符号右移位赋值11、按位与赋值12、按位异或赋值13、按位或赋值14、逻辑与赋值15、逻辑或赋值16、逻辑空赋值17、解构18、delete19、typeof20、in21、this