每一种编程语言都有数据结构,但他们各有不同之处。JavaScript 是一种动态语言,变量的类型不用提前声明,你可以使用同一个变量来保存不同的数据类型。
这就和Python的写法差不多:
数据类型
ECMAScript 标準明确定义了7种数据类型:6种原始类型 (Primitive value) 和Object。
原始数据类型:
- Undefined
- Null
- Boolean
- Number
- String
- Symbol (ECMAScript 2015)
判断方法
我们可以透过使用typeof和Object.prototype.toString()来判断数据类型。
typeof
在一开始设计 JavaScript 时,数值是由一个标签以及实际数据值表示的。对于基本类型,标签是1;而对于对象类型,标签是0。由于null代表的是空指针(里面都是0),null的类型标签会是0。因此typeof null就会返回”object”;
|
|
我们可以看一下ECMAScript是怎样定义typeof的:
- Let val be the result of evaluating UnaryExpression.
- If Type(val) is Reference, then
a. If IsUnresolvableReference(val) is true, return “undefined”. - Set val to ? GetValue(val).
- Return a String according to Table 35.
Table 35: typeof Operator Results
| Typeof val | 结果 |
|---|---|
| Item One | Item Two |
| Type of val | Result |
| Undefined | “undefined” |
| Null | “object” |
| Boolean | “boolean” |
| Number | “number” |
| String | “string” |
| Symbol | “symbol” |
| Object (ordinary and does not implement [[Call]]) | “object” |
| Object (standard exotic and does not implement [[Call]]) | “object” |
| Object (implements [[Call]]) | “function” |
| Object (non-standard exotic and does not implement [[Call]]) | Implementation-defined. Must not be “undefined”, “boolean”, “function”, “number”, “symbol”, or “string”. |
另外,如果直接用typeof来判断 NaN 的话,它会返回"number",对于 NaN 我们可以用isNaN方法来判断是否一个数字。
Object.prototype.toString()
我们可以利用Object.prototype.toString.call()或者Object.prototype.toString.apply()这两个方法判断 Object 的类型,以及 null:
ECMAScript 19.1.3.6 明确定义 Object.prototype.toString():
- If the
thisvalue isundefined, return"[object Undefined]". - If the
thisvalue isnull, return"[object Null]". - Let
Obe ! ToObject(thisvalue). - Let
isArraybe ? IsArray(O). - If
isArrayistrue, letbuiltinTagbe"Array". - Else if
Ois a String exotic object, letbuiltinTagbe"String". - Else if
Ohas a [[ParameterMap]] internal slot, letbuiltinTagbe"Arguments". - Else if
Ohas a [[Call]] internal method, letbuiltinTagbe"Function". - Else if
Ohas an [[ErrorData]] internal slot, letbuiltinTagbe"Error". - Else if
Ohas a [[BooleanData]] internal slot, letbuiltinTagbe"Boolean". - Else if
Ohas a [[NumberData]] internal slot, letbuiltinTagbe"Number". - Else if
Ohas a [[DateValue]] internal slot, letbuiltinTagbe"Date". - Else if
Ohas a [[RegExpMatcher]] internal slot, letbuiltinTagbe"RegExp". - Else, let
builtinTagbe"Object". - Let
tagbe ? Get(O, @@toStringTag). - If Type(
tag) is not String, lettagbebuiltinTag. - Return the String that is the result of concatenating
"[object ",tag, and"]".