if语句的细节补充
- 补充一:如果代码块中只有一行代码,那么{}可以省略
补充二:if(...)语句会计算圆括号内的表达式,并将计算结果转换为布尔型(Boolean)
- 转换规则和Boolean函数的规则一致
数字0 / 空字符串 / “” / null / undefined / Nan都会被转换成
false
- 因为它们被称为 “假值”
- 其他值被转换为
true
,所以它们被称为真值(truthy)
逻辑与或的规则
- 逻辑与符号:&&:
- 只要“&&”前面的逻辑结果是false,无论“&&”后面怎么样,都返回“&&”前面的表达式;
- 只要“&&”前面的逻辑结果是true,无论“&&”后面怎么样,返回“&&”后面的表达式;
- 逻辑或符号:||
- 只要“||”前面的逻辑结果是false,无论“||”后面怎么样,都返回“||”后面的表达式。
- 只要“||”前面的逻辑结果是true,无论“||”后面怎么样,都返回“||”前面的表达式。
- 依靠
第一个
运算数,就能得出整个运算的逻辑结果,则返回第一个表达式
依靠第二个
运算数,才能得出整个运算的逻辑结果,则返回第二个表达式
数据类型转换
任何类型转换为字符串
string() 构造函数转换方式
eg:var a=1 a=String(a) , // 对象调用String()强转, [object,object]任何对象强转后都是这个字符串 var a=[1,2,3,4] //调用了数组的一个方法join "1,2,3,4"; []强转字符串后 "" [元素] 强转后就会变成这个元素的强字符串"元素" var a=[{a:1,b:2}] // [object,object] var a // undefined function a(){ // 函数会变成字符串函数 } var a=464313433434354348483438n // 大整型去除n变成字符串 var a=Symbol() // "Symbol()" a=String(a)
所有的隐士转换都是强转,也就是该方式
number转换字符串 toSting() toFixed() 新增拓展方法
toString()
var a=15 // a.toString(进制转换) 将数值按照指定的进制转换字符串 2-36 console.log(a.toString(16)) // F console.log(a.toString(2)) // 1111 console.log(a.toString(10)) // 15 如果不写参数,默认是十进制 console.log(a.toString(36)) // f console.log(a.toString(几位小数)) // 保留几位小数,会四舍五入
- 所有的数值是不能直接调用方法的,
- 可以存储为变量,让变量调用方法,可以转换为数值型对象调用方法
toFixed()
console.log(a.toFixed(几位小数)) // 保留小数会四舍五入 console.log(a.toPrecision(保留几位)) // 四舍五入做科学计数法,如果是小数,保留数值位数,不做四舍五入,不用科学计数法;范围1-21 console.log(a.toExponential(小数点后的位数)) // 科学技术法表示,保留小数后位数,会自动四舍五入 a=34.567 console.log(a.toFixed(2))
- 对象和数组 toString() 基础方法
任何类型转换数值
Number() 强转换 数值类型中包括两种,一个是数值,一个是Nan(非数值)
var a="3a" //nan var a=null // nan console.log(Number(function(){}))
- 无其他字符的纯数值字符串转换为数值,null转换为数值0,可以将布尔值true转换1,false转换为0
- 可以将空数组转换为0,可以将这个一个数值元素或者一个纯数值字符串元素转换为数值
- bigInt会转换为数值
- 其他任何内容转换为数值均为NaN
字符串转换为数值
全局方法
- parseInt(要转的元素,进制) 转换为整数 将第一个参数隐士转换为字符串后再转换为整数
- ParseFloat() 转换为浮点型
都会转换为10进制,如果没有进制,默认转换为10进制,并且将不符合的内容去掉
console.log(parseInt("FF",16)) console.log(parseInt("101110101",2)) console.log(parseInt("10151",2)) // 5 console.log(parseFloat("2.2.5")) // 2.2 console.log(parseFloat("3a")) // 不能使用进制,小数点运算进制是有问题
任何类型转换为布尔值
Boolean() 强转布尔值
- "" , false , 0, undefined, null , Nan 均为false(0),其他都是1
- 遇到任何数组转换布尔值时,不会优先转换为字符串再转布尔,而是直接转换为布尔True
强转对象
- object() 只要使用object强转都会变为引用类型
javascript中的引用类型有:
1.object,对象;
2.Array,数组;
3.Function,函数;
4.Date,日期时间类型;
5.RegExp,正则表达式
运算
数值运算
非数值加法运算(+)
console.log(3+true) // number+boolean boolean隐士转换数值 console.log(3+undefined) // number+undefined undefined隐士转换数值Nan console.log(3+null) // 3 null隐士转换数值为0 console.log(3+{a:1}) // 对象会隐士转换为字符串,数值和对象字符串首尾相连 console.log(3+[2]) // 将数组转换为字符串,首尾相连 console.log(0+[]) // 0+'0' console.log(3+45879586562n) // 错误,无法相加 console.log("3"+true) // string+任何类型 都会将后面的类型隐士转换为字符串然后拼接 console.log("a"+{a:1}) // a[object object] console.log("a"+[1]) // "a1" console.log(false+true) // 数值相加 console.log({a:1,b:2}+true) // 对象和数组都会隐士转换为字符串相加 console.log(undefined+true) // undefined和null遇到布尔值相加都会转换为数值 console.log([1]+[2]) // 12
所有的 - * / % 都会隐士转换为数值运算
console.log("45"-"2") // 43 console.log([]-[]) // 0 console.log('45'- null) // 45
** 求幂
进制使用 ** 立方根求值
console.log(3**2) // 9 console.log(9**0.5) // 3
赋值运算符和一元运算符
赋值运算符
var a=3; a+=2 // 5 a+="" // 3 a+=[3] // 33 a=a+[3] // 33 赋值运算符运算依照 + - * / % ** 运算符 var a="5.23" a-=0 // 5.23
一元运算符
a++ a-- ++a --a
var a = 3 var b = a = 5 console.log(a, b); // 5,5
var obj = { a: 1 } obj = obj.a = { b: 10 } console.log(obj); // { b: 10 }
var obj = { a: 1 } var o = obj obj.a = obj = { b: 10 } console.log(obj); // { b: 10 }
// 定义变量 var a,b,c var a1=3, b1=4, b1=5; var a2=b2=c2=3; // 3 3 3
// 优先级 赋值运算*= =优先级很低 var a = 2 a *= 2 + 3 console.log(a); // 10
// 赋值运算符要是计算不了,就先进行加减计算 var a = 3 a = a += 2 // 5 a += a = 4 // 7
// 任何一元运算符,计算时都会隐式转换为数值运算 var a="1"; a++ // 2 var a=[]; a++; // 1 var a=[3]; a++; // 4 console.log(a);
var a=1; 2 + 2 + 3 + 4+ 4 +5 +5 +6 var s=++a + a+ ++a + ++a + a++ +a + a++ + a; console.log(s,a); // ++ -- 一元运算的优先级高于+ - * / for(var i=10;i--;){ console.log("aa") } var arr=[1,2,3,4,5]; for(;arr.length;arr.length--){ console.log(arr[arr.length-1]) }
关系运算符
- 关系运算符返回一个布尔值
- < > <= >= == ===
!==
!===
- ASCII utf-8 Unicode(万国码)
var a="aa"; var b="ab"; console.log(b>a); console.log("谢">"一") console.log(3>4) console.log(1.2<1.1999) console.log(true>1);//隐式转换为数值 false console.log(undefined>null); //false console.log(null>undefined); //false console.log({a:1}<{a:2}); //false console.log([3]<[4]) //true
==
先隐士转换为相同类型,在比较===
绝对比较 先比较类型,再比较值
// 三个完全相互相等 console.log(""==false); // true console.log(false==0); // true console.log(""==0); // true var a=[]; var a=[""]; var a=[0]; // 六个可以进入条件 (number,string,undefined,null,bigint,object) if(a==0){ console.log("aaa") }
// 任何值与NaN都不相同 console.log(NaN==NaN);//false var a="a"; // isNaN,先隐式转换为数值,然后判断是不是NaN if(isNaN(a)){ console.log("aaa") }
// 不隐式转换为数值,直接判断是否是NaN if(Number.isNaN(a)){ console.log("aaa") }
// console.log([]==[]);//数组是引用类型,两个不同的数组,引用地址不同,false,数据类型相同,所以不隐式转换 // console.log([]==""); // console.log([]==0) // !强制隐式转换为布尔值再取反 // console.log([]==![]);//true // console.log([2]==2); // console.log([0]==false)
逻辑运算符
逻辑与运算符概念:
- true && true true
true && false false
false && true false
false && false false
console.log(3 && 0); // 0
- true && true true
逻辑或运算符概念 ||
- true || true true
true || false true
false || true true
false || false false
console.log(0 || 3); // 3
- true || true true
! 逻辑非,强制隐式转换为布尔值,并且取反
var o = 0 if (o) { } if (!o) { console.log('aaa'); }
位运算符
二进制
#FF0000FF rgba(255,255,255,1) 11111111
十进制
- 除2取余法
- 展开式
八进制
- 101,011,011 => 533
十六进制
- cd5f => 1100110101011111
&运算符
- 概念:
- 1&1 1
1&0 0
0&1 0
0&0 0
console.log(567&15) 567 => 110010111 15 => 000001111 得出 000000111 得到 17
注意点:任何数与2的n次幂-1相与,得到的结果是这个数除以2的n次幂的余数
|位运算符
- 概念:
- 1|1 1
0|1 1
1|1 1
0|0 0
console.log(12|14) 12 => 1100 14 => 1110 得出 1110 得到 14
注意点: 1. 任何数与2的n次幂-1相或时,得到的结果都是大于等于2的n次幂
- 如果这个数小于2的n次幂-1时,值就是2的n次幂-1
^ 异或运算
- 概念:
- 相同为0不同为1
1^1=0
1^0=1
0^1=1
0^0=1
异或用于加密和解密 console.log(234567^987654) console.log(820801^987654)
~ 位非
- 概念: +1取负
var a=3; a=~a; console.log(a) //-4
// 取整 var a=3.21; a=~~a; console.log(a) // 转换为数值并且取整 var a="ab"; console.log(~~a)
右移运算符
console.log(16>>2); 10000-->100--4
console.log(3<<6); 11 --> 11000000 --> 192
console.log(2<<6); 10 --> 10000000 --> 128
三元运算符
三元运算符,如果返回布尔值时,不要三元运算符
var a=3; var b=a>3 ? false : true; var b=!(a>3)
三元运算可以多个连用
var a=3; var b=a>3 ? 1 : a===3 ? 0 : -1;
var a=4;
var b=a>3 ? 1 : 0
var b=Number(a>3);
var b=~~(a>3);
console.log(b) // 1
三元运算符优先级,优先于赋值运算符
var a=3; var b=a+= 1 ? 0 : 1; // 3 var b=a+= 0 ? 1 : 2; // 5 console.log(b); var c = 245 var d = c += 3 ? 18 : 10 console.log(d); // 263
条件运算符
- 将表达式的结果转换为布尔值,如果是true进入条件,如果是false不执行条件语句
- 条件语句中,只有一句话的时候,可以省略
大括号
,直接书写即可 格式:
if(表达式){ } if(){ }else{ } if(){ }else if(){ }else if(){ }else{ } if(){ } if(){ } if(){ }
+ switch case格式:
+ 表达式绝对等于对应的值时,执行对应的语句,break跳出
+ break跳出当前条件,如果没有break,不判断下一个条件是否满足,直接进入,这叫做穿越
+ default中不增加break
```JavaScript
switch (表达式) {
case 值1:
break;
case 值2:
break;
case 值3:
break;
case 值4:
break;
default:
}
```
```JavaScript
// 举个例子
var a=3;
switch(a){
case 2:
break;
a===3 || a===4
case 3:
case 4:
console.log("aaa");
break;
//穿越叠加
case 5:
console.log("a");
case 6:
console.log("b");
break;
default:
}
```