- 基本类型:number、string、boolean、undefined、null、Symbol、BigInt
- 引用类型:Object、Array、Function、内置对象(Date、Math 等)
-
内置对象,提供了对任意长度整数的支持,表示任意大的整数
-
Number.MAX_SAFE_INTEGER(2^53 - 1)是 Javascript 中可以用 Number 表示的最大数字,在这个数范围内不会出现精度丢失(⼩数除外),超过这个范围,js 会出现计算不准确的情况
-
它提供了一种方法来表示大于 Number.MAX_SAFE_INTEGER 的整数
-
BigInt 不支持一元加法
-
BigInt 出现之前需要依靠第三方库
-
创建 bigint:在一个整数字面量后面加 n 或者调用 BigInt 函数
const bigint = 1234567890123456789012345678901234567890n;
const sameBigint = BigInt('1234567890123456789012345678901234567890');
const bigintFromNumber = BigInt(10);
- 基本数据类型保存在栈内存中,因为基本数据类型占用空间小、大小固定,通过按值来访问,属于被频繁使用的数据
- 引用数据类型存储在堆内存中,因为引用数据类型占据空间大、占用内存不固定。如果存储在栈中,将会影响程序运行的性能
- 引用数据类型在栈中存储了指针,该指针指向堆中该实体的起始地址。当解释器寻找引用值时,会首先检索其在栈中的地址,取得地址后从堆中获得实体
- 是一种特殊的线性表,它具有后进先出的特性
- 存放基本类型,占据空间小、大小固定
- 存放引用类型(在栈内存中存一个基本类型值保存对象在堆内存中的地址,用于引用这个对象)
- 占据空间大、大小不固定
- typeof:判断基本类型、函数。不能判断 Null、Object、Array,因为都返回 object
- instanceof:判断对象类型,不能判断基本数据类型,机制是判断在对象原型链中能否找到该类型的原型
- Object.prototype.toString.call:所有类型都能判断,还有 Error 对象,Date 对象等
- Array.isArray
arr.__proto__ === Array.prototype
- arr instanceof Array
- Object.prototype.toString.call
- null 表示没有对象,即该处不应该有值
- undefined 表示缺少值,即此处应该有值,但没有定义
- typeof null 为 object
- typeof undefined 为 undefined
- null 和 undefined 转换成 number 数据类型时,null 转成 0 undefined 转成 NaN
- NaN 是一个值,当算术运算返回一个未定义的或无法表示的值时产生,typeof NaN 为 number
- isNaN:确定一个值是否为 NaN/只要不是 number 就会返回 true
- isNaN 会对传入的值使用 toNumber 转换一次,例如 isNaN('') 为 true,'' 隐式转换为 0
- Number.isNaN:只有传入的值为 NaN 时才返回 true
- NaN 的意思是 Not a Number,那么不是数字的字符肯定不是一个,而是一个范围,一个集合。就好像 A 不是数字,B 也不是数字,但是 A 肯定不是 B 一样。所以综上 NaN 其实是不等于它自身的
- 类型相同直接比较
- 是否在对比 null 和 undefined,是的话就会返回 true
- 是否为 string 和 number,是的话就将 string 转 number
- 其中一方是否为 boolean,是的话就 boolean 转 number
- 其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就把 object 转为原始类型再进行判断
object 转原始类型(ToPrimitive 方法):
- 先检查该值是否有 valueOf() 方法
- 如果有并且返回基本类型值,就使用该值进行强制类型转换。如果没有就使用 toString() 的返回值来进行强制类型转换
- 如果 valueOf() 和 toString() 均不返回基本类型值,会产生 TypeError 错误
以下这些是 false,除此以外都是 true:
- undefined
- null
- +0、-0 和 NaN
- ""
- 与浮点数在计算机内部(用二进制存储)的表示方法有关
- JS 采用 IEEE 754 标准的 64 位双精度浮点数表示法,这个标准是 20 世纪 80 年代以来最广泛使用的浮点数运算标准,为许多 CPU 与浮点运算器所采用,也被很多语言如 java、python 采用。
这个标准,会让大部分的十进制小数都不能用二进制浮点数来精确表示(比如转成二进制就会变成无限小数)。所以一般情况下,你输入的十进制小数仅由实际存储在计算机中的近似的二进制浮点数表示。
然而,许多语言在处理的时候,在一定误差范围内(通常极小)会将结果修正为正确的目标数字,而不是像 JS 一样将存在误差的真实结果转换成最接近的小数输出
解决:
使用 Number.EPSILON(误差范围)
Number.EPSILON 表示 1 与 Number 可表示的大于 1 的最小的浮点数之间的差值
function isEqual(a, b) {
return Math.abs(a - b) < Number.EPSILON;
}
console.log(isEqual(0.1 + 0.2, 0.3));
- 本质是:二进制模拟十进制进行计算时的精度问题
- 进制转换:js 在做数字计算的时候,0.1 和 0.2 被转成二进制后无限循环,但是 js 采用的 IEEE 754 二进制浮点运算,最大可以存储 53 位有效数字,于是大于 53 位后面的会全部截掉,将导致精度丢失
- 对阶运算:由于指数位数不相同,运算时需要对阶运算,阶小的尾数要根据阶差来右移(0 舍 1 入),尾数位移时可能会发生数丢失的情况,影响精度