- 逻辑运算
逻辑运算一般用于判断多关系运算,得出最后结果。
运算符 | 描述 |
---|---|
&&(逻辑于) | 左右两边都为true,最后结果才为true,否则就是false |
|(逻辑或) | 左右两边只要有一个true,最后结果就为true,否则就是false |
!(逻辑非) | 将true处理为false,将false处理为true |
逻辑与(&&)的运算方法
- 只要“&&”前面是false,无论“&&”后面是true还是false,结果都将返“&&”前面的值;
- 只要“&&”前面是true,无论“&&”后面是true还是false,结果都将返“&&”后面的值;
逻辑或(||)的运算方法
- 只要“||”前面为false,不管“||”后面是true还是false,都返回“||”后面的值。
- 只要“||”前面为true,不管“||”后面是true还是false,都返回“||”前面的值。
<div style="color:red;font-size:18px;font-weight:600" >在JS逻辑运算中,0、""、null、false、undefined、NaN都会判为false,其他都为true。</div>
类型转换
强制转换
1.转换布尔型
语法:
Boolean(arg)
- 非0数字转换为布尔型为true,0转换为布尔型为false
- 非空字符串转换为布尔型为true,空字符串转换为布尔型为false
- undefined转换为布尔型为false
- null转换为布尔型为false
2.转换为字符串
语法:
String(arg)
- true转换为字符串依然为true,false转换为字符串仍为false
- null转化为字符串仍为null
- undefind转换为字符串仍为undefind
3.转换为数字
语法:
Number(arg)
- NaN不代表数字,但它是数字类型
- 非数字字符串转换后都是NaN(NaN是一个不是数字的数字类型)
- true转为数字为1,false转为数字为0
- undefined转换为数字为NaN
- null转化为数字为0
4.使用函数强制转换为数字
语法:
parseInt(arg)//强制转换为整数
parseFloat(arg)//强制转换为小数
- 小数转换为整数只取整数,向下取整
- 首位非数字的字符串强转为整数为NaN,首位是数字的字符串强转为整数是首位的数字
- 布尔型强转为数字为NaN
- undefined强转为数字为NaN
- null强转为数字为NaN
5.使用toString()方法强制转换为字符串。转换结果和String()函数一样。
var a = 12345;
var b = true;
var c = a.toString();
var d = b.toString();
console.log(c);
console.log(typeof c)
console.log(d);
console.log(typeof d);
<div style="color:red">注意:这个方法不能给undefined和null使用</div>
隐式转换(自动类型装换)
在js中,运算符在运算时,若两边数据不统一,编译器会自动将运算符两边的数据进行数据类型转换。这个过程有编译器自动转换的方式就称为隐式转换。
1.在数学运算时转换为数字型
2.比较运算时:
- 如果两个值都是字符串,则进行比较编码值
- 如果有一个值为数字或布尔型,则转换为数字进行比较
- 字符串进行比较的时候首字符进行比较,相等在进行后面的字符比较。
常见误区
- 字符串连接符与算术运算符隐式转换规则混淆
/*此类问题的坑:将字符串连接符(+:只要+两边有一边是字符串)与算术运算符(+:两边都是数字)的隐式转换搞混淆
1.字符串连接+:会把其他数据类型调用String()方法转成字符串然后拼接
2.算术运算符+:会把其他数据类型调用Number()方法转成数字然后做加法计算
*/
//+是字符串连接符:String(1)+'true'
console.log(1+"true");//1true
//+是算术运算符:1+Number(true)=1+1=2
console.log(1+true);//2
//+是算术运算符1+Number(undefined)=1+NaN=NaN
console.log(1+undefined);//NaN
//+是算术运算符:1+Namber(null)=1+0=1
console.log(1+null);//1
- 关系运算符会把其他数据类型转换成number之后再比较关系
/*当关系运算符两边有一边是字符串的时候,会将其他数据类型使用Numder()转换,然后比较关系
console.log("2">10);//false Number("2")>10=2>10=false
当关系运算符两边都是字符串的时候,此时同时转成number然后比较关系
重点:此时并不是按照Number()的形式转成数字,而是按照字符串对应的unicode编码来转成数字(使用charCodeAt(字符下标,默认为0)这个方法可以查看字符的unicode编码)
console.log("2">"10");//true '2'.charCodeAt()>'10'charCodeAt()=50>49=true
*/
console.log("2">10);//false
console.log("2">"10");//true
//多个字符从左往右依次比较
console.log("abc">"b");//false 先比较'a'和'b','a'与'b'不等,则直接得出结果
console.log("abc">"aad");//true 先比较'a'和'a',两者相等,继续比较第二个字符'b'与'a',得出结果
console.log(NaN==NaN);//false 特殊情况(无视规则):NaN与任何数据比较都是NaN
console.log(undefined==null);//true 特殊情况(无视规则):如果数据类型是undefined与null得出固定结果
console.log(undefined==undefined);//true
console.log(null==null)//true
- 逻辑非隐式转换与关系运算符隐式转换搞混淆
o 空数组的toString()方法会得到空字符串,而空对象的toString()方法会得到字符串[object Object]
(注意第一个小写o,第二个大写O哟)
/*1.关系运算符:将其他数据类型转成数字
2.逻辑非:将其他数据类型使用Boolean()转成布尔类型
* 以下八种情况转换为布尔类型会得到false(0、-0、NaN、undefined、null、""、false、document.all())除此之外的所有数据得到true.
*/
console.log([]==0);//true
console.log(![]==0);//true
console.log([]==![]);//true
console.log([]==[]);//false
console.log({}==!{});//false
console.log({}=={});//false
算法
程序=数据结构+算法
任何复杂的算法都有以下几种结构:
1.顺序结构
2.分支选择结构
3.循环结构
1.分支结构(满足不同的条件执行不同的程序)
if分支
if(条件){
当条件为true时执行的语句
}
if...else...分支
if(条件){
当条件为true时执行的语句
}else{
当条件为false时执行的语句
}
if()...else if()...else分支
if(条件1){
当满足条件1时执行的语句
}else if(条件2){
当满足条件2时执行的语句
}else if(条件3){
当满足条件3时执行的语句
}else{
以上条件都不满足时执行的语句
}
switch-case 语句
switch(变量/表达式){
case 值1:
执行语句1;
break;
case 值2:
执行语句2;
break;
...
default:
变量与case不符时执行的语句;
break;
}
2.循环结构(重复执行相同或相似的代码)
三要素:
1.循环变量
2.循环条件(满足时才执行循环体)
3.循环变量的变化(变化是趋向于条件的不满足,趋向于循环的结束)
while循环
while(条件){
循环体
}
/*流程:
1.判断循环条件
2.循环条件为true,执行循环体。再判断条件,如果条件为真,执行循环操作...
3.循环条件为false,则结束循环操作*/
do while循环
do{
循环体
}while(条件)
/*流程:
1.先执行循环体
2.
*/
for循环
for(表达式1;表达式2;表达式3){
循环体
}
/*
表达式1:声明循环变量 可以省略 循环变量需要在循环开始之前申明好
表达式2:循环条件的判断 可以省略 在循环体中添加结束循环的判断,否则就会形成死循环
表达式3:更新循环变量 可以省略 在循环体中添加循环变量的更新语句
三个表达式可以省略,但是不能省略分号(;)
流程:
1.执行表达式1 声明循环变量
2.判断循环条件是否成立 成立则执行循环体
3.执行表达式3,更新循环变量
4执行表达式2 判断循环条件是否成立 成立则执行循环体。若表达式2执行的结果为false 则终止循环
*/