一般在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");