值和类型
JavaScript 中的变量是没有类型的,只有值才有。变量可以随时持有任何类型的值。
换个角度来理解就是,JavaScript 不做“类型强制”;也就是说,语言引擎不要求变量总是 持有与其初始值同类型的值。一个变量可以现在被赋值为字符串类型值,随后又被赋值为 数字类型值。
42 的类型为 number,并且无法更改。而 "42" 的类型为 string。数字 42 可以通过强制类型 转换(coercion)为字符串 "42"
在对变量执行 typeof 操作时,得到的结果并不是该变量的类型,而是该变量持有的值的类 型,因为 JavaScript 中的变量没有类型。
var a = 42; typeof a; // "number"
a = true; typeof a; // "boolean"
typeof 运算符总是会返回一个字符串:
typeof typeof 42; // "string"
typeof 42 首先返回字符串 "number",然后 typeof "number" 返回 "string"。
undefined 和 undeclared
变量在未持有值的时候为 undefined。此时 typeof 返回 "undefined":
大多数开发者倾向于将 undefined 等同于 undeclared(未声明),但在 JavaScript 中它们完全 是两回事。
已在作用域中声明但还没有赋值的变量,是 undefined 的。相反,还没有在作用域中声明 过的变量,是 undeclared 的。
例如:
var a; a; // undefined
b; // ReferenceError: b is not defined
浏览器对这类情况的处理很让人抓狂。上例中,“b is not defined”容易让人误以为是“b is undefined”。这里再强调一遍,“undefined”和“is not defined”是两码事。此时如果浏览器 报错成“b is not found”或者“b is not declared”会更准确。
更让人抓狂的是 typeof 处理 undeclared 变量的方式。例如: var a; typeof a; // "undefined" typeof b; // "undefined"
对于 undeclared(或者 not defined)变量,typeof 照样返回 "undefined"。请注意虽然 b 是 一个 undeclared 变量,但 typeof b 并没有报错。这是因为 typeof 有一个特殊的安全防范 机制。
此时 typeof 如果能返回 undeclared(而非 undefined)的话,情况会好很多。