本题地址:https://github.com/YvetteLau/Step-By-Step/issues/5
JS中基本数据类型
-
原始数据类型 (不是对象且没有方法)
Boolean、Null、Undefined、Number、String、Symbol(ES6 新增)、BigInt(ES10)
- Boolean 类型
表示一个逻辑实体,有两个值:true 和 false。 - Null 类型
表示缺少的标识,指示变量未指向任何对象。 - Undefined 类型
一个没有被赋值的变量会有个默认值 undefined。 - Number 类型
根据 ECMAScript 标准,Number 基于 IEEE 754 标准的双精度 64 位二进制格式的值(-(263 -1) 到 263 -1)。它并没有为整数给出一种特定的类型。除了能够表示浮点数外,还有一些带符号的值:+Infinity,-Infinity 和 NaN (非数值,Not-a-Number)。 - String 类型
用于表示文本数据。它是一组16位的无符号整数值的“元素”。 - Symbol 类型
表示独一无二的值。 - BigInt 类型
BigInt 是 JavaScript 中的一个新的原始数值类型,它可以以任意精度表示整数。使用 BigInt 可以安全地存储和操作大型整数,甚至超过数字的安全整数限制。一个 BigInt 数据可以通过将 n 附加到 Integer 的末尾或通过调用构造函数创建。
- Boolean 类型
复杂数据类型
Object
(emmm 这个内容太多了)
null 是对象吗?
不是。null 值表示缺少的标识,指示变量未指向任何对象。
The value null is written with a literal: null. null is not an identifier for a property of the global object, like undefined can be. Instead, null expresses a lack of identification, indicating that a variable points to no object.
---------- 下面是刘小夕的答案 -----------
null 不是一个对象,尽管 typeof null 输出的是 Object,这是一个历史遗留问题,JS 的最初版本中使用的是 32 位系统,为了性能考虑使用低位存储变量的类型信息,000 开头代表是对象,null 表示为全零,所以将它错误的判断为 Object 。
基本数据和复杂数据类型有什么区别?
- 基本数据类型: 存放在栈内存中,它们是按值存放的
- 引用数据类型: 存放在堆内存当中,它们是按引用地址存放的
在变量赋值或函数传参时,数据传递的方式会有不同,基本类型是复制一份值进行传递,引用类型则是传递了内存地址。
---------- 下面是刘小夕的答案 -----------
- 内存的分配不同
基本数据类型存储在栈中。
复杂数据类型存储在堆中,栈中存储的变量,是指向堆中的引用地址。
- 访问机制不同
基本数据类型是按值访问。
复杂数据类型按引用访问,JS不允许直接访问保存在堆内存中的对象,在访问一个对象时,首先得到的是这个对象在堆内存中的地址,然后再按照这个地址去获得这个对象中的值。
- 复制变量时不同
基本数据类型:a=b;是将b中保存的原始值的副本赋值给新变量a,a和b完全独立,互不影响。
复杂数据类型:a=b;将b保存的对象内存的引用地址赋值给了新变量a;a和b指向了同一个堆内存地址,其中一个值发生了改变,另一个也会改变。
let b = {
age: 10
}
let a = b;
a.age = 20;
console.log(a); // { age: 20 }
- 参数传递的不同(实参/形参)
函数传参都是按值传递(栈中的存储的内容):基本数据类型,拷贝的是值;复杂数据类型,拷贝的是引用地址。
// 基本数据类型
let b = 10
function change(info) {
info=20;
}
// info=b; 基本数据类型,拷贝的是值得副本,二者互不干扰
change(b);
console.log(b); // 10
// 复杂数据类型
let b = {
age: 10
}
function change(info) {
info.age = 20;
}
// info=b; 根据第三条差异,可以看出,拷贝的是地址的引用,修改互相影响。
change(b);
console.log(b); // { age: 20 }