javascript是弱类型语言,常导致在运行时传入的类型与需要的类型不一致而报错,采用正确的类型判断可以避免此类错误。
变量是否存在
//判断一个 变量是否定义,如果否,就赋予一个值,糟糕的代码
if(v){
var x = v;
} else {
var x = 10;
}
//更好的代码
var x = v || 10;
primitive类型检查
var a="a";
var b=2;
var c=false;
var d=undefined;
var e=document.getElementById("notExist");
if(typeof a==="string"){
console.log("string");
}
if(typeof b==="number"){
console.log("number");
}
if(typeof c==="boolean"){
console.log("boolean");
}
if(typeof d==="undefined"){
console.log("undefined");
}
console.log(typeof e);//object
if(e===null){
console.log("null");
}
原始类型有5种,对于string,number,boolean,undefined类型可以用typeof来判断,对于null类型typeof操作符会返回object,并没有什么卵用,应该使用===或!==来判断null。
引用类型检查
var now=new Date();
if(now instanceof Date){
console.log("Date");
}
if(now instanceof Object){
console.log("Object");
}
引用类型的判断如使用typeof一律返回object,没什么卵用。应该使用instanceof操作符,会检查一个对象是否是某个构造函数创建的,如果不是会检查prototype chain直到Object。所以Date可以认为是Date类型也可以认为是Object类型。
特例,如果涉及到frame传值,则instanceof Array会不准确,这种情况下使用:
function isArray(value) {
return Object.prototype.toString.call(value) === "[object Array]";
}
对象是否包含某属性检查
var object={
name:null,
count:0
}
if("name" in object){
console.log("has property (name)");
}
if(object.hasOwnProperty("name")){
console.log("has own property (name)");
}
使用in操作符来检查某对象是否含有某属性,使用对象自带的hasOwnProperty方法可以限定只在对象自身中查找,而不包括prototype中的属性.