JavaScript运算符
一,算数运算符
算术运算符:+,-,*,/,%,分别是加减乘除取模(取余数)
在js 中,等于号是一种赋值的结果,是赋值运算,会将等号右边的结果赋值给等号左边
用一个var定义多个变量,使用逗号分隔
例:var b var a=b=a+3 则先把赋值之后的结果返回给a,再赋值给b
所以任何一个运算符都会先将结果返回出来给原本的声明要素,再赋值给后面的结果
(在配合循环时,还有个隐式转换,会将返回出来结果自动转换成布尔值,然后计入循环中)
等号左侧,不允许出现表达式,运算符只能放在右侧
小数计算时,为了保证数值的精确,通常会先相应的10的次幂换算成整数,然后在÷相应的10的次幂,用parseInt(科学计算法运算),浏览器就能精确得出我们想要的
所以,因为小数点后的运算不精确,可以考虑使用parseint((原值x10保留的数位次幂)运算符(原值y*10保留数位的幂))
取模运算时要记住,余数永远小于除数
加 减 乘 除 取模
var a=3;
//等号是赋值,会将等号右边的结果赋值给等号左边
var a=3,b=4,c=5;
//用一个var定义多个变量,使用逗号分隔
//var a,b,c;
a=b=a+3;//a+3的结果先赋值给a,再把a+3结果赋值给b
var x=3;
console.log(x=x+3);//任何一个运算符都会先将结果返回后赋值。
等号左侧不允许出现运算符,等号右侧才可以.
由于小数点后运算的不精确性,可以考虑使用
parseInt((原值x * 10保留的数位幂) 运算符 (原值 * 10保留数位幂)) / 10保留数位幂
console.log(parseInt((0.12346e+5)+(0.24563e+5))/(1e+5));
console.log(parseInt((0.3e+5)-(0.1e+5))/(1e+5));
非数值运算
1.如果运算符是加法,需要特殊处理,除加法以外的算术运算符,将符号两端的内容隐式转换为数值运算
console.log("5"-"2");//console.log(Number("5")-Number("2"));
console.log(null-true); -1
console.log(undefined-true);NaN
2.非数值加法运算
3.加法运算符左右两端含有字符串,会将另一端隐式转换为字符型,并且字符首尾相连拼接
console.log(true+"a");
var age=20; console.log("今年"+age+"岁");
4.如果加法两端没有字符串,会隐式转换成数值型在计算
console.log(true+null);
console.log(0+"a");
console.log(true-(0+"a"));//NaN
二,赋值运算符
console.log(a+=5);
a表示覆盖变量 +=运算符 5是步长
var a=5;
// a+="";//快速将数值转换为字符串的方法
移位运算中先将数值转换为二进制,后面添加几个0就是左移几位,再转换为十进制
四,位运算符
中文 中文简体字符集 大五码(台湾繁体字) unicode(万国码) utf-8
GBK5 GB2312 BIG5 unicode utf-8
位运算符 专门计算二进制的运算符
// 先把数值转换为二进制,然后按位相与
// 1&1=1
// 1&0=0
// 0&1=0
// 0&0=0
// 1011 11
// 1010 10
// 1010 10
// 1001 9
// 1000 8
// 0111 7
// 0000
// 任意一个数值,转换为二进制后,求出1的个数
// 11111
// var s=31;
// var n=1;
// while(s=s&(s-1)){
// n++;
// }
// console.log(n);
// 或运算 |
// 1|1=1
// 1|0=1
// 0|1=1
// 0|0=0
// 异或运算 相同为0,不同为1
// 1^1=0
// 1^0=1
// 0^1=1
// 0^0=0
加密
// 钥匙
// 5638^1234
// console.log(563810^1234); //564912
// console.log(564912^1234);//563810
// 位非 加1取负
五,一元运算符
var s=1;
console.log(s=s+1);//2
console.log(s++);//1 先把s返回,然后再+1然后重新赋值给s
console.log(++s);//2 先+1然后返回,再赋值给s
如果单独写s–或者–s,并不需要将运算的结果返回,不管使用s–还是使用–s,s的结果都相同
s–; --s;
小练习
var x=5;
//6 + 6+ 7 + 8 + 9 +9 + 10=55
//6+ 6+ 7 +8 +9 +9 +10
var y=++x + x++ + x++ + x++ +x +x++ +x;//求出他的值
var x=5;
console.log(x++*2);//10 x++的返回值*2
console.log(++x*2);//12
var x=5;
x+=++x;
console.log(x);//11
遇到一元运算符时,分清楚返回的结果和运算的变量值
//小练习
x+="";
x++;// 遇到一元运算符,优先将变量转换为数值型
console.log(x)
字符串快速转换为数值型
var x=“5”;
console.log(+x);
六,关系运算
< > <= >= == === != !== 返回的结果是布尔值
=== 判断等号两边的对象是否全等,包括值和类型, NaN无法判断,NaN===NaN false
console.log({x:1}==={x:1});//false 所有的对象都是引用关系,引用关系创建的对象表面相同,地址不同
== 仅判断等号两端结果是否相等,如果类型不相同,先隐式转换后在比较
console.log("3"==3);//转数值
console.log(1==true);//数值
console.log(undefined==false);//false
console.log(undefined==null);//只有null和undefined相等,其它都不等
console.log(0==false); console.log(""==false); console.log(""==0);
console.log([]==[]);//false 引用型
console.log([]=="");//数组和其它符号比较时,先转换成字符串,[]转换为空字符串
console.log([]==0); console.log([]==false); console.log([]==![]); //true
// 0,false,"",NaN,null,undefined 转换为布尔值 false
//var a;
if(a==false){
//a=>0 "" false []
}
if(a===false){ //a=>false
}
if(!a){
//a=>"" 0 NaN undefined false null
//遇见非转换布尔值
}
if(a==undefined){
//a=>null undefined
}
isNaN()
var str = NaN;
console.log(isNaN(str));
console.trace(Number.isNaN(str));
//window.isNaN 隐式转换数值型后再判断是不是NaN
//Nubmer.isNaN 仅判断数值类型,不做隐式转换,如果是非数值,则默认判断结果都是false
isNaN 是不是非数值 true就是非数值,false是数值
自动隐式转换为数值,然后再判断是否是非数值
// console.log(isNaN("a"));//true
// console.log(isNaN(3));//false;
// console.log(isNaN("3"));//false
// console.log(isNaN(true));//false
// console.log(isNaN(""));//false
// console.log(isNaN(" "));//false
// console.log(isNaN(NaN));//true
//只有是数值类型才用Number.isNaN判断
//isNaN 相当于双等号,判断是不是非数值,先隐式转换为数值型在判断
//Number.isNaN 类似于三等,判断内容是不是数值类型,如果不是直接返回false,只有NaN返回为true
七,逻辑运算符
/* 逻辑运算 */
&&返回值不反悔布尔值
A(true) && B(true) =B(true)
A(false) && B(true) =A(false)
A(true) && B(false) =B(false)
A(false) && B(false) =A(false)
var x=60;
console.log(x && x+1); //61
var x=-10;
console.log(x-10 && x+10); //0
var x;
if((x=2) && (x=0)){
console.log(x);
}
|| 熔断
A(true) || B(true) =A(true)
A(true) || B(false) =A(true)
A(false) || B(true) =B(true)
A(false) || B(false) =B(false)
console.log(null || 5); console.log(null || 0);
console.log(null || 5); //5
console.log(null || 0); //0
熔断赋值
var x=5; x=x || 3;
var x=1;
x= --x || x++; // 0
x= --x || ++x; // 1
// 在使用逻辑与和逻辑或时,判断时通常都是转换为布尔值判断,
// 但是并没有将原值转换,返回的还是原值,不是布尔值
! 取反 先隐式转换为布尔值,然后取反
八,三元运算符 条件运算符 三目运算符
写法 条件?结果1:结果2 条件1ttrue则返回结果1否则结果2
注意:如果结果1和结果2都是布尔值时,不要使用三目运算符,直接返回条件
三目运算符最大的缺点,优先级非常低(赋值更低,所以当出现赋值运算符时,先运算三目运算符)
例如: var a=5 var b=a>0?3:2;