基本数据类型(值类型):Number,String,Boolean,Null,Undefined
引用数据类型:Object类型:( {} , [] , /^$/ , Date , Math )、Function类型
ES6新增:Symbol唯一值、bigint
数据类型检测
- typeof 检测数据类型的逻辑运算符
- instanceof 检测是否为某个类的实例
- constructor 检测构造函数
- Object.prototype.toString.call 检测数据类型的
typeof [value] 返回当前值的数据类型 "数据类型"
- 返回的结果都是字符串
- 局限性:
- typeof null => "object"
- typeof 不能细分对象类型(检测普通对象或者数组对象等都是"object")
把其它数据类型转换为数字的方法
+ 强转换(基于底层机制转换的) Number([value])
+ 一些隐式转换都是基于Number完成的
+ isNaN('12px') 先把其它类型值转换为数字在检测
+ 数学运算 '12px'-13
+ 字符串==数字 两个等于号比较很多时候也是要把其它值转换为数字
+ ...
+ 弱转换(基于一些额外的方法转换) parseInt([value])/parseFloat([value])
其中console.log(NaN) => "Number",代表不是一个有效数字,但是属于Number类型 NaN == NaN也是不相等的,它和谁都不相等,所以检测是否为有效数字用“isNaN” console.log(isNaN(10)) //false
console.log(isNaN("10")) //false
console.log(isNaN("A")) // true
运算时需要注意的事项:
1. false,null在参与运算时都会先转换为number类型(除了"+"运算符的另一边为字符串或对象),**转换完就为0**,
而**undefined为NAN**
"+"为什么这么特殊,对象又为啥不一样?
在"+"两边出现字符串(或者对象)的情况下,加号一定是字符串拼接,而对象本身是要转换为数字进行运算的,
只不过转换数字的过程中,需要先转换为字符串,才能转换为数字,而一旦转换为字符串,不好意思,就变为字符串拼接了
[]+0 //"0"
对象转换为字符串,先调用valueOf,获取原始值(一般都是基本类型值),则继续调用toString()
[10]+0 //[10] -> '10'+0 = "100"
但是Object情况有点特殊:{}+0
这种Object在加号左边时,会被认为Object为一个代码块,那就会和+0区分开来,认为这是两个语句,那+0就是0了
如果硬要变成一个语句,那就再外面加层(),({}+0)或者({})+0
0+{}:而在右边时,就会认为是一个语句,那这时就变成了字符串拼接了"0[object Object]"
特殊情况也会被认为是一个语句:{}+0+{}
如果"+"只有一边有值,那么这个操作就是数学运算(不论加谁),++值,值++ 也是一样
总结:
1. 大括号在运算符前面,在没有使用小括号处理优先级的情况下,不认为是数学运算,加小括号才算
2. 出现在运算符的后面 认为是数学运算
2. 而0、NAN、null、undefined、""在转换为boolean类型时都为**假**
3. == 在进行比较的时候,如果左右两边数据类型不一致,则需要先默认转换为一致的数据类型,然后在进行比较
=== 绝对相等,两边类型一致,值也一致才相等,类型不一样,直接不对等,不会转换
规则:
⑴. 对象==字符串 对象转换为字符串
[10] == '10' true
⑵ null == undefined (三个等号下不相等),但是和其它任何的值都不相等
0 == null false
⑶ NaN和谁(包括自己)都不相等
⑷ 剩下的情况都是转换为数字在做比较的
例1:
[]==false 都转换为数字
[]先转换为''(toString) 在转换为数字0(Number)
false 变为数字0
所以为true
例2:
![]==false
运算符优先级 ![] 再算比较
![] 转换为布尔值进行取反(把其它类型转换为布尔类型遵循的规律: 只有 0/NaN/null/undefined/'' 五个值是false,其余的都是true) => false
所以false == false true
在JS中对象的属性名是什么格式的?
普通对象的属性名只能是“字符串”(普通对象的属性名可以是基本数据类型值)
Map 这种数据结构支持 对象作为属性名
Object:对象的键值对中,键可以为基本数据类型中的任意一种,输出时可以用Obj[0]、Obj[true], 也可以用Obj["0"]、Obj["true"]
let obj = {
0:100,
true:"哈哈",
null:"呵呵"
}
obj[0],obj[true] // 100,"哈哈"
obj["0"],obj["true"] //100,"哈哈"
但键不可以为引用数据类型值,默认会把引用数据类型值转化为字符串
let a = {x:100};
let b = function (){
let test = 123
}
obj[a] = 1000;
obj[b] = 2000;
输出时为:[object Object]: 1000
"function (){↵ let test = 123↵ }": 2000
如果加一个let c = {y:200};
obj[c] = 3000;
输出时为:[object Object]: 3000 //因为都被转化成了[object Object],所以把obj[a] = 1000覆盖了
"function (){↵ let test = 123↵ }": 2000