算数运算符
-
运算符可以对一个或多个值进行运算,并获取结果
-
typeof 就是运算符,获得一个值的类型,它会将给值的类型以字符串的形式返回
var a = 123;
var result = typeof a;
console.log(typeof result);//输出string;
算数运算符:
- 非Number运算,会先转换成Number再运算(true->1,null->0)
- 任何值和NaN做运算,结果都是NaN
- 两个字符串做加法,则会做拼接
- 任何值和字符串做加法,先转成字符串然后相加(拼接),利用这个特点,只需将任意数据类型+一个""即可将其转换为String,这是一种隐式类型转换,由浏览器自动完成,实际上也是调用了String()
- 除了加法,其余运算都会先转换成Number
+ 加
- 减
* 乘
/ 除
% 模(余数)
较长字符串,可以用加号换行拼接:
var str="锄禾日当午,"+
"汗滴禾下土,"+
"谁知盘中餐,"+
"粒粒皆辛苦";
一元运算符
之前讲的是二元运算符,
- 正号不变
- 负号取反
- 对非Number值,先转成Number,可以对一个其他的数据类型使用+,转换成Number
var a = 123;
a = +a;//正号不变
a = -a;//取反
自增和自减
-
自增可以使变量在自身的基础上增加1
-
变量自增以后,原变量的值会立即自增1
-
自增两种:后++(a++)和前++(++a),无论是a++,还是++a,都会立即使原变量的值自增1,不同的是a++ 和++a的值不同:
-
a++的值等于原变量的值(自增前的值);++a的值等于原变量的新值(自增后的值)
var a = 1;
a++//自增1
var c = 10;
//第一次c++,是在10的基础上自增
c++;
//第二次c++,是在11的基础上自增
c++;
console.log(c++);//12
var d = 20;
console.log(++d);//21
console.log(++d);//22
var d = 20;
var result = d++ + ++d + d;//64
// 20 + 22 + 22
- 自减两种:后–(a–)和前–(a–),都会立即使原变量的值自减1,不同的是a–和--a的值不同
- a–是原变量的值;–a的值是原变量的新值
var n1 = 10, n2 = 20;
var n = n1++;//n1 = 11 n1++ = 10
console.log('n='+n);//10
console.log('n1='+n1);//11
n = ++n1//n1 = 12 ++n1 = 12
console.log('n='+n);//12
console.log('n1='+n1);//12
n = n2--;//n2 = 19 n2-- = 20
console.log('n='+n);//20
console.log('n2='+n2);//19
n = --n2;//n2 = 18 --n2 = 18
console.log('n='+n);//18
console.log('n2='+n2);//18
//一定要搞清楚原值是多少,在谁的基础上运算
逻辑运算符
三种逻辑运算符:
! 非 取反操作 //true->false false->true
&& 与
|| 或
var a = true;
a = !a;
console.log(a)//false;
var b = 10;
b = !b;
console.log("b="+b);//b=false
console.log(typeof b);//boolean
!非:
- 对一个值两次取反,不会变化
- 对非布尔值运算,则会将其先转换为布尔值,然后取反,可以为一个任意数据类型取两次反,将其转换为布尔值类型
&& 与:
- 两个值只要有一个为false,就会返回false
- 短路“与”:只要第一个值false,不会检查第二个值
var result=true&&true;
console.log(result)//true
var result=true&&false;//false
var result=false&&true;//false
var result=false&&false;//false
||或:
- 两个值只要有一个true,就返回true
- 两个值都为false,才返回false
var result=true&&true;
console.log(result)//true
var result=true&&false;//true
var result=false&&true;//true
var result=false&&false;//false
非布尔值的逻辑运算
与运算:
- 非布尔值的运算,会先转换为布尔值,然后再运算,并且返回原值(即不回返回 true或者 false)
- 如果两个值都为true,返回后边的数
- 如果两个值有false,返回靠前的false
- 以上规则符合断路情况
- 如果第一个值为 true,则返回第二个值
- 如果第一个值为false,则返回第一个值
- 与运算找false
var result=1 && 2;
console.log(result);//2(第二个值)
var result=0 && 2;
console.log(result);//0
var result=NaN && 0;
console.log(result);//NaN(第一个值)
与此相反:
或运算:
- 如果第一个值为true,则直接返回第一个值
- 如果第一个值为false,则直接返回第二个值
- 或运算找true
赋值运算符
=:
- 可以将等号右侧的值赋值给左侧的变量
+=:
-=:
*=:
/=:
%=:
a=a+5;
a+=5;//两者等价
关系运算符
- 通过关系运算符比较两个值的大小关系
- 成立返回true
- 不成立返回false
>;
<;
>=;
<=;
var result=5>10;
console.log(result);//false
非数值情况:
- 非数值比较,先转换成数字再比较
- 任何值和NaN比较,都是false
- 符号两侧都是字符串,不会将其转化为数字,分别比较字符Unicode字符编码
- 比较字符编码是一位一位进行比较;两位相同,则比较下一位,所以借用这个对英文排序,比较中文没有意义
- 如果比较两个字符串型数字,可能得到不可预测的结果,注意比较两个字符串的数字,一定要转型
console.log(1>=true);//false
console.log(1>"0");//true
console.log(10>null);//true
console.log(10>"hello");//true
console.log(true>false);//true 1>0
console.log("11"<"5");//true 都是字符串,比较Unicode编码
console.log("abc"<"b")//true
Unicode编码表
网页中使用Unicode编码,&#编码;编码需要十进制
<h1 style="font-size":200px;>☠</h1>
<!--要转换为十进制>
console.log("\u2620");//骷髅头☠️
相等运算符
- 比较两个值是否相等;相等返回true,不相等返回false
- 当使用==比较两个值,值类型同,会自动类型转换
- Undefined 衍生自null,所以这两个值做相等判断时,会返回
- 可以通过 isNaN()函数,判断一个值是否是NaN, 是返回true,不是返回false
- != 来做不相等运算
- var a = 123;
a = Boolean(a);
console.log(typeof(a));//输出 true - === 全等,不做类型转换
- !==不全等
console.log(1==1);//true
var a==10;
console.log(a==4);//false
console.log("1"==1);//true
console.log(true=="1");//true
console.log(null==0);//false
console.log(undefined==null);
console.log(NaN==NaN);//NaN 不和任何值相等,包括他本身
var b=NaN;
console.log(isNaN(b));//true
console.log(10!=5);//true
console.log(10!=10);//false
console.log("123"===123);//false
console.log(1!==1);//true
条件运算符(三元运算符)
?:
条件表达式:?语句1:语句2;
- 条件运算符在执行时,首先对条件表达式进行求值:如果位true,执行语句1;如果为false,执行语句2
- 有返回值
- 条件运算是非布尔值,先转换
true?alert("语句1"):alert("语句2");
a>b?alert("a大"):alert("b大");
//获取a b中最大值
var max=a>b?a:b;
console.log(max);//谁大返回谁
//获取 a b c 中最大值
var max>c?max:c;
//嵌套比较
var max=a>b?(a>c?a:c):(b>c?b:c);
console.log(max);//写法不推荐,不易阅读
运算符优先级
- , 运算符,可以分割多个语句,声明多个变量时使用
var a=1, b=2, c=3;
alert(b);
- 和数学一样,JS也有运算优先级
- 如果遇到优先级不确定,用()
var result=1 || 2 && 3;
console.log(result);//1
- 语句按照从上倒下一条一条执行,JS可以用{}来分组,同一个{}中的语句,为一组,要么执行要么不执行,一个{}叫做一个代码块
- 代码块内部的在外部可见
- 代码块后面不用写;
{
var a=10
alert("hello")
console.log("你好")
document.write("语句")
}