undefined、null、NaN的区别:
undefined表示已声明未赋值(未定义),
var a
var b ={}
null表示变量已声明且赋值为null,值为空值,用于将null赋给变量以预防内存泄露等问题
NaN和任何数据都不相等,包括本身,其他数据类型和NaN运算的结果都是NaN
undefined+1表示不合法的数,可以通过isNaN()来判断某个值。
Infinty 正无穷
-Infinty 负无穷
+0 ===-0 true 事实上并不完全相等
数据类型之间的转换:
强制转换成数字
Number([val]) 列表强制转化成数字结果是0
Number('11111')
11111
Number('')
0
Number('aaaa222')
NaN
布尔值转换成数字: 1 0
null转换是0
undefined是NaN
Symbol无法转换为数字,会报错
BigInt会去掉n Number(BigInt(10))
把对象转换成数字顺序优先级:
Symbol.toPrimitive>valueOf的原始值>toString
函数可视为对象
强制转换数字的另一种写法:
parselnt([val],[radix])
val必须是字符串,如果不是先隐式转换成字符串
radix是进制,默认是十进制,0x开头的默认16进制,遇到一个有效字符,就不向后查找
强制转换成字符串String([val])
若val是一个原始值,直接为字符串
val是一个对象,先调用Symbol.toPrimitive,如果没有,调用toString方法
ob[Symbol.toPrimitive]=function () {return 'abc'}
String(ob)
ob.toString()
强制转换成布尔值:
除0、NaN、空字符串、null、undefined、false返回的值是false外,其余都是true
强制转换成符号(Symbol)
每个从Symbol返回的symbol的值都是唯一的,一个symbol值能作为对象属性的标识符
a=Symbol('123456')
ob={
[a]:10000
}
symbol不能new,创建一个符号,通常Symbol.for()创建一个全局符号.
symbol衍生功能迭代器:
var a =[1,2,3,4,5,6]
a[Symbol.iterator]
b = a[Symbol.iterator]()
symbol复写时会保留;
强制转换成对象:
object()
隐式转换:
不需要人工干预,自动转换
运算符隐式转换
先将其转换成Number
'20'-'10'
10
如果是对象,完全遵循Number强转的规则Symbol.toPrimitive>valueOf的原始值>toString
+的情况:+两边有值判断两边值的类型,两边都为数字,进行数字计算,若有一边是字符串,另一边也转换成字符串进行拼接,都为引用类型,都转换成字符串
var a={}
console.log{+b}
+b相当于转为数字
&& || 的返回值,返回最后一个执行了代码的返回值。
&& true的话向后走,||,false停
'=='转换
转换规则:
(1)两边类型如果相同,值相等,为相等。
(2)双方为基本数据类型,一方为null、undefined、另一方也需要是这样才能比较,一方是string,把String转化成Number进行比较,一方是Boolean,是的话,将Boolean转换成Number进行比较。
(3)一方有引用类型,一方为Object,另一方为String、Number或者
Symbol,将Object转换成字符串进行必将,双方都是引用类型,判断是不是指向同一对象。
流程控制
顺序、分支、循环
判断:
常见的判断结构:
1.
if(){}
else if(){}
else{}
2.default 是默认
switch(a){
case 10:
10
break;
case 2:
console.log('1111')
break;
default:
console.log('22222')
break;
}
3.三元表达式
true?10:100
4.基于&& || 的组合
表驱动法:从表里查找信息不使用逻辑语句。