一丝一竹

导航

 
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("是否为数字:"+"&nbsp"+"&nbsp"+!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
        提示: 所有表达式都是从左向右依次执行,前++是先加后输出,后++是先输出后加
        如果前一个表达式修改了变量的值,则会影响后续表达式的执行。




posted on 2018-01-05 19:04  一丝一竹  阅读(201)  评论(0编辑  收藏  举报