LanguageTypes

ECMAScript语言类型对应于ECMAScript程序员使用ECMAScript语言直接操作的值。 ECMAScript语言类型是UndefinedNullBooleanStringSymbolNumberBigIntObject。 ECMAScript语言值是以ECMAScript语言类型为特征的值。

Undefined Type

Undefined类型恰好有一个值,称为Undefined。任何未分配值的变量都具有Undefined的值。

Null Type

Null类型也只有一个值,称为Null

Boolean Type

布尔类型表示一个具有两个值的逻辑实体,称为true和false。

String Type

字符串类型是零或多个16位Unicode字符序列,最大长度为253 - 1个元素。

字符串类型通常用于表示正在运行的ECMAScript程序中的文本数据,在这种情况下,字符串中的每个元素都被视为UTF-16代码单位值。 每个元素都被视为在序列中占据一个位置。这些位置用非负整数进行索引。 第一个元素(如果有的话)在索引0处,下一个元素(如果有的话)在索引1处,以此等。 字符串的长度是其中的元素数量(即16位值)。空字符串的长度为零,因此不包含任何元素。

更多可见String Object

Symbol Type

符号类型是所有非字符串值的集合,可以用作对象属性的键。

每个可能的符号值都是唯一且不可变的。

每个符号值不可变地包含一个名为[[Description]]的关联值,该值要么是Undefined,要么是String

Well-Know Symbols

众所周知的符号是内置的符号值,由ES规范的算法明确引用。

它们通常用作属性的键,其值作为ES规范算法的扩展点。除非另有说明,否则众所周知的符号值由所有共享。

在ES规范中,使用@@name形式的符号来引用一个众所周知的符号,其中“Name”是下表中列出的值之一。

Specification Name[[Description]]Value and Purpose
@@asyncIterator"Symbol.asyncIterator"返回对象默认AsyncIterator的方法。由for-await-of语句的语义调用。
@@hasInstance"Symbol.hasInstance"一种确定构造函数对象是否将对象识别为构造函数实例之一的方法。由instanceof运算符的语义调用。
@@isConcatSpreadable"Symbol.isConcatSpreadable"一个布尔值属性,如果为真,则表示对象应由Array.prototype.concat将其扁平化为其数组元素。
@@iterator"Symbol.iterator"返回对象默认Iterator的方法。由for-of语句的语义调用。
@@match"Symbol.match"将正则表达式与字符串匹配的正则表达式方法。由String.prototype.match方法调用。
@@replace"Symbol.replace"返回一个惯例的正则表达式方法,该方法产生正则表达式与字符串的匹配。由String.prototype.matchAll方法调用。
@@search"Symbol.search"替换字符串匹配子字符串的正则表达式方法。由String.prototype.replace方法调用。
@@species"Symbol.species"函数值属性,用于创建派生对象的构造函数。
@@split"Symbol.split"在与正则表达式匹配的索引处拆分字符串的正则表达式方法。由String.prototype.split方法调用。
@@toPrimitive"Symbol.toPrimitive"将对象转换为相应原始值的方法。由ToPrimitive抽象操作调用。
@@toStringTag"Symbol.toStringTag"用于创建对象的默认字符串描述的字符串值属性。由内置方法Object.prototype.toString访问。
@@unscopables"Symbol.unscopables"一个具有对象价值的属性,其自身和继承的属性名称是从关联对象的环境绑定中排除的属性名称。

Numberic Types

ECMAScript有两种内置的数字类型:Number和BigInt。

以下抽象操作是在这些数字类型上定义的。“结果”列显示返回类型,并指示是否可能对操作的某些调用返回突然完成。

OperationExample sourceInvoked by the Evaluation semantics of ...Result
Number::unaryMinus
BigInt::unaryMinus
-x/~xUnary - OperatorNumber/BigInt
Number::bitwiseNOT
BigInt::bitwiseNOT
~x/~xBitwise NOT Operator ( ~ )Number/BigInt
Number::exponentiate
BigInt::exponentiate
x ** yExponentiation Operator and Math.pow ( base, exponent )Number/either a normal completion containing a BigInt or a throw completion
Number::multiply
BigInt::multiply
x * yx * y Multiplicative OperatorsNumber/BigInt
Number::divide
BigInt::divide
x / yMultiplicative OperatorsNumber/either a normal completion containing a BigInt or a throw completion
Number::remainder
BigInt::remainder
x % yMultiplicative Operators NumberNumber/either a normal completion containing a BigInt or a throw completion
Number::add
BigInt::add
x ++,++ x,x+yPostfix/Prefix Increment Operator, and The Addition Operator ( + )Number/BigInt
Number::subtract
BigInt::subtract
x--,--x, x-yPostfix/Prefix Increment Operator, and The Subtraction Operator ( - )Number/BigInt
Number::leftShift
BigInt::leftShift
x << yThe Left Shift Operator ( << ) NumberNumber/BigInt
Number::signedRightShift
BigInt::signedRightShift
x >> yThe Signed Right Shift Operator ( >> ) NumberNumber/BigInt
Number::unsignedRightShift
BigInt::unsignedRightShift
x >>> yThe Unsigned Right Shift Operator ( >>> ) NumberNumber/BigInt
Number::unsignedRightShift
BigInt::unsignedRightShift
x >>> yThe Unsigned Right Shift Operator ( >>> ) NumberNumber/a throw completion
Number::lessThan
BigInt::lessThan
x < = y , x >= yRelational Operators, via IsLessThan ( x, y, LeftFirst )Boolean or undefined (for unordered inputs)/Boolean
Number::equal
BigInt::equal
x == y x!=yEquality Operators, via IsStrictlyEqual ( x, y )Boolean
Number::sameValue
BigInt::sameValue
Object.is(x, y)Object internal methods, via SameValue ( x, y ), to test exact value equalityBoolean
Number::sameValueZero
BigInt::sameValueZero
[x].includes(y)Array, Map, and Set methods, via SameValueZero ( x, y ), to test value equality, ignoring the difference between +0𝔽 and -0𝔽Boolean
Number::bitwiseAND
BigInt::bitwiseAND
x & yBinary Bitwise OperatorsNumber/BigInt
Number::bitwiseXOR
BigInt::bitwiseXOR
x ^ yBinary Bitwise OperatorsNumber/BigInt
Number::bitwiseOR
BigInt::bitwiseOR
xyBinary Bitwise Operators
Number::toString
BigInt::toString
String(x)Many expressions and built-in functionsString

由于数字类型通常不能在不损失精度或截断的情况下进行转换,因此ECMAScript语言在这些类型之间不提供隐式转换。 在调用需要另一种类型的函数时,程序员必须显式调用Number和BigInt函数才能在类型之间进行转换。

Object Type

对象类型的每个实例,也简称为“对象”,代表属性的集合。每个属性要么是(data property)数据属性,要么是(accessor property)访问器属性:

  • 数据属性将键值与ECMAScript语言值和一组布尔属性相关联。
  • 访问器属性将一个键值与一个或两个访问器函数以及一组布尔属性相关联。访问器函数用于存储或检索与属性关联的ECMAScript语言值。

对象的属性使用属性键进行唯一标识。属性键要么是字符串,要么是符号(Symbol)。所有字符串和符号,包括空字符串,都作为属性键有效。属性名称是字符串的属性键。

整数索引属性的范围是 +0 - 2^53 - 1 ,而数组的索引范围是+0 - 2^53 - 2

Property Keys用于访问属性及其值。属性有两种访问:获取和设置,分别对应于值检索和赋值。 通过getset访问的属性既包括作为对象直接部分的自有属性,也包括由另一个关联对象通过属性继承关系提供的继承属性。 继承的属性可以是关联对象的自己的或继承的属性。对象的每个自有属性都必须有一个与该对象的其他自有属性的键值不同的键值。

此外,一些对象是可调用的;这些被称为函数或函数对象,下文将进一步描述。ECMAScript中的所有函数都是对象类型的成员。