一般在c++等编译型代码中使用可以大大地提高效率,js是解释型语言,使用位运算的主要原因是:代码不易于人看到,用于专项的处理内容
1.位与&
console.log(25&34);//0 //011001 //100010 //000000 console.log(6&7);//6 任何数与2^n-1位与等于这个数本身 console.log(37&7);//5
2.位或|
//1|1=1 0|1=1 1|0=1 0|0=0 //6|7=7 console.log(25|34);//59 //011001 //100010 //111011=59
3.异或^
console.log(6^7);//1 //110 //111 //001 console.log(0^0); //0相同为0,不同为1 //异或处理一般用于加密解密 //左边是原密码,右边是钥匙,得出的是加密后的密码 console.log(3627^1234);//2809 console.log(2809^1234);//3627
4.位非~
//与二进制没有关系,加一取负 //~1=-2 //~10=-11 //~-5=4 var str= "abcdef"; console.log(str.indexOf("d"));//3 console.log(str.indexOf("g"));//没找到,返回-1 //可以判断该字符串是否有某个字符 if(~str.indexOf('g')){ 为false //不能进入 } if(!~str.indexOf('g')){ 为false //能进入 }
5.左移位运算<<
var a=3; a<<=2; console.log(a);//12 var a=1; for(var i=0;i<5;i++){ a<<=1; console.log(a);//2 4 8 16 32 }
6.右移位运算>>
var a=5; a>>=1; console.log(a);//2
二、三目运算
var a=3>2?1:0; //判断条件是否成立,如果成立返回第一个值 //问号前面的内容会自动隐式转换成布尔值 //三目运算符比赋值运算优先级高 //当需要返回的是布尔值时,不要使用三目运算符 var a=3>2?true:false;//改成 var a=3>2; console.log(a);//1 var a=1; a=--a?a++:++a; console.log(a);//1 var a=2;//3,4,5 b=a-= 1?a++:++a;//赋值优先级比三目运算符还低 console.log(b);//都为0 var a=2; c=(a-=1)?a++:++a; console.log(c);//1 var div0=document.getElementById("div0"); var lables=document.getElementById("lables"); div0.onclick=function(){ lables.style.color=div0.checked ? "red" :"green"; }
三、运算符优先级
. [] () 字段访问、数组下标、函数调用以及表达式分组
++ -- - ~ ! delete new typeof void 一元运算符、返回数据类型、对象创建、未定义值
*/ % 乘法、除法、取模
+、-、+加法、减法、字符串连接
<< >> >>> 移位
< <= > >= instanceof 小于、小于等于、大于、大于等于、instanceof
== != === !== 等于、不等于、严格相等、非严格相等
& 按位与
^ 按位异或
| 按位或
&& 逻辑与
|| 逻辑或
? : 条件
= oP= 赋值、运算赋值
, 多重求值
四、流程控制语句
1.if语句
var a=1; if(a*=10){ console.log(a); } //在这里,条件不管什么表达式都会被隐式转换成布尔值 //!在条件语句中大量用!配合使用 if(条件){ //如果条件表达式运算后隐式转换为布尔值是true,进入该条件 } if(条件){ }else{ // 条件隐式转换为布尔值为false时进入 } if(条件1){ }else if(条件2){ }else if(条件3){ }else{ } // 这种仅执行其中一个条件结果 if(条件1){ } if(条件2){ } if(条件3){ } // 每个条件都会判断,根据判断结果执行对应的内容 var x,y; if(x<0) x=0; if(x+50>500) x=500-50; if(y<0) y=0; if(y+50>500) y=500-50;
2.多分支结构语句
switch(表达式){ case 值1: // 当表达式绝对等于值1时执行这里的内容 // break跳出,如果不写break不判断值2是否相等,直接穿越 break; case 值2: // 当表达式绝对等于值2时执行这里的内容 break; case 值3: // 当表达式绝对等于值3时执行这里的内容 break; case 值4: // 当表达式绝对等于值4时执行这里的内容 break; default: // 默认以上条件都不满足时执行这里 } var a=1; switch(a){ case 1: console.log("AAA"); break; case 2: console.log("BBB"); break; default: console.log("CCC"); } // 状态机 var status=""; const RUN="run"; const WALK="walk"; const JUMP="jump"; const FIRE="fire"; status=RUN; switch(status){ case RUN: console.log("跑步动画") break; case WALK: console.log("走路动画") break; case JUMP: console.log("跳跃动画") break; case FIRE: console.log("开火动画") break; default: } var score=prompt("请输入你的成绩"); switch(parseInt(score/10)){ case 9: console.log("优秀"); break; case 8: console.log("良好"); break; case 7: console.log("一般"); break; } switch(true){ case score>=90 && score<=100: console.log("优秀"); break; case score>=80: break; case score>=70: break; case score>=60: break; default: }
3.while循环
var i=-1; // 条件表达式都是将结果转换为布尔值 while(i++<9) document.write("<div>"+i+"</div>"); var i=0,sum=0; while(i++<100) sum+=i; console.log(sum);//5050 // 打印十行十列星星 var j=0,i; while(j++<10){ i=0; while(i++<10) document.write("*"); document.write("<br>"); } // 打印列表 var j = 0, i; document.write("<ul>"); while (j++ < 10) { i = 0; document.write("<li>第" + j + "章<ul>"); while (i++ < 10) document.write("<li>第" + i + "节</li>"); document.write("</ul></li>"); } document.write("</ul>"); // 打印三角形 var j = 0, row=10, col=20, i,n; while (j++ < row) { n = 0; while (n++ < row-j) document.write(" "); i = 0; while (i++ < j*2-1) document.write("*"); document.write("<br>"); } // 打印表格 var col = 9, row = 9, i = 0, j = 0; document.write("<table>"); while (j++ < row) { i = 0; document.write("<tr>"); while (i++ < j) document.write("<td>" +j+"*"+i+"="+j*i + "</td>"); document.write("</tr>"); } document.write("</table>"); // break; 跳出 var i=0; while(true){ if(i>50) break; console.log(i); i++; } // 求0-100所有质数 var j = 1,i=2,bool=true; while (j++ < 100) { i = 2; bool = true; while (i < j) { if (j % i === 0) { bool = false; break; } i++; } if (bool) console.log(j); } var i=0; var j=0; // 循环前增加id: xietian:while(i++<10){ j=0; while(j++<10){ // break 跳出到指定的id位置 if(i*j>50) break xietian; } } console.log(i,j); var i = 1, j = 0, n = 0; abc: while (j < 10) { n = 0; while (n < 10) { if (i * i * i + j * j * j + n * n * n === i * 100 + j * 10 + n) break abc; n++; } j++; } console.log(i * 100 + j * 10 + n); // continue 继续 遇到满足条件的跳到下一次循环继续向后,当前continue后面的语句不执行 var i=0; var sum=0; while(i++<10){ if(i===5) continue; sum+=i; } console.log(sum); // console.log("azAZ09".charCodeAt(5)); // a 97 // z 122 // A 65 // Z 90 //0 48 //9 57 // console.log(String.fromCharCode(97)); // 当整个循环中遇到阶段性不需要执行的内容可以使用continue var i=47; var str=""; while(i++<122){ if(i>57 && i<65) continue; if(i>90 && i<97) continue; str+=String.fromCharCode(i); } console.log(str); // 广度遍历,深度遍历 var obj = { value: 1, link: { value: 2, link: { value: 3, link: { value: 4, link: { value: 5, link: { value: 6, link: { value: 7, link: {}, }, }, }, }, }, }, }; while(obj.link){ console.log(obj.value); obj=obj.link; } var obj={ value:1, a:{ value:2, b:{ value:3, c:{ value:4, d:{ value:5, e:{ value:6, f:{ value:7, g:{} } } } } } } } var arr=["a","b","c","d","e","f","g"]; var i=0; var s=arr[0]; while(obj[s]){ console.log(obj.value); obj=obj[s]; i++; s=arr[i]; } var tree={ left:{ value:1, left:{ }, right:{ } }, right:{ value:2, left:{ }, right:{ } } }
4.do while
var i=0; do{ document.write("<div>"+i+"</div>"); }while(i++<10);//0到10的div,因爲先執行后判斷 var i=0; do{ document.write("<div>"+i+"</div>"); i++; }while(i<10);//0~9 var i=0; do{ document.write("<div>"+i+"</div>"); }while(++i<10);//0~9 //do while使用++i在條件裏,while使用i++ //不管條件是否滿足,至少執行一次語句
var sum=0; // for(循环需要变量的初始值;循环的条件(当满足条件时执行语句块);变量不断向条件外变化) // 1、循环需要变量的初始值仅执行一次,并且不一定需要使用var // 2、循环的条件是一个表达式,隐式转换为布尔值,为真时进入语句块,根据循环次数判断多少次 // 3、变量不断向条件外变化(这个理解比较片面)。每次循环完成后执行的语句内容 for(var i=0;i<100;i++){ sum+=i; } console.log(sum); var j;//放在上面定義 for(var i=0;i<100;i++){ for(j=0;j<100;j++){ } } //循環條件的表達式隱式轉換為布爾值,爲真則進入循環 //每次循環完成后執行的語句内容 for(var i=0,sum=0;i++<100;sum+=i) console.log(sum); var i=0; while(i<100){ if(i===50)continue; console.log(i); i++;//在使用continue時必須放在continue前,這樣會產生問題,因爲先加了一,使用for循環時不會出現這樣的死循環的現象 } for的死循環 for(;;){ } for(;obj.link;obj=obj.link)console.log(obj.value);//使用for循環實現對象的深遍歷 //0-100的質數 for(var i=2,j,bool;i<100;i++){ for(j=2,bool=true;j<i;j++){ if(i%j===0){ bool=false; break; } } if(bool)console.log(i); } //打印表格 var row=10; var col=10; var str="<table>"; for(var i=0,j;i<row;i++){ str+="<tr>"; for(j=0;j<col;j++){ str+="<td></td>"; } str+="</tr>"; } str+="</table>"; document.body.innerHTML=str; //打印水仙花數 for(var i=100,a,b,c;i<1000;i++){ a=parseInt(i/100); b=parseInt(i/10)%10; c=i%10; if(a*a*a+b*b*b+c*c*c===i)console.log(i); } //字符串倒裝 var str="ljshdjdafhklwqjx cnkds"; //str.length str[5] var s=""; for(var i=str.length-1;i>=0;i--){ s+=str[i]; } console.log(s); //for循環中的break for(var i=0;i<10;i++){ if(i===3)continue; if(i===5)break; } tag:for(var i=0,j;i<10;i++){ for(j=0;j<10;j++){ if(i*j>50)break tag; } } //注意:儅進行反向循環時,條件注意=的問題 //在雙重循環時,不要在内層中判斷外層變量或者改變外層變量 //如果使用break時,不寫跳出label,它僅跳出當前循環 //循環是同步的,是同時的,在一個時間内瞬間一起運行 //循環不能次數超過十億 //循環不能嵌套太多 console.log("a"); for(var i=0;i<1000000000;i++){ } console.log("b"); for(var i=0;i<10000;i++){ for(var j=0;j<10000;j++){ } } console.log("b");