# 1 数据类型基础

⚡ 30 秒速记

  • 8 种类型:7 个原始类型(numberstringbooleannullundefinedsymbolbigint)+ 1 个引用类型 Object
  • 存储差异:原始类型的存在栈上;引用类型的值在堆上,栈里只存地址 —— 赋值时前者拷贝值、后者拷贝地址
  • null 表示"有意的空值",undefined 表示"未赋值"——函数无返回值、变量声明未初始化都是后者
  • ⚠️ typeof null === 'object' 是历史遗留 bug(早期用类型标签低三位判断,null 全 0 被误判为对象)
  • 0.1 + 0.2 !== 0.3 源于 IEEE 754 双精度浮点:十进制小数无法精确表示;金额计算要用整数分或 decimal

JavaScript 有七种基本类型,以及以 Object 为代表的引用类型。 基本类型赋值时复制值,引用类型赋值时复制对象地址,所以修改共享对象会影响所有指向它的变量。null 表示有意设置的空值,undefined 通常表示尚未赋值;虽然 typeof null 返回 object,但这只是早期类型标记造成的历史问题。数字采用 IEEE 754 双精度浮点表示,因此小数和超大整数都要注意精度边界。

# 1.1 JS内置类型

  • JS 中分为七种内置类型,七种内置类型又分为两大类型:基本类型和对象(Object)。
  • 基本类型有七种: nullundefinedbooleannumberstringsymbol, bigint
    • BigIntES10 新增的数据类型
    • Symbol 代表独一无二的值,最大的用法是用来定义对象的唯一属性名。
    • BigInt 可以表示任意大小的整数。
  • 其中 JS 的数字类型是浮点类型的,没有整型。并且浮点类型基于 IEEE 754标准实现,在使用中会遇到某些 Bug。NaN 也属于 number 类型,并且 NaN 不等于自身。
  • 对于基本类型来说,如果使用字面量的方式,那么这个变量只是个字面量,只有在必要的时候才会转换为对应的类型。

引用数据类型:

  • 对象Object(包含普通对象-Object,数组对象-Array,正则对象-RegExp,日期对象-Date,数学函数-Math,函数对象-Function
let a = 111 // 这只是字面量,不是 number 类型
a.toString() // 使用时候才会转换为对象类型

对象(Object)是引用类型,在使用过程中会遇到浅拷贝和深拷贝的问题。

let a = { name: 'FE' }
let b = a
b.name = 'EF'
console.log(a.name) // EF

说出下面运行的结果,解释原因。

function test(person) {
  person.age = 26
  person = {
    name: 'hzj',
    age: 18
  }
  return person
}
const p1 = {
  name: 'fyq',
  age: 19
}
const p2 = test(p1)
console.log(p1) // -> ?
console.log(p2) // -> ?
webapp
公众号
开发者导航
切换夜间模式
点击侧边栏上一篇
点击侧边栏下一篇
折叠侧边栏
收起全部