大多数开发者认为,像JavaScript这样的动态语言是没有类型的
实则ECMAScript 类型细分为语言类型 和 规范类型
ECMAScript 语言中所有的值都有一个对应的语言类型
Undefined
Null
Boolean
String
Number
Object
对于JavaScript 来说,我们可以定义 “类型”:
对于语言引擎和开发人员来说,类型是值得内部特征,它定义了值得行为,以使其区别于其他值
全面掌握 JavaScript的类型之后,我们旨在改变对强制类型转换的成见,看到它的好处并且意识到它的缺点被过分夸大了
内置类型
JavaScript 有 7 种内置类型:
- 空值 null
- 未定义 undefined
- 布尔值 boolean
- 数字 number
- 字符串 string
- 对象 object
- 符号 symbol
除对象之外,其他统称为 基本类型
typeof 运算符查看值得类型,它返回的是类型的字符串值
typeof undefined === "undefined"
typeof true === "boolean"
typeof 42 === "number"
typeof "42" === "string"
typeof { life: 42 } === "object"
typeof Symbol() === "symbol"
typeof null === "object"
// 我们需要使用复合条件来检测 null 值得类型
var a = null
(!a && typeof a === "object")
typeof funcrion a(){} === "function"
typeof [1, 2, 3] === "object"
复制代码
function (函数) 实际上是 object 的一个 子类型, 具体来说, 函数是 可调用对象 它又一个内部属性[[Call]],该属性使其可以被调用
function a (b, c) {
}
// 函数对象的length属性是其声明的参数的个数
a.length === 2
复制代码
数组也是 object 的一个子类型,数组的元素按数字顺序进行索引,而非普通对象那样通过字符串键值,其length 属性是元素的个数
值和类型
JavaScript 中的变量是没有类型的,只有值才有,变量可以随时持有任何类型的值
换个角度来理解就是,JavaScript不做类型强制,语言引擎不要求变量总是持有与其初始值同类型的值
所以,对变量执行 typeof 操作时,得到的结果并不是该变量的类型,而是该变量持有的值得类型,因为 JavaScript 中的变量没有类型
undefined 和 undeclared
变量在未持有值的时候为 undefined
var a
typeof a // undefined
var b = 42
var c
b = c
typeof b // undefined
typeof c // undefined
复制代码
已在作用域中声明但还没有赋值的变量,是
undefined
的, 相反,还没有在作用域中声明过的变量,是undeclared
的
var a;
a; // undefined
b; // ReferenceError: b is not defined
复制代码
对于
undeclared
变量,typeof 照样返回undefined
, 这是因为 typeof 又一个特殊的安全防范机制
var a;
typeof a; // "undefined"
typeof b; // "undefined"
复制代码
if (DEBUG) {
console.log("Debugging is starting")
}
if (typeof DEBUG !== "undefined") {
console.log("Debugging is starting")
}
复制代码