JS中关于类型的细节

参考: winter 的重学前端


JS 中有哪些类型?

JavaScript语言的每一个值都属于某一种数据类型。JavaScript语言规定了7种语言类型。语言类型广泛用于变量、函数参数、表达式、函数返回值等场合。根据最新的语言标准,这7种语言类型是:

  1. Undefined
  2. Null
  3. Boolean
  4. String
  5. Number
  6. Symbol
  7. Object

Undefined 和 Null

  • Undefined 类型只有一个值,就是 undefined,JS 中任何变量在赋值前,它的类型是 Undefined,值为 undefined。一般可以用 JS 中的全局变量 undefined(就是名为undefined的这个变量)来表达这个值,或者 void 运算来把任一一个表达式变成 undefined 值。

  • Null 类型也只有一个值,就是 null,它的语义表示空值,与 undefined不同,null 是 JavaScript 关键字,所以在任何代码中,都可以放心用 null 关键字来获取 null 值。

undefined 和 null 的区别

undefined跟 null 有一定的表意差别,null 表示的是:定义了但是为空。所以,在实际编程时,我们一般不会把变量赋值为 undefined,这样可以保证所有值为 undefined 的变量,都是从未赋值的自然状态。

Boolean

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

String

String 用于表示文本数据。String 有最大长度是 2^53 - 1。

String 是 UTF16 编码

String 的意义并非“字符串”,而是字符串的 UTF16 编码,我们字符串的操作 charAt、charCodeAt、length 等方法针对的都是 UTF16 编码。所以,字符串的最大长度,实际上是受字符串的编码长度影响的。

String 可以作为值

JavaScript 中的字符串是永远无法变更的,一旦字符串构造出来,无法用任何方式改变字符串的内容,所以字符串具有值类型的特征。

Number

JavaScript中的Number类型有 264-253+3 个值。

Number 里的特殊值

  • NaN,占用了 9007199254740990 个特殊值来表示NaN,这原本是符合IEEE规则的数字;
  • Infinity,无穷大;
  • -Infinity,负无穷大。

+0-0不同

  • 通过检测 1/x 是 Infinity 还是 -Infinity 去区分 x 是 +0 还是 -0 。

浮点数运算的精度问题

  console.log( 0.1 + 0.2 == 0.3) // false

JS 中浮点数运算的精度问题导致等式左右的结果并不是严格相等,而是相差了个微小的值。

正确的比较方法是使用JavaScript提供的最小精度值,检查等式左右两边差的绝对值是否小于最小精度

 console.log( Math.abs(0.1 + 0.2 - 0.3) <= Number.EPSILON) // true

Symbol

Symbol 是个啥?

Symbol 是 ES6 中引入的新类型,就像Number、String、和 Boolean 一样。

如何创建 Symbol 类型

与别的原始类型不同,Symbols 没有字面量语法(例如,String 有 '')—— 创建 Symbol 的唯一方式是使用全局的 Symbol 函数。记住每个被创建出来的symbol 值都是独一无二的。

// 可以不用加参数,加了参数以后,就等于为它们加上了描述,输出的时候我们就能够分清,到底是哪一个值。
let s = Symbol('test')
typeof s // "symbol"
// 每个被 Symbol() 创建的 symbol 都是独一无二的
Symbol('123') === Symbol('123') // false

Symbol 是可以用来干嘛?

  1. 作为对象的属性名,可以保证这个属性名永远不会冲突(不能用. 运算符)
  2. 给予开发者在 API 中为对象改写默认行为的能力
    • 操作ES6中对象内置的 Symbols 属性,例如 Symbol.iterator 等这些内置的 Symbol 可以 JavaScript 内部行为

Object

Object 是 JavaScript 中最复杂的类型,也是 JavaScript 的核心机制之一。Object表示对象的意思,它是一切有形和无形物体的总称。

JS 中的Object ?

在 JavaScript 中,对象的定义是“属性的集合”。属性分为数据属性和访问器属性,二者都是key-value结构,key可以是字符串或者 Symbol类型。

JS 中的类与对象

JavaScript 中的“类”仅仅是运行时对象的一个私有属性,而JavaScript中是无法自定义类型的。

基本类型与 Object 的联系

JavaScript中的几个基本类型,都在对象类型中有一个“亲戚”。它们是:

  • Number
  • String
  • Boolean
  • Symbol

Number、String和Boolean,三个构造器是两用的,当跟 new 搭配时,它们产生对象,当直接调用时,它们表示强制类型转换。

Symbol 函数比较特殊,直接用 new 调用它会抛出错误,但它仍然是 Symbol 对象的构造器。

对象为基本类型提供的便利

日常代码可以把对象的方法在基本类型上使用,例如:

  console.log("abc".length) // 3

原因在于. 运算符提供了装箱操作,它会根据基础类型构造一个临时对象,使得我们能在基础类型上调用对应对象的方法。但是 3new Number(3) 是完全不同的值,它们一个是 Number 类型, 一个是对象类型。

图解

JS中关于类型的细节_第1张图片
JS运行时类型.png

你可能感兴趣的:(JS中关于类型的细节)