day3

120 阅读5分钟

1.进制转换

10进制  0-9  最大值+1就是进制  
   0 1 2  3   4   5   6   7   8    9    10    11    12     13   14     15   16
   0 1 10 11 100 101 110 111 1000 1001 1010  1011  1100   1101  1110  1111 10000
十六 0 1 2  3   4   5   6   7   8    9    a     b     c      d      e     f    10
1.进制转换的几种计算方式 
  parseInt(字符串,进制) //就是该字符串当做(后面的什么进制)来转换成十进制!!!
  toString(进制) //可以将数值转换为对应的进制字符串 2-36(不能超出范围)

微信图片_20220601195922.jpg

进制补充

1.字母也可以转换二进制  (转成ASCII)
   1111 1111    8位2进制 0-255  1B
   英文字母 ASCII表中所有字符转换为2进制不超过255,所以就是1B
   GB2312  中文简体码表
   BIG5 大五码  繁体汉字
   Unicode编码 万国码

2.二进制运算符

1.& 与运算         或 |          异或 ^
   1&1=1         1|1=1          1^1=0
   1&0=0         1|0=1          0^1=1
   0&1=0         0|1=1          1^0=1
   0&0=0         0|0=0          0^0=0
所有的二进制运算符都受到长度限制超过2的30次幂以上数字不要使用2进制运算符

2.1.异或可用于加密

 1."aAZ".charCodeAt(第几位)  将字符串中第几位转换为Unicode编码  
 2.String.fromCharCode(Unicode编码)  将Unicode编码转换为字符
例:var str= String.fromCharCode("谢天".charCodeAt(0)^0xFFFF)+String.fromCharCode("谢天".charCodeAt(1)^0xFFFF)
   var str2= String.fromCharCode("珝ꛖ".charCodeAt(0)^0xFFFF)+String.fromCharCode("珝ꛖ".charCodeAt(1)^0xFFFF)
  console.log(str,str2)

2.2. ~运算 (位运算不处理小数的问题)

1. ~位非  加1取负 
例:var a=3;
   console.log(~a);//-4
2. ~~双位非 所有NaN双位非后都会变成0(常用)
例:var str="asdasd";
   在字符串中查找是否有s,并且返回s在第几位,从0开始
   str.indexOf("s"); //1
   如果没有查找到返回-1
   console.log(str.indexOf("z"));//-1
例:console.log(~~3.25);//3
   console.log(~~2.623123);//2

3.三目运算

1. if(a>3){
      b=2
   }else{
      b=5;
   }
  上述表达式有如下两种三目运算书写方式
  1.1 var b=a>3 ? 2 : 3;
  1.2 a>3 ? b=2 : c=3;   //此种方法没有var也就没有预解析
2. b=a>3 ? true : false;//不好
   如果三目运算符返回布尔值时 最好别用
例:  var b=a>3 ? false : true;
简写:var b=!(a>3);
例:var a=-1;
   var b=a+=1 ? 3 : 2;
   console.log(b,a);  //2 2  要记

4.条件语句 - if

1.条件分支语句 - if
    + 根据条件来决定是否执行某一段代码, 或者选择性执行某一段代码
  语法形式1: if 语句
    + 语法: if (条件) { 代码段 }
    + 意义: 如果条件为 true, 那 {} 内的代码执行, 否则不执行
    
  语法形式2: if else 语句
    + 语法: if (条件) { 代码 } else { 代码 }
    + 意义: 如果条件为 true, 执行 if 后面的 {}, 否则执行 else 后面的 {}
    + 两个大括号能且只能执行一个
    
  语法形式3: if else if 语句
    + 语法: if (条件1) { 代码 } else if (条件2) { 代码 } ...
    + 意义: 从第一个条件开始判断, 哪一个条件满足了, 执行哪一个条件后面的 {}
           前面的条件满足了, 后面的就都不管了
    + 多个 {} 最多只能执行一个
    
  语法形式4: if else if else 语句
    + 语法: if (条件1) { 代码 } else if (条件2) { 代码 } ... else { 代码 }
    + 意义: 从第一个条件开始判断, 哪一个条件满足了, 执行哪一个条件后面的 {}
           当所有条件都不满足的时候, 执行 else 后面的 {} 内的代码
           前面的条件满足了, 后面的就都不管了
    + 多个 {} 能且只能执行一个

4.1 - if补充

1.表达式,不管是什么表达式,都会隐式转换为布尔值
 例:
    ar arr=[3];
    if(arr>2){   //true
       console.log("aa")
    }
    
    var a="b";
    if(a>"a"){  //true
       console.log("aa")
    }
    
2.当表达式中有用,分割的多个语句时,最后一个语句才是判断条件
 例:var a=1;
    if(++a,a>=2){    //a>=2才是判断条件
    console.log("aa");
    }
    
3.条件省略这里代表直接进入条件
 例:if(1){}
    if(true){}
    
4.条件语句块省略{}当条件语句只有一句语句时。可以省略{}
 例:if(a>2) b=3;
 
5. ; 和 , 的区别(细节)
 例:if(a>2)         if(a>2);
    b=3;            b=3;
 上述两个是有区别的:加 ; 表示条件语句结束 加 , 连接下面语句
 例:var a=-1;
    var b;
    if(a>0)
    a=3;
    b=2;//b=2并不是条件语句中的内容 结果为:a=-1 b=2
    
6.多分支条件结构和多条件结构是不同(代码优化)
 例:var a=4;                         if(a>3){
    if(a>3){                         console.log("aa")
    console.log("aa")                 }
     }else if(a<0){                  if(a<0){
    console.log("bb")                console.log("bb")
     }else{                           }
    console.log("cc")                if(a>=0 && a<=3){
     }                               console.log("cc")   }
  第二种比第一种判断次数更多不好 第一种满足一个条件就不执行下面了但是第二种每次都要执行所有
  
补: if(!a){}   //能进入此的六种  ""   0    NaN   false   undefined  null 转换为布尔值均为false
    if(a==false){}   //能进入此的 false 0 ""
    if(a===false){} //能进入此的 false
    if(a==2){}  //能进入此的 2 "2" [2]
    if(a===2){}  //能进入此的 2

5.条件语句 - switch

1.条件分支语句 - switch
    + switchif 都是条件分支语句
    + if 一般作为范围型的判断
      => switch 一般作为准确值的判断
  基础语法:
    switch (要判断的内容) {
      case 情况1:
        满足情况1 的时候执行的代码
        break
      case 情况2:
        满足情况2 的时候执行的代码
        break
      default:
        所有情况都不满足的时候执行的代码
    }
    
  注意:
    1. 判断的变量 必须 和 case 是 值和数据类型都一样, 才叫做满足条件
    2. 一般不作范围性的判断
    3. default 可以不写, 不写的时候, 那么所有条件都不满足就没有代码执行
    4. break 需要书写
      => 如果不写 break 会发生 break 穿透效果
      
  穿透效果:  (如果没有使用break 叫做穿越。故意制造穿越,以解决必须多个条件中每个都必须要执行的语句内容)
    + 从满足条件的 case 开始执行
    + 下一个 case 不管是否满足, 都会执行代码
    + 直到遇到 break 或者 switch 结束为止

补充

1. 1、去除魔术字符串
如果使用Symbol并且设置为常量,当赋值时只能赋值这个常量,给其他字符串不能进入减少在使用字符串设置值时,碰巧得到相同字符串而进入条件情况
   2、状态机管理
状态管理有效的解决条件变化时的冲突问题,因为在不同时期条件的结果会有所交叉
  setInterval(function(){
         switch(state){
             case RIGHT:
                 x++;
                 if(x===200) state=BOTTOM;
                 break;
             case LEFT:
                 x--;
                 if(x===0) state=TOP;
                 break;
             case TOP:
                 y--;
                 if(y===0) state=RIGHT;
                 break;
             case BOTTOM:
                 y++;
                 if(y===200) state=LEFT;
                 break;
         }                        //类似上述这种会相互冲突的交叉操作