在 JavaScript 中,我们常常会看到这样的代码:变量与 null 的比较(这种用法很有问题),用来判断变量是否被赋予了一个合理的值。比如:
var Controller = {process: function(items) {if (items !== null) { // 不好的写法items.sort();items.forEach(function(item) {// 执行一些逻辑});}}}
在这段代码中, process() 方法显然希望 items 是一个数组,因为我们看到 items 拥有 sort() 和 forEach() 。这段代码的意图非常明显:如果参数 items 不是一个组数,则停止接下来的操作。这种写法的问题在于,和 null 的比较并不能真正避免错误的发生。 items 的值可以是1,也可以是是字符串,甚至可以是任意对象。这些值都和 null 不相等,进而会导致 process() 方法一旦执行到 sort() 时就会出错。
仅仅和 null 比较并不能提供足够的信息来判断后续代码的执行是否真的安全。好在 JavaScript 为我们提供了很多种方法来检测变量的真实值。
检测原始值
在 JavaScript 中有5种原始类型(也称为简单数据类型): String 、 Number 、 Boolean 、 Undefined 和 Null 。如果你希望一个值是 String 、 Number 、 Boolean 或 Undefined ,最佳选择是使用 typeof 运算符,它会返回一个表示类型的字符串。
对于字符串, typeof 返回 "string" 。
对于数字, typeof 返回 "number" 。
对于布尔值, typeof 返回 "boolean" 。
对于undefined, typeof 返回 "undefined" 。
typeof 的基本语法是: typeof variable ,你还可以这样用: typeof(variable) ,尽管这是合法的 JavaScript 语法,这种用法让 typeof 看起来像一个函数而非运算符。鉴于此,我们更推荐无括号的写法。
使用 typeof 来检测这4种原始类型是非常安全的做法。来看下面这些例子。
// 检测"String"if (typeof name === "string") {anotherName = name.substring(3);}// 检测"Number"if (typeof count === "number") {updateCount(count);}// 检测"Boolean"if (typeof found === "boolean" && found) {message("Found!");}// 检测"Undefined"if (typeof MyApp === "undefined") {MyApp = {// 其他代码};}
typeof 运算符的独特之处在于,将其用于一个未声明的变量也不会报错。未定义的变量和值为 undefined 的变量通过 typeof 都将返回 "undefined" 。
最后一个原始类型 null ,通过 typeof 将返回 "object" ,这看上去很怪异,被认为是标准规范的严重 bug,因此在编程时要 杜绝使用 typeof 来检测 null 的类型 。
console.log(typeof null); // "object"
简单地和 null 进行比较通常不会包含足够的信息以判断值的类型是否合法,所以 null 一般不应用于检测语句。
但有一个例外,如果所期望的值真的是 null ,则可以直接和 null 进行比较。例如:
新闻热点
疑难解答
图片精选