JS中的数据类型
数据类型分类
- 原始值类型(俗称:值类型,基本数据类型)
- number 特殊的number:NaN 判断方法:isNaN & Object.is(Value1,Value2) Infinity:正无穷大
- string
- boolean
- null
- undefined
- symbol 给对象设置唯一值属性(对象属性名类型:字符串、Symbol) Symbol.hasInstance/toStringTag/toPrimitive...
- bigint Number.MAX_SAFE_INTEGER/MIN_SAFE_INTEGER JS中的最大/最小安全数字 数字后面加n就是bigint类型的中,例如:9007199254740991n,bigint值保证我们超过安全数字,计算也可以准确 服务器返回超大数字,我们可以把其转换为bigint再进行运算;运算完的结果,变为字符串传递给服务器即可
- 对象类型(俗称:引用数据类型)
- 标准普通对象
function Person () {
this.name = '张三',
this.age = 20,
this.sayName = function () {
console.log(this.name);
}
}
- 标准特殊对象 数组、正则、日期、错误...
- 非标准特殊对象 原始类型的值,基于构造函数,new出来的实例对象
let a = new Number(1);
- 可调用/执行对象(函数对象) function
JS中的数据类型检测
- typeof
- 检测结果是一个字符串,字符串中包含对应的数据类型
console.log(typeof typeof typeof 10); //"string"
- 局限性(特点)
- typeof null 结果是:"object"
- typeof检测对象类型,除函数对象返回"function",其余都是返回"object"(不能细分对象)
- typeof检测一个未被声明的变量,不会报错,而是返回"undefined"
- 底层处理机制
- 所有的数据类型值,在计算机底层都是按照“二进制”来存储的(64位)
- typeof检测数据类型,就是按照存储的“二进制值”来进行检测的:前三位是000的,都被认为是对象(如果对象内部实现了[[Call]]方法,则认为是函数,返回"function"),返回值是"object"...
- 由于typeof是根据底层判断,所以typeof的性能会相对好一些
- instanceof
- constructor
- Object.prototype.toString.call()
JS执行时的堆栈内存以及VO、AO
浏览器会从计算机的内存条中分配出对应的内存,用来存储值和运行代码
- Stack:栈内存 ECStack(Execution Context Stack)
- 原始值类型存储在栈内存中
- 提供对应的执行上下文EC供代码执行
- EC(G)全局执行上下文,全局代码都在这里执行
- VO(G)全局变量对象,存储全局上下文中声明的变量**(基于let/const声明的变量放在这里,基于var/function声明的变量是直接存储到GO中的)**
- Heap:堆内存
- 存储对象类型的值
- GO:全局对象(global object)
- 被分配一个内存空间,用来存储内置的API
- var 变量 = 值
- 先创建值
- 声明变量(declare)
- 变量和值关联(defined)赋值
- 全局上下文中使用变量
- 先看VO(G)中是否有
- 再看GO中是否有
- 如果都没有就报错,变量未被定义
- 变量赋值优先级 a.x = b = 10;
- 创建值10
- a.x是成员访问,优先级比较高,执行a.x = 10;
- b = 10;
- 正常顺序:从右到左,遇到优先级较高的,则先执行优先级高的操作
例题:
var a = {
n: 1
};
var b = a;
a.x = a = {
n: 2
};
console.log(a.x); //"undefined"
console.log(b); //{ n:1, x:{ n:2 } }