Appearance
JS中的数据类型被分为两大类:
原始值类型(值类型/基本数据类型)
- number 数字
- string 字符串
- boolean 布尔
- null 空对象指针
- undefined 未定义
- symbol 唯一值
- bigint 大数
对象类型(引用数据类型)
- 标准普通对象
Object
- 标准特殊对象
Array
、RegExp
、Date
、Math
、Error
...... - 非标准特殊对象
Number
、String
、Boolean
- 可调用/执行对象(函数)
Function
数据类型检测的方式(4种)
typeof [value]
返回值是字符串,字符串中包含所属的类型- typeof检测对象类型,除函数被识别
'function'
,其余都是'object'
(不能细分对象) - 基于typeof检测一个未被声明的变量,不会报错,结果是
'undefined'
typeof null -> 'object'
typeof检测null结果是'object'
的原因是:如果是以'000'开始的二进制,则被识别为对象(null存储的二进制都是0,符合以'000'开始);然后再去看对象是否实现了[[call]],实现了则为函数(返回'function'
),没实现就是对象(返回'object'
)
- typeof检测对象类型,除函数被识别
Object.prototype.toString.call([value])
[value] instanceof [constructor]
[value].constructor
其他检测固定类型的方法:Array.isArray([value])
、isNaN([value])
......
检测是否为对象:val !== null && /^(object|function)$/i.test(typeof val)
0.1 + 0.2 != 0.3 计算机是二进制形式存储数据的,十进制浮点数在转换为二进制时,由于计算机存储位数限制,有可能出现精度丢失。
运算保证精度,实现思路:把小数变成整数(乘以系数)运算,运算后的结果再除以系数。
javascript
const coefficent = function coefficent (num) {
num = String(num)
const [, char = ''] = num.split('.'),len = char.length
return Math.pow(10, len)
}
javascript
const plus = function plus (n, m) {
n = Number(n)
m = Number(m)
let coeffic = Math.max(coefficient(n), coefficent(m))
return (n * coeffic + m * coeffic) / coeffic
}
数据类型转换
一般将其他数据类型转换为Number
、String
、Boolean
把其他类型值转换为Number
Number([value])
parseInt([val],[radix])
、parseFloat([val])
把其他类型值转换为String
[value].toString()
String([value])
把其他类型值转换为Boolean
转换规则:除了“0/NaN/空字符串/null/undefined”五个值是false,其余的都是true
出现情况:
Boolean([val])
或者!/!!
条件判断