一、类型
基本类型
JavaScript 定义了七种内建类型:
null
undefined
boolean
number
string
symbol – 在 ES6 中被加入的!
object
注意: 除了 object 所有这些类型都被称为“基本类型(primitives)”。
类型检测
typeof 操作符可以检测给定值的类型,而且总是返回七种字符串值中的一种
1 | typeof undefined === "undefined"; // true |
在上面的列表中剔除了 null。它是 特殊的 – 特殊在它与 typeof 操作符组合时是有 bug 的。
1 | typeof null === "object"; // true |
undefined vs “undeclared”
当前 还不拥有值的变量,实际上拥有 undefined 值。对这样的变量调用 typeof 将会返回 "undefined"
:
1 | var a; |
大多数开发者考虑“undefined”这个词的方式会诱使他们认为它是“undeclared(未声明)”的同义词。然而在 JS 中,这两个概念十分不同。
一个“undefined”变量是在可访问的作用域中已经被声明过的,但是在 这个时刻 它里面没有任何值。相比之下,一个“undeclared”变量是在可访问的作用域中还没有被正式声明的。
考虑这段代码:
1 | var a; |
在上面代码中,b未声明时进行了使用,浏览器反馈的错误是:b is not defined
.这当然很容易而且很合理地使人将它与“b is undefined.”搞混。需要重申的是,“undefined”和“is not defined”是非常不同的东西。要是浏览器能告诉我们类似于“b is not found”或者“b is not declared”之类的东西就好了,那会减少这种困惑!
1 | var a; |
type
对于未undeclared的变量,返回值也是undefined
。即使 是一个未声明变量,也不会有错误被抛出。这是 typeof 的一种特殊的安全防卫行为
typeof Undeclared
由于typeof安全防卫的特性,我们可以将其用来判断一个变量是否在作用域内进行了赋值操作,倘若不使用typeof,若变量不存在将会发生异常
1 | if (typeof sss === "undefined") { |
// 噢,这将抛出一个错误!
if (DEBUG) {
console.log( “Debugging is starting” );
}
// 这是一个安全的存在性检查
if (typeof DEBUG !== “undefined”) {
console.log( “Debugging is starting” );
}`