1.算数运算: +,-,*,/,%
隐式转换:默认都转number,然后进行运算;
**特殊: 在+运算中,碰到字符串,都转字符串,+运算变为字符串拼接。
2.舍入误差: 计算机中,也有计算不尽的数值
eg:
var n=2,m=1.6;
var z=n-m;
console.log(z);//0.39999999
var z=z.toFixed(2);
console.log(z);//0.4
**如何解决:
1. 按指定位数四舍五入: n.toFixed(2)
今后几乎所有显示钱数的地方都要toFixed(2)
2. 存储: 保存很长位数的小数: 0.39999999
3.关系运算: > < >= <= == !=
返回值: bool
隐式转换:默认都转number,然后进行比较运算
**特殊:
1."两个值"都是字符串, 则不再转数字,而是依次比较每个字符的unicode号
2.判断NaN:--->用于判断值是否为数字
NaN和任何值做> < >= <= == 5种比较时=======>永远false
NaN和任何值做!=比较时=========>永远是true
**问题:NaN==NaN =>false 用普通的==无法判断NaN
解决: 使用函数isNaN(num) 专门代替==,用来判断num是不是NaN
eg:
var str="hello";
var n=parseFloat(str);
//console.log(n==NaN);//false ---->不能使用此种方法
console.log(isNaN(n));//true
何时: 只要判断是不是NaN,都用isNaN(num)
反用: 判断一个值是不是数字: !isNaN(num)
eg:
var n=prompt("请输入一个值");
n=parseFloat(n);
document.write("是否为数字:"+" "+" "+!isNaN(n));
3. 区分null和undefined
问题:==比较时,会自动将undefined隐式转为null
null==undefined --------> null=null
解决: === 全等(类型必须先相同,值再相等)
其实===就是不带隐式转换的==
4.逻辑运算: 将多个关系运算,综合起来得到最终结论
1.包括: &&而且 ||或(要么) !不(没有)
1.条件1&&条件2...:
要求所有条件都为true,结果为true
只要一个条件为false,结果为false
2.条件1||条件2...:
只要一个条件为true,结果为true
除非所有条件都为false,结果才为false
3.!条件: 颠倒条件的判断结果
**隐式转换: 默认将每个条件都转为bool类型
*****短路逻辑: 如果前一个条件已经可以得出最终结论,则后续条件不再执行。
&&: 只要前一个条件为false时,后续条件都不执行,整个结果为false。
||: 只要前一个条件为true时,后续条件都不再执行,整个结果为true。
*****利用短路:
1. 简单分支结构: 1个条件,1件事,只有满足才做
如何: 条件&&(操作)----->只有条件满足为true,才可以执行后续操作,且因为存在运算符优先级问题,最好将操作用()括起来
eg:
var price=parseFloat(prompt("输入单价"));
var count=parseInt(prompt("输入数量"));
var money=parseFloat(prompt("输入金额"));
var total=price*count;
total>=500&&(total=total*0.8);
var change=money-total;
document.write("应收"+total+"<br>"+"找零"+change);
*****运算符优先级问题:优先级高的运算先计算,参考相册里operator.jpg
2.实现默认值/备用值:
如何:值1||值2
如果值1可以转为true,就选择值1使用;
如果值1不能转为true,就选择值2使用。
eg:
var comment=prompt("输入评价:");
comment=comment||"此人很懒,什么都没留下";
document.write("评价:"+comment);
5.位运算:
1. 左移/右移:
1<<3=8 1左移3位 相当于1*2的3次方 代替/简化1*Math.pow(2,3);
2<<3=2*2的3次方=16
8>>3=1 8右移3位 相当于8/2的3次方
2. 取整:
n^0 n|0 n>>>0 代替/简化Math.floor(n)
3. 交换两变量的值:
var a=3,b=5;
方法一: var t=b; b=a; a=t;
方法二: a+=b; b=a-b; a=a-b;
方法三: a^=b; b^=a; a^=b;
方法四:a=[b,b=a][0];
6.赋值运算:
扩展赋值运算: 对特殊赋值运算的简写:
a=a+b 将a的值+b的值,再存回a中,将b的值累加到a上,可简写为a+=b;
a=a-b -> a-=b;
a=a*b -> a*=b;
a=a/b -> a/=b;
a=a%b -> a%=b;
**更简化: 递增递减运算: 如果每次累加1/累减1
a+=1 -> a++
a-=1 -> a--
*****前++和后++:
1. 如果单独使用, 前后都一样
2. 如果参与到其他表达式中时:
相同: 变量中的值一定都会+1
不同: 前++,返回+1后的新值
后++,返回未+1的旧值
******注意:for循环,i=0,初始值++,再循环会跳过
eg:
var n=3;
console.log(n++ + ++n + n++);
// 3 5 5
//console.log(++n + n++ + ++n);
// 4 4 6
console.log(n);//6
提示: 所有表达式都是从左向右依次执行,前++是先加后输出,后++是先输出后加
如果前一个表达式修改了变量的值,则会影响后续表达式的执行。