一元操作符
一元操作符:只操作一个变量的符号
一、自增和自减操作符
就是让变量自己加1或减1,
<script>
var a=20;
++a;//让a的值加1
//等价于a = a+1
console.log(a) //21
var b=20;
b++;//让b的值加1
//等价于 b = b+1
console.log(b) //21
</script>
区别:
<script>
var c=10
console.log(c++) //10
console.log(c)//取c变量中保存的值并打印 11
console.log(++c) //11
console.log(c)//取c变量中保存的值并打印 11
</script>
前置++ 就是先把变量修改了 再取值操作;
后置++ 就是先取变量的值 然后在加1操作;
无论前置还是后置 既有存值操作也有取值操作;
取值和存值 就是把一个变量保存的数据取出来 把一个计算结果存入变量;
一个变量只能保存一个数据;
<script>
// 练习:
var a = 2;
var b = 3;
var c = (++a) + (b++) + b + (a++) - a;//3+3+4+3-4
console.log(c)//9
</script>
补充:++ 的优先级大于+
--操作与++操作一样
二、逻辑操作符
1、逻辑与 &&
var re=A&&B
A是一个表达式 B也是一个表达式 re等于A表达式或者B表达式
(如果A表达式判定为布尔表达式的值的false)re就是A 否则反之为B表达式
如果re为A表达式 那么B表达式不运行
练习:
<script>
var a=(b=0)&&(c=30)
//b=0==>var b=0
console.log(a)//a=b=0 并不是a=false
console.log(b)
console.log(c)
//ps:
//0做布尔判定时会判定为flase
//取一个变量的数据时(1.没有声明就会报错 2.取的是最近一次保存的数据)
//js中变量保存数据(1.已经有就更新 2.没有就隐藏声明)
//结果为 0 0 报错
</script>
2、逻辑或(||)
和逻辑与操作符相似,逻辑或操作符也是短路操作符。即,当第一个数的求值结果为true时,就不会对第二个操作数求值了。
如果有一个操作数不是布尔值,逻辑或也不一定返回布尔值;此时,它遵循下列规则:
-
如果第一个操作数是对象,则返回第一个操作数;
-
如果第一个操作数的求值结果为 false,则返回第二个操作数;
-
如果两个操作数都是对象(或非0数),则返回第一个操作数;
-
如果两个操作数都是 null,则返回 null;
-
如果两个操作数都是 NaN,则返回 NaN;
-
如果两个操作数都是 undefined,则返回 undefined
练习:
<script>
var re=(a=100)||(b=0);
console.log(re) //100
console.log(b) //报错
</script>
注意:
|| 这个符号在开发中 往往是优化的代码最常用的js符号
例如:var xhr=new XMLHttpRequest()||new ActiveXObject('Micorsoft.XMLHTTP')解决兼容性问题。
3、逻辑非(!)
可以应用于 ECMAScript 中的任何值。无论这个值是什么数据类型,这个操作符都会返回一个布尔值。逻辑非操作符首先会将它的操作数转换为一个布尔值,然后再对其求反。
例子:
<script>
var a="isLogin"//判断是否登录过
a=!a// !a 把a的值取出来 然后转化为布尔值true 在取反 在把取反的结果赋值给变量
console.log(a)
</script>
经常用于开关思想,
开关思想:把一个变量中保存一个布尔值 然后在业务执行时 修改这个变量的值:为取反 然后通过变量的值执行分支业务。例如:
<script>
var flag=true
function fn(){
flag=!flag
if(flag){
}else{
}
}
fn()
</script>
三、关系操作符
运算符 ==> 底层cpu会去计算 会执行操作 得到一个结果
1、比较运算符
小于(<),(大于)>,(大于等于)>=,(小于等于)<=,他们用于两个数的比较,返回的值是一个布尔值。
当两个数存在非数值性时,会进行相应的转换,规则如下:
-
如果两个操作数都是字符串,则比较两个字符串对应的字符编码值。
-
如果一个操作数是数值,则将另一个操作数转换为一个数值,然后执行数值比较。
-
如果一个操作数是对象,则调用这个对象的 valueOf()方法,用得到的结果按照前面的规则执行比较。如果对象没有 valueOf()方法,则调用 toString()方法,并用得到的结果根据前面的规则执行比较。
-
如果一个操作数是布尔值,则先将其转换为数值,然后再执行比较。
-
任何操作数与 NaN 进行关系比较,结果都是 false
2、相等运算符
相等(==)、不相等(!=)、全相等(===)、不全等(!==)
==比较比较两个数的值是否相等,相等返回true;!=,不相等返回true。
当两个操作数类型不同时,会先转换操作数(强制转换),转换规则如下:
-
如果有一个操作数是布尔值,则在比较相等性之前先将其转换为数值——false 转换为 0,而true 转换为 1;
-
如果一个操作数是字符串,另一个操作数是数值,在比较相等性之前先将字符串转换为数值;
-
如果一个操作数是对象,另一个操作数不是,则调用对象的 valueOf()方法,用得到的基本类型值按照前面的规则进行比较;
注意:
-
null 和 undefined 是相等的。
-
要比较相等性之前,不能将 null 和 undefined 转换成其他任何值(null == 0为false)。
-
如果有一个操作数是 NaN,则相等操作符返回 false,而不相等操作符返回 true。重要提示:即使两个操作数都是 NaN,相等操作符也返回 false;因为按照规则, NaN 不等于 NaN。NaN!=r任何
记忆:
练习:
<script>
console.log("100"==100)//值相等,返回true 但是类型不相等 number string
console.log("100"===100) //返回false
//当比较对象时:
var obj={name:"karen"}
var obj2={name:"karen"}
console.log(obj==obj2)//返回false 引用数据比较时会看是否是同一个内存空间
//难点和很多企业的笔试题中最喜欢在选择题中考==的比较表(背)
var arr=[1,2,3,2]//arr.tostring()==> "1,2,3,2"
var b=""
console.log(arr==b) //false
var arr=[[]]//这个内存空间
var arr2=[]//这个另外一个内存空间
console.log(arr==arr2) //fasle
var a=2
var b="2"
console.log(a!=b) //false ==的结果取反
</script>
===和!==,只在两个操作数未经转换就相等的情况下返回 true。
注意:null == undefined 会返回 true,因为它们是规定;但 null === undefined 会返回 false,因为它们是不同类型的值。
2、in运算符
主要用于检查对象中是否有某成员。
<script>
对象在js中是一种键值对的集合: key:value key是字符串 value是数据/表达式
var obj={"name":"karen",age:24}
var re="name" in obj
console.log(re) //返回true
var obj={age:28}
console.log("toString" in obj) //返回true,在对象中包含自带的toString方法
var re=obj.toString()
console.log(re)//[object object]
</script>
3、instanceof运算符
检查左侧的对象是否是右侧类的实例,如果是返回true;
四、条件操作符(三目运算符)
expr1?A:B //expr1表达式会做布尔判定 判定的结果为true 就会执行表达式A 否则执行B
//整个三目运算表达式的结果 是A 或者B
<script>
var a=20;
var re=a<=18?20:{name:"karen"};
console.log(re) //返回{name: 'karen'}
function render(){
return isLogin?<User/>:</Login> //用于判断是否登录
}
</script>
五、赋值操作符
赋值操作符(=),就是把右侧的值赋给左侧的变量,不能是表达式,例如: a+b=c //错误
复合赋值操作符:
-
乘/赋值(*=); //例如a*=10 等价于a = a*10
-
除/赋值(/=);
-
模/赋值(%=);
-
加/赋值(+=);
-
减/赋值(-=);
六、逗号操作符
逗号运算符 多元运算符
使用逗号操作符可以在一条语句中执行多个操作。
<script>
var re=A,B,C,D,E,F //会把逗号隔开的表达式全部执行 最后一个运行的表达式的结果就是逗号运算符的结果
console.log(re) //返回F
</script>
可以声明多个变量。
<script>
var a,b,c,e=20;
//隐式操作 :
var a;var b;var c;var e=20
</script>
七、表达式计算
eval()可以解释运行由JavaScript源代码组成的字符串,并产生一个值。
eval()只有一个参数。如果传入的参数不是字符串,它直接返回这个参数。如果参数是字符串,它会把字符串当成JavaScript代码进行编译,如果编译失败者抛出一个语法错误异常。如果编译成功,则开始执行这一段代码,并返回字符串中的最后一个表达式会或语句的值,如果最后一个表达式或语句没有值,则最终返回undefifined。如果字符串抛出一个异常,这个异常将把该调用传递给eval()。