文章目录

  1. 1. 检测基本值
  2. 2. 检测对象
  3. 3. 检测属性
  4. 4. 参考文献

在JavaScript中数据类型有string、number、boolean、function、object、undefined。基本值有string、number、boolean、undefined。其他的在JavaScript中都是引用,引用值也称作对象,在JavaScript中内置了几种引用类型:Object、Array、Date、Error等。

检测基本值

如果我们希望一个值是字符串、数字、布尔值或undefined,最佳的选择是使用typeof运算符。typeof运算符会返回一个表示值的类型的字符串。

//检测字符串
if(typeof foo === "string"){
    console.log("string");
}
//检测数字
if(typeof foo === "number"){
    console.log("number");
}
//检测布尔值
if(typeof foo === "number"){
    console.log("number");
}
//检测undefined
if(typeof foo === "undefined"){
    console.log("undefined");
}

检测对象

如果使用typeof去判断这些引用类型时,就力不从心了,因为所以对象都会返回“object”。

//糟糕的用法
console.log(typeof {});
console.log(typeof new Array());
console.log(typeof new Date());
因此,检测某个引用值的类型的最好方法是使用instanceof运算符。
//好的用法
var date = new Date();
console.log(date instanceof Object);
console.log(date instanceof Date);
值得注意的是,检测函数最好的方法是使用typeof,因为它可以跨帧frame使用。
function foo(){}
//好的用法
console.log(typeof foo === "function");//true

检测属性

如果需要检测实例对象的某个属性是否存在,关于使用上需要特别注意。

var data = {
    name: "LiangGzone",
    addr: "Fuzhou"
}

//糟糕的用法
if(data[name] != null){
    //这里的代码不会执行
}
//糟糕的用法
if(data[name]){
    //这里的代码不会执行
}

//好的用法
if("name" in data){
    //这里的代码会被执行
    console.log("name in data");
}
//好的用法[对于所有非DOM对象来说有效]
if(data.hasOwnProperty("name")){
    //这里的代码会被执行
    console.log("data.hasOwnProperty(name)");
}
//好的用法[不确定是否为DOM对象,可以这样写]
if("hasOwnProperty" in Object && data.hasOwnProperty("name")){
    //这里的代码会被执行
    console.log("data.hasOwnProperty(name)");
}

参考文献

(书)「编写可维护的JavaScript」(Nicholas C. Zakas)

(完)

微信公众号

文章目录

  1. 1. 检测基本值
  2. 2. 检测对象
  3. 3. 检测属性
  4. 4. 参考文献