表达式,运算符是程序的基础,最简单的 var myName="zhuanbang"; 这个就是一个表达式,把等号右边的字符串,赋值到左边myName这个变量名上;表达式在各个类型里会介绍,这里主要总结运算符; 大多数的运算符是有`+`、 `-` 、`==`这种标点符号来表现,但是也有一些运算符是由关键字表示的,比如delete和instanceof,不过无论标点符号表示的运算符还是关键字表示的运算符,都是合法的运算符; # 运算符; 类似生活中的,加减乘除,是对程序的操作;但是需要注意的是,数学里面的加减乘数等都是对数字而言的,但是在JS里这些都是可以对不同的数据进行操作的,当然这些也是包括数字类型的; ECMAScript里用于操作数据值的运算符也叫操作符,只是叫法不同,包括算术运算符,位运算,关系运算,相等运算;这些都是可以针对不同类型的值的(比如字符串,数值,布尔,对象) 需要牢记一点:应用对象的时候,运算符通常会调用对象上的valueOf或者toString方法,转成字符串后再次进行操作; - 一、[算术运算符](#one) - 二、[自增与自减](#two) - 三、[关系运算符](#three) - 四、[对象运算符](#four) - 五、[逻辑运算符](#five) - 六、[位运算符](#six) - 七、[其他运算符](#seven) - 八、[=/==/===、!与!!的区别](#eight) - 九、[计算器案例](#nine) - 十、[表格排序案例](#ten) - [练习题](#footer) 需要注意一点:NaN和任何数操作,结果都返回NaN; ## 知识点一、算术运算符; 算术运算符包括:+-\*/%; 复合赋值运算符:+=、-=、*=、/=、%= - ##### +(加号) - 功能: - 1、对数字进行代数求和 - 2、对字符串进行连接操作 - 3、将一个数值转换成字符串 - 字符串拼接 - 字符串+字符串---两者直接拼接 - 字符串+数值---数值转为字符串再拼接 - 如果有一个操作数是对象、数值或布尔值,则调用它们的 toString() 方法取得相应的字符串值,然后再应用前面关于字符串的规则。 var strEmpty=""; var testNum=222; var targetData=strEmpty+testNum; console.log(typeof testNum);//number console.log(typeof targetData);//string //多次运算 var testOne="字符串"; console.log(testOne+2+5);//字符串25 console.log(testOne+(2+5));//字符串7 如果数值和字符串一起混,数值类型的用()包裹,提高优先级;否则是字符串+2;计算的结果再+5; - ##### -(减号) - 功能: - 对操作数进行”取反”操作 - 对数字进行减法操作 - 将字符串转换成数值--数值型字符串-0; - ##### *和/(乘除) - 功能:对两个运算数进行乘法(除法)运算; - 符号问题:同号得正,异号得负; - 如果有一个操作数不是数值,则在后台调用 Number() 将其转换为数值,然后再应用上面的规则。 - 如果有一个操作数是 NaN ,则结果是 NaN ; - ##### %(求余/求模) - 功能:返回两个除数的余数 - 符号问题:和第一个运算数的符号相同; - 如果被除数是零,则结果是零; - 如果有一个操作数不是数值,则在后台调用 Number() 将其转换为数值,然后再应用上面的规则。 var times=123453;//求多少分,多少秒; var targetTime=parseInt(times/60)+"分"+times%60+"秒"; console.log(targetTime); //思考:等于多少天,多少小时,多少分,多少秒 ##### 操作数类型和结果类型 运算符通常会根据需要对操作数进行类型转换;比如【*】【/】的时候,可以把字符串转为数值; console.log("5"+"3");//53 console.log("5"-"3");//2 console.log("5"*"3");//15 console.log("15"/"3");//5 ##### 赋值操作符 `=`:赋值 var a=10; `+=`:加赋值 x+=y // x=x+y; `-=`:减赋值 x-=y // x=x-y; `*=`:乘赋值 x*=y // x=x*y; `/=`:除赋值 x/=y // x=x/y; `%=`:取余赋值 x%=y // x=x%y; **[↑ 返回目录](#zero)** ## 知识点二、自增与自减; 注意:++i和i++是完全两回事;(递增和递减操作符直接借鉴自 C,而且各有两个版本:前置型和后置型。) - 功能相反 - ++ 对唯一的运算数进行递增操作(每次加1) - -- 对唯一的运算数进行递减操作(每次减1) - 规则相同 - 运算数必须是一个变量,数组的一个元素或者对象的属性 - 如果运算数是非数值的则运算符将它转成数值;(可用于字符串,布尔值,浮点数值和对象) - 转换规则是,调用用Number,根据转后的值,再次进行运算; - 符号位置决定运算结果 - 运算数之前,先进行递增(递减)操作,再进行求值; - 运算数之后,先求值,再进行递增(递减操作;) var num1=20, num2= 2, num3=30; var num4=num1--+num2, num5=num1+num2, num6=--num3+num2, num7=num3+num2; console.log(num4 ,num5);//22,21 console.log(num6 ,num7);//31,31 var num=0; num=num+2; num=num*3; num=num/2; num++; num--; num+=1; num-=2; num*=3; num/=2; num%3; console.log(num); **[↑ 返回目录](#zero)** ## 知识点三、关系运算符; ###大小关系检测 ##### 运算符 - < - 如果A小于B,则返回true,否则返回值为false; - <= - 如果A小于等于B,则返回值为true,否则返回false - \>= - 如果A大于等于B,返回true,否则返回值为false - \> - 如果A大于B,则返回true,否则返回值为false //关系操作符 var testNum=3; console.log("下面是关系操作符"); console.log(testNum>1); console.log(testNum>=1); console.log(testNum<1); console.log(testNum<=1); ##### 操作规则 - 数值与数值的比较,比较他们的代数值; - 仅一个运算数是数值,将另一个运算数转换成数值,并比较他们的代数值; - 字符串间的比较,逐字符比较他们的Unicode数值;//"" - 如果一个操作数是数值,则将另一个操作数转换为一个数值,然后执行数值比较;(只要有一个是数值,另外一个无论什么值,都会最终转为数值后再比较) - 运算数既非数字也非字符串,返回值为fals e; - 与NaN比较,返回值是false; console.log("20">"100000");//true console.log(null>2);//false console.log(NaN>2);//false 注意:做关系比较的时候,一定要把值全部转为数值,这是一个很好的习惯;一定要避免2个字符串在一起比较大小; ### 等值关系检测;( == 和 === ) #####相等比较 - 操作符 - == 比较两个运算数的返回值看是否相等;(和正常生活中的=一定要区分开;) - != 比较两个运算数的返回值看是否不想等; - 类型转换 - 布尔值 - True 1; - False 0; - 对象,调用valueOf() 基本类型 - 字符串与数值的比较,字符串转换为数值; - 比较原则 - Null与undefined;相等,比较前不做任何转换; - NaN,与任何数值都不想等,包括其自身; - 对象,是否属于同一个对象 - 是 == - 否 != var testNum=3; console.log("下面是关系操作符"); console.log(testNum==1); console.log(testNum===1); console.log(testNum!=1); 【我手动画的转换图】 ![](https://raw.githubusercontent.com/Broszhu/zhuanbang-javascript-notes/master/img/path1/typeChange.jpg) //转换分析1 console.log("zhuanbang"?true:false);//true,因为非空的字符串是一个真值; //转换分析2 console.log("zhuanbang"==true);//这个时候输出什么呢?在分析一里非空字符串是一个true,那么非空字符串==true吗? //转换分析3 console.log("zhuanbang"==false);//如果上面的的返回不是true,那么这个会返回true吗? //下面的分析的步骤; /*转换分析2-解析 * 1、右边的布尔值会转为数字,true->1;"zhuanbang"==1 * 2、左边的字符串会转为数字,"zhuanbang"因为里面有字母,所以转换为NaN;NaN==1 * 3、NaN和任何数据都不想等,包括自己,所以结果是false,并不是true; * */ /* * 1、右边的布尔值会转为数字,false->0;"zhuanbang"==0 * 2、左边的字符串会转为数字,"zhuanbang"因为里面有字母,所以转换为NaN;NaN==0 * 3、NaN和任何数据都不想等,包括自己,所以结果是false,结果也不是true * */ ##### 相同比较(也叫绝对相等/全等) - 运算符 - === 比较两个运算数的返回值以及数据类型是否相同; - !== 比较两个运算数的返回值以及数据类型是否不相同 - 比较原则 - 值类型间比较,只有数据类型相同,且数值相等时才能够相同; - 值类型与引用类型比较,肯定不相同, - 引用类型间的比较,比较他们的引用值(内存地址) 简单的说,就是x和y比较,如果两者的类型不同,那就没有比较的意义了,直接返回false; //相同的小分析 console.log("zhuanbang"===true); console.log("1"===1); console.log("zhuanbang"==="zhuanbang"); var person1={name:"zhuanbang"}; var person2={name:"zhuanbang"}; console.log(person1===person2);//false, 是不同的引用地址;在堆内存中储存是不一样的; **[↑ 返回目录](#zero)** # 知识点四、对象运算符; - In 判断左侧运算数是否为右侧运算数的成员; - Instancesof 判断对相爱呢个实例是否属于某个类或构造函数 - New 根据构造函数创建一个新的对象,并初始化该对象 - Delete 删除指定对象的属性,数组元素或变量 - 可以删除对象里的属性: var myObj = {name: 'aaaa', age: 21}; delete myObj.age; console.log(myObj); // 输出对象{name: "aaaa"} - .及[] 存取对象和数组元素 - () 函数调用,改变运算运算符优先级等; **[↑ 返回目录](#zero)** # 知识点五、逻辑运算符; ### !逻辑非:返回值 在JavaScript中,true和false有些复杂。在大多数编程语言中,布尔值true和false仅仅表示true/false。在JavaScript中,如"ssss"这样的字符串值,也可以看作true。 - 返回值 - True(表达式或值计算为false的,都可以转为true) - 空字符串 - 0 - -0; - NaN - Null - Undefined - False - False(表达式或值计算为true的,都可以转为false) - 对象 - 非空字符串 - 非0数值(Infinity) - 特性; - 如果运算数的值为false则返回true,否则返回false; - 连续使用两次,可将任意类型转为布尔类型值;(!!相当于Boolean) console.log(!true);//false console.log(true && false);//false console.log(true || false);//true ### &&逻辑与 ##### 规则 - 只有第一个值是true的时候,才会返回第二个值;第一个值为false,则返回第一个值;意是根据原理来返回的;&&是必须两个都为true才为true的;看取决于哪个值的 - 第一个操作数的对象,返回第二个操作数(第一个为true了,关键取决于第二个值,所以返回第二个) - 第二个操作数是对象,如果想返回第二个对象,第一个必须为true; - 如果两个操作数都是对象,第一个是true,则返回第二个操作数; - 第一个操作数是null,返回null(第一个null已经是false了,后面第二个值无论是true-还是false已经不重要了,所以返回的是第一个值) - 第一个操作数是NaN,返回NaN(原理同上) - 第一个操作数是undefined,返回undefined(原理同上) ##### 特性 - 当且进档两个运算数的值都是true时,才返回true,否则返回false(做if判断的时候) - 短路操作,当第一个操作数的值是false,则不再对第二个操作数进行求值(做变量赋值的时候) ### ||逻辑或 - 规则: - 两个操作数都是false的时候才为false;第一个操作数是true,则返回第一个数;无需对第二个值判断了,已经可以确定为true;如果第一个值为false的时候,返回第二个数;因为第一个已经是false了,值取决于第二个值,所以返回第二个值; - 第一个操作数是对象,返回第一个操作数 - 第一个操作数值为false,返回第二个操作数 - 两个操作数都是对象,返回第一个操作数 - 两个操作数都是null,返回null; - 两个操作数都是NaN,返回NaN; - 两个操作数都是undefined,返回undefined - 特性: - 当且进档两个运算数的值都是false时,才会烦false,否则返回true; - 如果第一个操作数值为true,则不会对第二个操作数进行求值; var a="", b="B有值"; var result=a||"A的值是假的", result2=b||"B的值是假的"; console.log(result); console.log(result2); **[↑ 返回目录](#zero)** ## 知识点六、位运算符 **(仅作了解,可以忽略不看,项目中很少用到);** - 基础知识; - 类型; - 有符号; - 数值位,前31位; - 符号位,第32位; - 0,整数 - 1,负数 - 无符号; - 只能是正数 - 第32位表示数值 - 数值范围可以加大 - 数值范围;-2147483648~2147483647 - 存储方式 - 正数 - 纯2进制存储 - 31位表示数值 - 数值范围可以加大 - 负数 - 2进制补码存储 - 补码的计算步骤 - 1、确定该数字的非负版本的二进制表示 - 2、求得二进制反码,既要把0替换为1,把1替换为0; - 3、在二进制反码上加1; - 当作0来处理的特殊值 - NaN - Infinity - 逻辑位运算 - 返回值为1, - 按位非~ 0 - 按位与& 对应值全为1 - 按位或| 任何一位是1 - 按位异或^ 既不同时为0,也不同时为1; - 返回值为0; - 按位非~ 1 - 按位与& 任何一位是0 - 按位或| 对应位全0; - 按位异或^ 对应位全0或全1 - 位移操作 - 左移<< - 将数值的所有位左移指定的位数 - 所有空位用0补充 - 左移1位对其X2,左移2位对其X4;依次类推; - 有符号右移>> - 将数值的所有位右移指定的位数 - 一处的位被舍弃 - 保留符号位 - 右移一位对齐除2,右移两位对齐除4,依次类推 - 无符号右移>>> - 正数,与有符号右移结果相同 - 负数,会出现无限大的数值; - 复合赋值运算符:位操作符与等号结合,复合赋值不会有性能方面的提升; & 按位与 | 按位或 ~ 按位非 ^ 按位异或 << 按位左移 >> 按位右移 **[↑ 返回目录](#zero)** ## 知识点七、其他运算符; - ?: 条件运算符,简介的if else;也叫三元运算符/三目运算符; - 基本格式为:条件表达式?表达式一:表达式二; - 其中问号之前的表示判断的条件,如果这个条件为真,则执行问号后面的语句,如果判断条件不成立,则执行冒号后面的语句; - 简单的条件可以用三目运算符写; function trueOrFalse(val) { return val?console.log(val+" is true"):console.log(val+" is false") } trueOrFalse(null); trueOrFalse(undefined); trueOrFalse(0); trueOrFalse(NaN); trueOrFalse(-0);//0===-0 trueOrFalse(false); trueOrFalse(""); trueOrFalse(" "); trueOrFalse({}); trueOrFalse([]); trueOrFalse(1); 三元/三目是根据操作数的个数来分的,比如 a-b,计算2个数属于二元元算数,而-b就是一元运算符(将操作数b求负数,只操作b这个一个数);而?:是计算三个数的,所以叫三元运算符; 而三目是三元的另外一种叫法 上面的利用三元运算符来判断值的真假; - typeof,类型判定运算符 console.log('typeof num:', typeof num); console.log('typeof Packt:', typeof 'aaaaaa'); console.log('typeof true:', typeof true); console.log('typeof [1,2,3]:', typeof [1,2,3]); console.log('typeof {name:John}:', typeof {name:'sssss'}); - ,逗号,在一行语句中执行多个不同的操作 ,一般用于声明多个变量; - 忽略第一个操作符,返回第二个操作符; var a=, b=4, c=5; var test=1,2,3,4,5,6,7;//结果test的值是7; - void,舍弃运算数的值,返回undefined作为表达式的值; **[↑ 返回目录](#zero)** ## 知识点八、=/==/===、!与!!的区别 ##### =、==、===三者的区别; 千万不要把"=="当做"="来使用, 千万不要把"=="当做"="来使用, 千万不要把"=="当做"="来使用,尤其是写if语句的时候一定要注意; - =、一个等号是赋值运算,把等号右边的值付给左边的变量,是从右想做计算,并且运算优先级最低; - ==。两个等号是比较运算,会得到一个真/假的逻辑只,遇到左右两边是不同的数据类型,默认会进行数据类型转换; - ===、三个等号是绝对的相等,只有数据类型一样才有可比性,遇到左右两边数据类型不同,并不会像==一样进行数据类型转换; ##### !和!!: - !是取反的意思;先将其它的数据类型转换为布尔类型;然后在取反; - !!是将其他的数据类型转换为不二类型,相当于Boolean; 记住前面说的哪些数据是真,哪些是假就可以了; 0 NaN "" null undefined这些用都是flase - 如果操作数是一个对象,返回 false ; - 如果操作数是一个空字符串,返回 true ; - 如果操作数是一个非空字符串,返回 false ; - 如果操作数是数值 0,返回 true ; - 如果操作数是任意非 0 数值(包括 Infinity ),返回 false ; - 如果操作数是 null ,返回 true ; - 如果操作数是 NaN ,返回 true ; - 如果操作数是 undefined ,返回 true 。 **[↑ 返回目录](#zero)** ## 计算器和表格排序案例; - 写一个计算器案例; - 表格排序案例; **[↑ 返回目录](#zero)** 下面图片是截自权威指南,体现运算符的优先级; ![](http://i.imgur.com/Xa7Krpg.png) ## 思考题: - 123567秒转X分X秒; - if(a=2){console.log(“””)}; ==不要混淆成=; - var timers=213123123;是多少分,多少秒; **[↑ 返回目录](#zero)**