JavaScript 数据类型(7 种)

# JavaScript 数据类型(7 种)

  • Undefined
  • Null
  • Boolean
  • String
  • Number
  • Symbol
  • Object

# Undefined 和 Null

  1. Undefined 类型表示未定义,他的类型只有一个值,就是 undefined。任何变量在赋值前是 Undefined 类型、值为 undefined。

  2. JavaScript 的代码 undefined 是一个变量,而并非是一个关键字,为了避免无意中被篡改,建议使用 void 0 来获取 undefined 值

  3. NUll 类型也只有一个值,就是 null,它的语义表示空值

  4. null 与 undefined 不同,null 是 JavaScript 关键字,在任何代码中,可放心用 null 关键字来获取 null 值

# Boolean

  • Boolean 类型有两个值,true 和 false,它用于表示逻辑意义上的真和假,有关键字 true 和 false 来表示两个值

# String

  1. String 的意义表示文本数据。String 有最大长度是 2^53 - 1
  2. String 的意义并非“字符串”,而是字符串的 UTF16 编码,所以超过 U+0000-U+FFFF 范围的字符时,应该格外小心
  3. 字符串时永远无法变更的,一旦构造处理,无法用任何方式改变字符串的内容
let test = 'string'
test[0] = '1'
console.log(test) // string
1
2
3

# Number

  • Number 类型表示通常意义上的“数字”,大致对应数学中的有理数,有一定精度限制
  • JavaScript 中的 Number 类型有 2^64-2^53+3 个值
  • JavaScript 的 Number 类型基本复合双精度浮点数规则 特殊:
  1. NaN, 不是一个数字
  2. Infinity: 无穷大
  3. -Infinity: 负无穷大
  4. +0 和-0,区分 +0 和 -0 的方式,正是检测 1/x 是 Infinity 还是 -Infinity
  5. Number 类型中有效的整数范围是 -0x1fffffffffffff 至 0x1fffffffffffff,所以 Number 无法精确表示此范围外的整数
  6. 非整数的 Number 类型无法用==(===)来比较
console.log(0.1 + 0.2 == 0.3) // false
// 正确的比较方法使用js提供的最小精度值
console.log(Math.abs(0.1 + 0.2 - 0.3) <= Number.EPSILON)
1
2
3

# Symbol

  1. Symbol 是 Es6 中引入的新类型,是一切非字符串的对象 key 的集合
  2. 创建 Symbol 的方式是使用全局的 Symbol 函数;即使描述相同,Symbol 也不相等
let mySymbol1 = Symbol('my symbol')
let mySymbol2 = Symbol('my symbol')
console.log(mySymbol1 === mySymbol2) // false
1
2
3

# Object

  • Object 是 JavaScript 中最复杂的类型,Object 表示对象的意思,是一切有形和无形的总称
  • 对象定义是“属性的集合”,key-value 结构,key 可以是字符串或者 Symbol 类型
  • JavaScript 是无法自定义类型的 注意:
  1. 3 和 new Number(3)是完全不同的值,一个是 Number 类型, 一个是对象类型
  2. Number、String 和 Boolean,三个构造器两用,当跟 new 搭配时,产生对象,直接调用时,表示强制类型转换
  3. Symbol 比较特殊,直接用 new 调用它会报错,但它仍然是 Symbol 对象的构造器

# 存储地方

基本类型保存在栈中,引用类型保存在堆中。

  • 栈空间 栈是内存中一块用于存储局部变量和函数参数的线性结构,遵循先进后出的原则。栈由内存中占据一片连续的存储空间,出栈与入栈仅仅是指指针在内存中的上下移动。栈空间一般不会设置太大,基本类型在内存中占有固定大小的时间,所以它们的值保存在栈空间,通过 按值访问

  • 堆 堆数据结构是一种数状结构。它的存取方式与书架和书非常相似,只需要知道书的名字就可以直接取出书。对象就会被存储在堆中,在栈中只是保留了对象在堆中的地址,也就是对象的引用,对于这种,叫做 按引用访问。引用类型的值大小不固定,不能保存在栈内存中。

  • 闭包除外,JS 闭包中的变量值并不保存中栈内存中,而是保存在堆内存中

上次更新: 4/15/2021, 7:13:30 PM