基本数据类型(值类型)
number string boolean null undefined bigint symbol
引用数据类型
object: {} [] /^$/ Math数学函数对象 日期对象 实例对象 。。。
function
ES6中新增
Symbol 唯一值
NaN
typeof 检测数据类型
typeof Infinity=>“number”
console.log(typeof NaN) =>“number”
NaN 不是一个有效数字,但是属于number数字类型
=>NaN==NaN也是不相等,它和谁都不相等,所以检测是否为有效数字需要用isNaN
任何数 加(+) NaN 结果都是 NaN
什么时候会出现NaN
把其它数据类型转化成Number类型的时候,不能转换就是NaN
parseInt、parseFloat、Number()、数学运算、一些其它比较的时候
isNaN调用的是Number()方法做的隐式转换
object
对象的属性名一定不能是引用类型值,默认会把引用类型值转换为字符串进行处理
ps:对象转换字符串 toString()
let a = { x: 100 }
let b = { x: 200 }
let obj = {}
obj[a] = "清欢"
// {[object Object]: "清欢"}
obj[b] = "长安"
// {[object Object]: "长安"}
//不论是obj[a]还是obj[b]转换后最终都变成了[object Object],所以最后一个值会覆盖前面的值 比较之后为true
console.log(obj[a] === obj[b]) //=> true
数组是特殊的对象
相对于 对象 来说 数组 的特殊性在于 数组 的属性名是有规律的、逐级递增的、代表位置的数字索引
console.log([1, 2, 3])
(3) [1, 2, 3]
0: 1
1: 2
2: 3
length: 3
__proto__: Array(0)
// 同样有键值对
Number:NaN/isNaN/Infinity/parseInt/parseFloat/Number()
把其他数据类型转换为数字的方法
强转换(基于底层机制转换) Number([value])
一些隐式转换都是基于Number完成的
1、isNaN('12px') 先把其它类型值转换为数字在检测
2、数学运算 ‘12px’ - 13
3、字符串==数字 两个等号比较时也是要把其它值类型转换为数字
弱转换(基于一些额外的方法转换) parseInt([value])/parseFloat([value])
parseInt 处理的值是字符串,从字符串的左侧开始查找有效的数字字符(遇到非有效数字的字符则停止查找)->如果处理的值不是字符串,需要先转换为字符串然后再开始查找
字符串中必须保证都是有效字符才会转换为数字,否则都是NaN
+(加号) 在js中除了数学运算还有字符串拼接
什么时候拼接:+ 遇到字符串(或者对象,因为对象就是先转换为字符串然后再处理)
在两边出现字符串(或者对象)的情况下,加号一定是字符串拼接 =>对象本身是要转换为数字进行运算的,只不过转换数字的过程中,需要先转换为字符串,才能转换为数字,而一旦转换为字符串,不好意思就变为字符串拼接了
0 NaN null undefined 空字符串 转换为布尔都是假
true -> 1 ;false -> 0
null -> 0 ; undefined -> NaN
== 进行比较的规律
在进行比较的时候,如果左右两边数据类型不一致,则需要先默认转换为一致的数据类型,然后在进行比较
1、对象==字符串 对象转化为字符串
对象转换为字符串 先调用 valueOf 获取原始值(一般都是基本类型值),如果原始值不是基本类型值,则继续调用 toString()
2、null==undefined (三个等于号不会相等) 但是和其它值都不相等 0==null(他俩不相等)
3、剩下两边不同都是转换为数字(剩下的情况都是转换为数字在做比较的)
4、NaN和谁(包括自己)都不相等
=== 绝对相等,两边类型一致,值也一致才相等,类型不一样,直接不对等,不会转换(真实项目中一般用三个等于号===来保证严谨性)
[]==false =>true
![]==false =>true
[]==false 都转换为数字
[]先转换为''(toString) 在转换为数字0(Number)
false 变为数字0
![]==false
运算符优先级 ![] 再算比较
![] 转换为布尔值进行取反(把其它类型转换为布尔类型遵循的规律: 只有 0/NaN/null/undefined/'' 五个值是false,其余的都是true) => false
{}+0 => 0
0+{} => "0[object Object]"
{}+0+"10" => "010"
{}+0+[] => "0"
{}+0+{} => "[object Object]0[object Object]"
({}+0) => "[object Object]0"
({})+0 => "[object Object]0"
{(0)}+0 => 0
{}+0
大括号在JS中太特殊了:对象、代码块(块作用域)
此处把大括号当做一个代码块 后面是+0
+值 ++值 值++ 这三个操作都是数学运算(不论加谁)
大括号在运算符前面
1. 在没有使用小括号处理优先级的情况下 不认为是数学运算,加小括号才算
2. 出现在运算符的后面 认为是数学运算
在JS中对象的属性名是什么格式的?
普通对象的属性名只能是“字符串”(普通对象的属性名可以是基本数据类型值)
但是普通对象的属性名不能是对象,如果是对象,需要转换为字符串存储 普通对象转换为字符串存储调用的是 .toString() 是调取 Object.prototype.toString 是用来检测数据类型的
Map 这种数据结构支持对象作为属性名