JS数据类型及typeof的底层机制
1】: “原始值类型”(基本数据类型/值类型)
number: NaN、Infinity、正常数字
string: 普通字符串、模板字符串
boolean: true、false
null: 表示空,null 代表空值,一个空的对象指针
undefined: 表示变量被声明了,但是没有赋值,就等于 undefined
Symbol: 表示唯一值
1) Symbol('hello') === Symbol('hello') // false
2) 对象中添加唯一的属性
let obj = {
[Symbol('only')]: 100
}
Symbol.iterator: for of循环的底层处理方法
Symbol.toStringTag: Object.prototype.toString.call()的底层原理
Symbol.hasInstance: instanceof的底层原理
Symbol.toPrimitive: 获取原始值【数据类型转换、比较】的底层原理
Symbol的核心在底层机制上
bigInt: 大数
JS有最大、最小数字限制
- 最大安全数字: console.log(Number.MAX_SAFE_INTEGER) // 9007199254740991
- 最小安全数字: Number.MIN_SAFE_INTEGER // -9007199254740991
服务端返回一个数字并且数字超过了最大安全数
+ 如果只需要展示出来,把服务端返回的数字转为字符串就可以了
+ 但是如果需要运算,需要用BigInt的处理
2】: 对象数据类型
1) object
+ {} 纯对象
+ [] array
+ /^$/ 正则RegExp
+ new Date()
2) function函数类型【可执行对象】typeof function() {} 'function'
typeof数据类型检测
typeof 数据 => 返回的结果是字符串类型 , “类型”
typeof NaN // "number"
typeof Infinity // 'number'
typeof null // 'object'
typeof undefined // 'undefined'
typeof "" // "string"
typeof Symbol() // 'symbol'
typeof 10n // 'bigint'
typeof {} // "object"
typeof [] // "object"
typeof /^$/ "object"
typeof new Date() // "object"
typeof function() {} // "function"
typeof (() => {}) // "function"
typeof function* (){} // "function"
typeof检测数据类型的特殊情况:
1.typeof null => "object"
2.检测对象的数据类型,除了可执行对象(函数: 能够调用call方法的 普通函数、构造函数、箭头函数、生成器函数)检测出来的结果是“function”,其余的结果都是“object”
为啥typeof null 是“object”为啥?
typeof检测数据类型的底层机制:
浏览器在识别编译typeof null代码的时候解析成 C++语言 能够识别的,浏览器是用C++开发的
+ 所有数据类型在计算机中都是按照二进制值存储的,
+ 如果是整数在计算机中按照二进制存储的值是以1开始的,
+ 如果是浮点数(小数)在计算机中按照二进制存储的值是以010开始的,
+ 如果是字符串在计算机中按照二进制存储的值是以100开始的,
+ 如果是布尔值在计算机中按照二进制存储的值是以110开始的,
+ 如果是对象在计算机中按照二进制存储的值是以000开始的,
+ 如果是undefined在计算机中按照二进制存储的值是以-2^30开始的,
+ 如果是null在计算机中按照二进制存储的值是以00000开始的,
+ 整数:1 , 浮点数:010, 字符串:100, 布尔值: 110, 对象: 000, undefined: -2^30, null: 000000
typeof检测数据类型的底层机制(重点): typeof底层机制就是判断这些二进制的值,如果是以000开头,都是对象【特殊:排除函数】返回的是"object",此时null也是以000开头,所以返回的也是“object”。通过这些值来判断数据类型、
优点: typeof它的稳定性与性能也是很好的