一、位运算
位运算符
~ 位非运算符
~-1==0
& 位与运算符
1&2=0
| 位或运算符
1|2=3
^ 位异或运算符
1^2=3 相同位0,不同为1
<< 左移位运算符
1<<4=16
>> 右移位运算符
1.位与运算符 &
1&1=1 1&0=0 0&1=0 0&0=0
例:25&34
25转换为二进制为:011001
34转换为二进制为:100010
位运算后为:000000
即:25&34=0
2.位或运算符 |
1|1=1 0|1=1 1|0=1 0|0=0
例:25|34
25转换为二进制为:011001
34转换为二进制为:100010
位运算后为:111011
即:25&34=59
3.位异或运算符 ^
0^0=0 1^1=0 0^1=1 1^0=1
4.位非运算符 ~
加1取负数
二、条件运算符(三目运算符)
variable = boolean_expression ? true_value : false_value;
?前通过转换为布尔值判断条件是否成立,如果条件成立返回第一个值,否则返回:后第二个值。即如果表达式的结果转换为布尔值为真时,返回问号后面的值,否则返回冒号后面的值。问号前面的内容会自动隐式转换为布尔值
例:
var a=10;
var a=a-=1 ? a++ : ++a;
console.log(a);//0
由于三目运算符优先级高于赋值运算符,所以优先计算“1 ? a++ : ++a”,数值1转换为布尔值为true,因而三目运算符的结果为a++,返回值10。接下来运算 a=a-=10,即为a=a=a-10,根据赋值运算规则,得a=0.
三、流程控制语句
条件语句
1.if语句
var a=0;
if(a*=10){
console.log(a);
}//不打印
在这里,条件不管什么表达式都会隐式转换为布尔值
在条件语句中大量用!(非)
if(条件表达式){
// 如果条件表达式运算后隐式转换为布尔值是true,进入该条件语句。
表达式值为真时,执行if控制的语句语句体只有一条语句时,可以不加{}
}
if else:
if(条件表达式){
语句一
}else{
条件隐式转换为布尔值为false时进入
}
if else if:
if(条件1){
}else if(条件2){
}else if(条件3){
}else{
}
这种仅执行其中一个条件结果
if if if :
if(条件1){
}
if(条件2){
}
if(条件3){
} //每个条件都会判断,根据判断结果执行对应的内容
2.switch语句
switch(表达式){
case 值1:
// 当表达式绝对等于值1时执行这里的内容
// break 跳出,如果不写break不判断值2是否相等,直接穿越
break;
case 值2:
// 当表达式绝对等于值2时执行这里的内容
break;
case 值3:
// 当表达式绝对等于值3时执行这里的内容
break;
case 值4:
// 当表达式绝对等于值4时执行这里的内容
break;
default:
// 默认以上条件都不满足时执行这里
}
状态机:
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:
}
循环语句
1.while语句
语法格式:
while(判断语句){
循环体;
}
语句2
while语句是一种先判断,后运行的循环语句。也就是说,必须满足条件了之后,方可运行循环体。
例如:
var i=1; //赋初值语句
while(i<=10) //控制循环条件
{
document.write("hello world!<br/>"); //循环体
i++; //循环增量
}
关于while循环:
while循环先判断表达式,后执行循环体。循环体有可能一次也不执行。
循环体应包含有使循环趋向结束的语句;
下列情况,退出while循环
条件表达式不成立
循环体内遇 break
九九乘法表:
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>");
深度遍历:
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];
}
求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);
}
continue 继续:
遇到满足条件的跳到下一次循环继续向后,当前continue后面的语句不执行
var i=0;
var sum=0;
while(i++<10){
if(i===5) continue;
sum+=i;
}
console.log(sum);//50
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);//a-z A-Z 0-9
2.do while语句
赋初值1;
do{
循环体;2
循环增量;3
}while(循环条件);4
do...while语句是一种先运行,后判断的循环语句。也就是说,不管条件是否满足,至少先运行一次循环体。
var i=1;
do{
document.write("hello world!<br/>"); //循环体
i++;
}while(i<=10);
3.for 循环
循环三要素:即表达式1,表达式2,表达式3
(循环变量赋初值,循环判定条件,循环增量)
循环体:需要重复执行的语句。
for(表达式1;判断表达式2;表达式3)
{循环体;}
for(var i=0;i<100;i++){
sum+=i;
}
1.循环需要变量的初始值仅执行一次,并且不一定需要使用var
2.循环的条件是一个表达式,隐式转换布尔值为真时,进入循环
3.表达式3为每次循环完成后执行循环增量,不一定是括号里最后的表达式:
for(var i=0,sum=0;i++<100;sum+=i);
//循环体写在了小括号内
用for不用while的情况:
while(i<100){
if(i===50) continue;
console.log(i);
i++;
}//当i增到50时,会死循环
for(var i=0;i<100;i++){
if(i===50) continue;
console.log(i);
}//不会出现死循环
for死循环:
for(;;){
}
for循环取2-100之间的质数:
for(i=2,j,bool;i<100;i++){
for(j=2,bool=true;j<100;j++){
if(i%j===0){
bool=false;
break;
}
}
if(bool)console.log(i);
}
for循环将字符串倒置:
var str="abcdefghijklmnopqrstuvwxyz";
console.log(str.length);//字符串的长度
var s="";
for(var i=str.length-1;i>=0;i--){
s+=str[i];
}
console.log(s);
注意:
注意当进行从大到小的循环时(i--),条件注意使用等号(=)的问题;
在双重循环中,不要再内层中判断外层变量或者改变外层变量;
如果使用break,不写跳出label,仅跳出当层循环;
循环是同步的(即循环执行时,不会执行下面的代码);