在项目的后端开发中,在编写逻辑时经常会用到运算符,所以我们必须熟练掌握它们的一些应用规则。 今天我们就来了解一下运营商的类型、规则以及一些注意事项。
1. 运营商类型
1. 算术运算符: + 、 - 、 * 、 / 、 % 、 - (一元否定)、 ++ 、 --
2. 等号运算符: == , === , !== , !===
3. 比较运算符:<、>、=
4. 字符串运算符:<、>、=、=、+
5、逻辑运算符:&&、||、!、
6. 赋值运算符:=、+=、*=、-=、/=
2. 运算符规则 1. 算术运算符规则
“+”:可以进行“加”、“连接”操作; 如果两个运算符之一是字符串,javascript 会将另一个转换为字符串,然后连接两个操作数。
“+”:如果操作数是一个对象,javascript会将该对象转换为数字用于乘法或字符串用于连接;
"-" "*" "/" 如果两个操作数之一是非数字,则将其转换为数字以进行物理运算。
"/" 在javascript中,由于所有的数字都是浮点数,所以除法的结果都是浮点数,5 / 2 = 2.5; 除以0的结果是正负无穷大; 0/0 为 NaN;
“%”取模运算符:计算第一个操作数对第二个操作数的模,即第一个操作数除以第二个操作数时,返回余数。 如果操作数是非数字,则将其转换为数字。
“-”一元取反:将操作数取反,如果操作数不是数字,则将其转换为数字。
“++”“--”自增运算符/自减运算符符号:操作数必须是变量、树组的元素或对象的属性。 如果操作数不是数字,则将其转换为数字。
注意:如果操作数前面有“++”,则先将操作数递增,然后再估计操作数递减后的操作数值。
如果“--”在操作数后面,则先估计操作数之前的值不减,然后再递增操作数。
例如:
i = 1; //赋值给i值1 j = ++i; //先将i增量为2,然后将2赋值给j,i的值是2,j的值也是2。 i = 1; //赋值给i值1 j = i++; //先将i赋值给j,然后对将i值增量到2,i的值是2,j的值是1。
减量运算符“--”与“++”相同。
2. 等号运算符和同号运算符
(一)“==”“!==”等价运算符和非等号运算符:
比较 2 个操作数,返回非布尔值。
数量用于比较数字、字符串和布尔值。 当且仅当两个变量存储相同的值时,它们才相等。
比较对象、数组和函数时,使用引用。 只有当两个变量引用同一个对象时,它们才是相等的。 两个不同的字段即使具有完全相同的元素,也是完全不同的。 对于存储对对象、数组和函数的引用的变量,仅当它们引用相同的对象、数组或函数时它们才是相等的。
注:应遵守的原则:
当两个操作数类型不同时:将它们转换为相同类型javascript 运算符,
1)将字符串转换为数字后,对数字和字符串进行比较。
2) 将 true 转换为 1,将 false 转换为 0 进行比较。
3)一个对象、数组、函数和一个数字或字符串,将对象、数组、函数转换为原始类型的值,然后进行比较。 (先使用valueOf,如果没有就使用toString)
4)其他类型的组合不是量值。
如果两个操作数类型相同,或者转换为相同类型后:
1)2个字符串:如果相同位置的字符相等,则2个字符串相同。
2)2个数字:2个数字相同,它们是相同的。 如果其中一个为 NaN,或者两者均为 NaN,则不相同。
3)两者都为真javascript 运算符,或者两者都为假,则认为相同。
4) 如果两个引用引用同一个对象、函数或数组,则它们相等; 如果它们引用不同的对象、函数或数组,则它们是不一样的,即使这两个对象、函数和数组可以转换为完全相等的原始值。
5) 2 个空值,或者两者都未定义,则它们相等。
“!=”非等式运算符:与等式运算符测量的内容相反。
(二)“===”!===相同运算符和不同运算符:
相同运算符遵循相等运算符的比较规则,但不对操作数进行类型转换。 当两个操作数的类型不同时,返回false; 只有当两个操作数的类型相同时,才遵循相等性。 进行比较的运算符比较规则。
“!==”非相同运算符将相同运算符的结果进行相反比较。 如果两个操作数具有不同的类型或值,则返回 true。
3. 比较运算符
这些比较运算符用于比较不同类型的值并返回布尔值作为结果。
”“”=
请注意规则:比较操作数可以是任何类型,但只能对数字和操作数执行。 非数字和字符串的操作数将转换为数字或字符串。
1)如果两个操作数都是数字,或者都可以转换为数字,则根据数字的大小进行比较;
2)如果两个操作数都是字符串,或者都可以转换为字符串,则按照字母顺序进行比较;
3)如果字符串遇到数字,则将字符串转换为数字进行比较。
4) 如果操作数既不能转换为数字,也不能转换为字符串,则返回结果 false。
4. 字符串运算符
没有专用的字符串运算符,但某些运算符在遇到字符串操作数时的行为有所不同。
(一)“+”连接2根字符串;
1)当两个操作数都是字符串时,将它们连接起来;
2)当其中之一为数字时,将数字转为字符串并连接;
(二)“>”等比较运算符,通过比较确定两个字符串的顺序,比较字符的顺序,较小的位于大写字母的后面,大写字母放在大写字母的前面。
(III)“+”的作用方式取决于估计的顺序,
例如:s = 1 + 2 + "var" 则:返回结果3var; 因为先估计1+2,然后将结果3转成字符串并用“var”连接;
例如: s = "var" + 1 + 2 则:返回结果 var12; 因为先估计var和1之间的连接,然后将结果var1与转换成字符串的2连接。
5. 逻辑运算符
用于进行布尔运算,常与比较运算符一起使用,表示复杂的比较运算。
“&&”逻辑与运算,“||” 逻辑或运算符,“!” 逻辑非运算符
(一)“&&”当两个操作数都是布尔值时,逻辑与对其进行与操作,即:当且仅当两个布尔值都为true时,返回结果true,否则返回false。
注:实际表现
“&&”会测量第一个表达式操作数的布尔值,如果第一个操作数表达式返回false,则返回右边第一个操作数表达式的值:false; 否则继续检查第二个ie左操作数表达式,然后返回第二个操作数表达式的值;
例如: if (a = b) stop(); 相当于 (a = b) && stop();
这个技巧已被弃用,因为运算符左侧的代码不能保证被执行,
例如: if ((a < b) && (b++
将“&&”视为布尔代数运算符更容易、更安全。
(二)“||” 当两个操作数均为布尔值时,逻辑OR对其进行或运算,即:当两个布尔值其中之一为true时,返回结果true,否则返回false。
注:实际表现
“||” 会检查第一个表达式操作数的布尔值,如果第一个操作数表达式返回true,则返回右边第一个操作数表达式的值:true; 否则继续检查第二个即左操作数表达式,然后返回第二个操作数表达式的值;
这个技巧也已被弃用,因为运算符左侧的代码不能保证被执行,
通常不鼓励在 || 右侧使用具有其他效果(赋值、函数调用、递增或递减)的表达式;
想到“||”更容易、更安全作为布尔代数运算符。
(三)“!” 逻辑非是一元运算符,放在操作数之前,其目的是对操作数求反。
6. 赋值运算符
(一)“=”是赋值运算符; 他总是期望左边的操作数是一个变量,一个数组的元素,或者一个对象的属性;
期望左侧有任何类型的任意值;
对于从右到左的关联性,如果表达式中有多个赋值运算符,则从最左边开始求值。
注意:每个赋值表达式都有一个值,就是运算符左边的值;
(二)可以将形参运算与操作一起使用
“+=”左边的值与左边的值相加后,赋值给右边的值。 "-=""/=""*="方法相同;
7、其他经营者
“?:”条件运算符是唯一的三元运算符;
表达式的布尔结果? 表达式1(任何类型的任何值):表达式2(任何类型的任何值);
根据第一个操作数的布尔结果,如果为true,则执行第二个操作数表达式,返回第二个操作数表达式的值; 如果第一个操作数的布尔结果为 false,则执行第三个操作数表达式,返回第三个操作数表达式的值。
3.注意JavaScript运算符
1.注意传递给操作符的数据类型和返回的数据类型! 不同的运算符期望其操作数表达式估计的结果符合某种数据类型。
例如:字符串不能被分割,“a”*“b”是非法的,但是javascript会在可能的情况下将表达式转换为正确的类型,因此表达式“3”*“5”是合法的,javascript将字符串转换为a number 执行运算,结果返回数字 15,而不是字符串“15”。
2.+根据不同的操作数有不同的表现:
字符串 + 字符串 = 字符串(连接); “a”+“b”=“ab”“5”+“6”=“11”
字符串+数字=(字符串转换为数字)字符串(连接); "a" + 5 = "a5" 5 转换为字符串 "1" + 0 = "10"
数字 + 数字 = 数字(加法)5 + 5 = 10。
3、注意运算符的结合性,有些运算符是从左到右结合的; 有些是从右到左关联的。
例如:w=a+b+c等价于w=(a+b)+c;
w = ---b 相当于 w = - ( - ( -b ) ); w = a = b = c 相当于 w= ( a = ( b = c ))
一元运算符、赋值运算符、三元运算符的结合性是从右到左;