数据类型
数据类型分为两类
- 基本数据类型
- number
- string
- boolean
- null
- undefined
- symbol
- bigInt
- 对象(引用)数据类型
- object
- 普通对象
- 数组对象
- 正则对象
- 日期对象
- Math对象
- ...
- function
- object
number
-
NaN和谁都不相等(包括自己)
- isNaN检测这个值是否为有效数字,不是的话就返回true,是的话就返回false
isNaN(1) =>false / isNaN("aaa") =>true
-
infinity
-
其他数据类型转为数字的方法
-
强转换 (基于底层机制转化的)Number()
- 一些隐式转换都是基于Number
- isNaN(‘12px’) 先把其他类型转换为数字在进行检测
- 数学运算 ''12px' - 13
- 字符串 === 数字
-
弱转换 (基于一些额外的方法转换的) parseFloat/parseInt
-
Number 转换的一些规则
- "" 、 null、 []、 false、都是0
- true 是 1 、undefined是NaN 、 {}也是NaN
- 字符串中都是有效数字才能进行转化
-
parseInt处理的是字符串,从左侧开始查找,遇到非有效数字则停止查找。(先转化为字符串)
-
只传入一个值的话 parseFloat多识别一个小数点
-
parseInt可以接受两个参数,支持进制基础,从左到右开始查找 然后 看作radix 最后转化为10进制
// parseInt(value, radix)radix支持 2-36 其他都为NaN 默认为0。0相当于是10进制 parseInt('231', 3) 2*3^0 = 2 parseInt('234561px', 5) 4*5^0 + 3*5^1 + 2*5^2 = 69
-
-
补充 :双等号比较
// == 进行比较的时候,如果两边数据类型不一致, 需要先默认转化为一致的数据类型,然后在进行比较
// 规则
// 对象 == 字符串 对象转化为字符串
// null == undefined => true
// 0 == null => false
// 0 == undefined => false
// NaN 和任何都不相等
// === 两边类型一致 而且值也相等
// [] 先转化为''(toString),在转化为数字(Number)
[] == false // true Number([])=0
// ![] 转化为布尔类型(!把其他类型转化为布尔类型, 只有 0/NaN/null/undefined/ 是false)
// !! 转为布尔类型
![] == false // true
{} 的加法总结
{} + null => 0
{} + [] => 0
{} + false => 0
{} + 1 => 1
{} + true => 1
{} + undefined => NaN
{} + '12px' => NaN
{} + '12' => 12
{} + {} => "[object Object][object Object]"
// 大括号在运算符前面
// 1 在没有使用小括号处理优先级的情况下 不认为是数学运算。加上小括号才算
// 2 出现在运算符的后面 认为是数学运算
{}+0 => 0
({}) + 0 => "[object Object]0"
({}+0) => "[object Object]0"
({} + "xxx") "[object Object]xxx"
{} + 10 + {} "[object Object]10[object Object]"
0+{} => [object Object]
+ 号的总结
在两边出现字符串(或者对象)的情况下,加号一定是字符串拼接。对象本身是要转换为数字进行运算的,只不过转换数字的过程中,需要先转换为字符串,才能转换为数字,而一旦转换为字符串,就变成字符串拼接了。+ 没有遇到字符串都要转化为数字, 对象要转化为字符串。
对象的属性
let str = 100 + true + 21.2 + null + undefined + 'Tencent' + [] + null + 9 + false;
// "NaNTencentnull9fale"
// 普通对象的属性名可以是 基本数据类型
let a = {}, b = Symbol("1"), c= Symbol("1");
a[b] = "bbb";
a[c] = "ccc";
console.log(a[b])
let a = {}, b = {n: 1}, c={name: 2};
a[b] = "bbb"; a["[object Object]"] = "bbb"
a[c] = "ccc"; a["[object Object]"] = "ccc"
console.log(a[b])
数据类型检测
- typeof 检测数据类型的逻辑运算符
- 返回的都是字符串(string) "数据类型"
- typeof null => "object"
- 不能细分对象类型
- instanceof 检测是否为某个类的实例
- constructor 检测构造函数
- Object.prototype.toString.call 检测数据类型