JavaScript类型

类型

要正确合理地进行类型转换(参见第 4 章),我们必须掌握 JavaScript 中的各个类型及其内 在行为。几乎所有的 JavaScript 程序都会涉及某种形式的强制类型转换,处理这些情况时 我们需要有充分的把握和自信。

内置类型

JavaScript 有七种内置类型(也称基本类型):

• 空值(null)
• 未定义(undefined)
• 布尔值(boolean)
• 数字(number)
• 字符串(string)
• 对象(object)
• 符号(symbol,ES6中新增)

typeof运算符

需要注意的是,null类型比较特殊

typeof null === “object”; // true

所以需要复合条件来检测null值类型:

1
2
var a = null
(!a && typeof a === 'object'); //true

还有一种情况

1
typeof function a() { /* ... */} === 'function'  //true

function实际上是object的一个‘子类型’

函数不仅是对象,还可以拥有属性。例如:

1
2
3
     function a(b,c) {
/* .. */
}

函数对象的 length 属性是其声明的参数的个数:

1
a.length; // 2

因为该函数声明了两个命名参数,b 和 c,所以其 length 值为 2。

数组也是object的一个‘子类型’

1
typeof [1,2,3] === "object"; // true

值和类型

JavaScript 不做“类型强制”;也就是说,语言引擎不要求变量总是 持有与其初始值同类型的值。一个变量可以现在被赋值为字符串类型值,随后又被赋值为 数字类型值。

当变量未持有值的时候为undefined,此时typeof返回‘undefined’

1
2
var a;
typeof a; // "undefined"

undefined(声明未赋值)与undeclared(未声明)

1
2
3
var a;
a; // undefined
b; // ReferenceError: b is not defined

但需要注意的是,typeof运算符对两种情况都一样的结果:

1
2
3
var a;
typeof a; // "undefined"
typeof b; // "undefined"

typeof Undeclared

顶层的全局变量声明 var DEBUG = true 只在 debug.js 文件中才有,而该文件只在开发和测试时才被加载到浏览器,在生产环 境中不予加载。

问题是如何在程序中检查全局变量 DEBUG 才不会出现 ReferenceError 错误。这时 typeof 的 安全防范机制就成了我们的好帮手:

1
2
3
4
5
6
7
8
9
//这样会抛出错误
if (DEBUG) {
console.log( "Debugging is starting" )
}

//这样是安全的
if (typeof DEBUG !== 'undefined') {
console.log('Debugging is starting')
}

这不仅对用户定义的变量有用,也对内建的API有帮助:

1
2
3
if(typeof atob === 'undefined') {
atob = function() { /* ... */ }
}

除了使用typeof运算符,也可以使用window全局对象,因为访问不存在的对象属性不会有ReferenceError错误。问题在于,全局对象并不总是window,例如在服务器端,node.js等

1
2
3
4
5
6
    if (window.DEBUG) {
// ..
}
if (!window.atob) {
// ..
}

总之,typeof的安全防范机制为我们提供了更多选择

小结

JavaScript 有 七 种 内 置 类 型:null、undefined、boolean、number、string、object 和
symbol,可以使用 typeof 运算符来查看。

变量没有类型,但它们持有的值有类型。类型定义了值的行为特征。

很多开发人员将 undefined 和 undeclared 混为一谈,但在 JavaScript 中它们是两码事。 undefined 是值的一种。undeclared 则表示变量还没有被声明过。遗憾的是,JavaScript 却将它们混为一谈,在我们试图访问 “undeclared” 变量时这样报 错:ReferenceError: a is not defined,并且typeof对undefined和undeclared变量都返回 “undefined”。

然而,通过 typeof 的安全防范机制(阻止报错)来检查 undeclared 变量,有时是个不错的 办法。