JavaScript基础02(运算符优先级及流程控制语句)

一、位运算

一般在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++
//不管條件是否滿足,至少執行一次語句

5.for循環

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"); 

 

原文地址:https://www.cnblogs.com/ananasfleisch/p/13275529.html