js运算符:
- typeof 求变量类型
- + - * / 加减乘除
- % 求模
★任何值(除字符串)做运算均转换为number;
★字符串除加法运算外,均转换为number - 字符串转换时如果含有非数字,则转换为NaN。
例如:
var t=ture+1;//t=2
var t=NaN+1;//t=NaN
var t=null+1;//null转换为0,所以t=1
var a="100"-"100";//0
var a="a123"-99;//"a123"转换为NaN,NaN-99=NaN,所以最终结果是NaN
var a="111"-null;//111
var a="100"-NaN;//NaN
字符串的加法运算:任何值和字符串做加法运算,均转换为字符串然后拼接。
(截图自JS讲座https://www.bilibili.com/video/av34087791/?p=15)
例如:
var a="123"+"456";//a为“123456”
var a=123+“123”;//a为“123123”
var a=1+2+"3";//一:1+2=3、二:3+"3"="33" 所以最后结果是"33"
var a="1"+2+3;//一:"1"+2="12"、二:"12"+3="123" 所以最后结果是"123"
var a="100"+NaN;//结果是"100NaN"
var a="100"+null;//结果是"100null"
一元运算符
+ 正号 - 负号
(截图自js讲座https://www.bilibili.com/video/av34087791/?p=16)
以下演示使用一元运算符直接转换为数字的例子:
var a="18";
a = +a;//a=18
var a = 1 + "2" + 3;//a="123"
//上下对比。下方加入+号直接转换为数字
var a = 1 + +"2" + 3;//a=1+2+3=6
++自增运算符、--自减运算符
以下是后置自增/自减运算符与前置自增/自减运算符的区别:使用后置运算符该表达式值不变,自变量随后自增/自减
自减--和自增++运算规律一样,只不过是加1变成了减1
var a=1;
console.log(a++);//使用后置运算符表达式原值不变,输出1
console.log(a);//自变量已自增,输出2
var b=1;
console.log(++b);//使用前置运算符表达式立即自增,输出2
console.log(b);//自变量已自增,输出2
以下例子考验读者是否掌握前置自增与后置自增。不过编程请避免使用这种易出错的风格。
逻辑运算符
与&& 或|| 非!
var a=10;//
a=!!a;//a=true 因为非(0和NaN)为真
var a="hello";
a=!!a;//a=true 因为除了空串都是真
var a="";
a=!!a;//a=false.因为除了空串都是真
&&与:只要有1个为false就返回false。注意有短路效应
例如:
false && alert("与逻辑短路效应演示");//遇见false直接短路跳出,表达式整体值为false
||或:只要有1个为true就返回true。注意有短路效应
例如:
true || alert("或逻辑短路效应演示");//遇见true直接短路跳出,表达式整体值为true
非布尔值的与或非运算
对于非布尔值,先转成布尔值,再进行运算,再返回原值
★与运算:
如果第一个值为true,短路直接返回第二个值(不再判断第二个值)。
如果第一个值为false,短路直接返回第一个值(不再判断第二个值)。
例如:
var a= 1 && 100;//第一个值为true,短路直接返回第二个数(无论该数真或假)。a=100
var a = 100 && 0;//第一个值为true,短路直接返回第二个数.最终a=0
var a = 0 && NaN;//返回第一个false代表的数值0.则a=0
var a = NaN && 0;//返回第一个false代表的数值NaN.则a=NaN
★或运算:
如果第一个值为true,短路直接返回第一个值(不再判断第二个值);
如果第一个值为false,短路直接返回第二个值(不再判断第二个值)。
例如:
var a="hello" || 100;//返回第一个ture代表的值。则a="hello"
var a="" || "你好";//第一个为false,直接返回第二个值。则a="你好"
如上图,这是与或逻辑短路效应的体现
关系运算符
数值间关系运算:
如上图,以上是判断数值间关系运算规律。和数学规律是一样的,不赘述。
非数值间的关系运算
如果两边只有1个或没有字符串,非数值会转换成数值再比较。
- 转换规律:true为1,false为0,数字字符串会转成数字(如“123”会转成数字123),非数字字符串会转成NaN(例如“张三”转成NaN)。注意:任何值和NaN比较都是fasle
例如:1>"张三"; 1<"张三";1<="张三";//因为“张三”会转成NaN,NaN和任何值比较都是false。所以这些表达式结果都是false
【如果关系运算符两边都是字符串】则按字符串Unicode比较(例如"a"<"b"为true)且是一位一位字符串比较。
提醒:比较英文字符串可以按字母表顺序比大小,比较中文字符串无意义。因为Unicode中文编码似乎是按康熙字典排序,康熙字典是按规定部首排序(好像还是有点意义吧,可惜不能按拼音排序)。
- 注意:如果是两个数字型字符串比较,一定一定一定要将数值型字符串转换成字符串!!!切记!简单加个正号+即可。
例如:"123"< "5"两个字符串比大小会产生不可预测的后果!请转数值型!可写成 + "123" < + "5"即可。
-
Unicode编码
在JS中使用\u后跟4位16进制可表达Unicode字符。例如:"\u0041"为字符"A"。(0041是16进制)
在html中使用&#后跟十进制编码即可表达Unicode字符.例如:A为字符"A".(65是10进制)
-
相等运算符
注意不同类型的数据比较可能会出现不可预测的后果。谨慎操作!
不同类型间的比较,规律如下表(引自https://www.cnblogs.com/alway-july/p/6557890.html 表未验证)
类型 | 类型 | 规律 | 其它说明 |
对象 | 对象 | 比较是不是同一个内存地址 |
|
对象 | 字符串 | 对象先转化为字符串,然后做比较 |
|
对象 | 布尔类型 | 两边都要先转为数字(false是0,true是1)。是对象类型先隐式调用toString方法,然后再Number() | alert([2]==true)未false,转为2==1 false |
对象 | 数字 | 对象要转为数字,再进行比较(对象先隐式调用toString方法转化为字符串,然后再把这个字符串轮化为数字,相当于把这个字符串放到Number这个方法中) |
|
数字 | 布尔 | 是进行的数字的比较 |
|
数字 | 字符串 | 把字符串转化为数,再比较 |
|
布尔 |
| 把两边都要转化为数字再进行比较 |
|
null | undefined | true |
|
null,undefined | 和其它类型 | null和undefined和其它类型比较都是false(这两个对象没toString方法),和自身比较是true。 |
(undefined==undefined); true |
NaN | 和其它类型 | 和所有比较都为false,和自身比较也为fasle,判断是否为NaN使用isNaN() | (NaN==NaN) false |
自身做布尔运算的时候的转换
类型 | 规律 | 示例 |
object | 都是true | alert(!![]) |
number | 只是0和NaN是false | alert(!!0); |
string | 只有空字符串是false(不是空格字符串) | alert(!!""); |
function | 都是ture |
|
null,undefined | 都是false |
|
如果要判断一个数是不是NaN,可以用isNaN(参数)来判断
-
全等===:值和类型均相等
-
不全等!==:值和类型有一个不相等,或两个都不相等
例如:
123 == "123";//true
123 === "123";//false
123 === 123;//true
总结:下表为比较运算符的简要总结和实例。(来自http://www.runoob.com/js/js-comparisons.html)
假设x=5,下面的表格解释了比较运算符:
运算符 | 描述 | 比较 | 返回值 | 实例 |
---|---|---|---|---|
== | 等于 | x==8 | false | 实例 » |
x==5 | true | 实例 » | ||
=== | 绝对等于(值和类型均相等) | x==="5" | false | 实例 » |
x===5 | true | 实例 » | ||
!= | 不等于 | x!=8 | true | 实例 » |
!== | 不绝对等于(值和类型有一个不相等,或两个都不相等) | x!=="5" | true | 实例 » |
x!==5 | false | 实例 » | ||
> | 大于 | x>8 | false | 实例 » |
< | 小于 | x<8 | true | 实例 » |
>= | 大于或等于 | x>=8 | false | 实例 » |
<= | 小于或等于 | x<=8 | true | 实例 » |
三元运算符
语法:条件表达式?语句1:语句2;
例如下图max获取a与b中最大值。
下图是求3个数中最大数。不推荐这种不易阅读的编程风格。
下例给出是非布尔值表达式的例子
"hello" ? alert("1") : alert("2");//字符串转换为布尔值真,执行alert("1")
"" ? alert("1") : alert("2");//空字符串转换为布尔值假,执行alert("2")
逗号运算符
运算符优先级
表详见https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Operator_Precedence
如果不清楚优先级,也无需记忆,使用括号即可。例如下图不清楚优先级,使用括号获得需要的运算顺序
代码块
注意:代码块只具有分组功能,无其他功能。【这是和其他编程语言不同的!!!切记!】