您的位置:首页 > 编程语言

编写可维护代码2:数据检测的较佳实践

2019-01-11 13:26 197 查看
版权声明:本文为微信公众号前端小二版权所有,如需转载可私信或关注文末微信公众号留言。 https://blog.csdn.net/qq_34832846/article/details/86298448

编写可维护的代码规则第2篇。

本篇将来讨论下数据类型检测的较好实践。

首先是空比较的问题,有时会出现将变量与

null
值进行比较的情况,例如:

if(val !== null){
val.sort();
val.forEachj(function(){
//执行逻辑代码...
})
}

上例中,可以预见变量

val
应该是个数组类型的数据,因为具有
sort()
forEach()
方法,所以在if判断语句中时,用
val !== null
来进行判断,并不能完全确认
val
就一定是数组类型,因为如果当
val
值为
string
number
等时,判断表达示也是为真成立的,此时也会进入到if判断中去。

所以需要寻找更好的值判断方法。

当值为基本数据类型时,比如

String
Number
Boolean
undefined
等。可以使用
typeof
来对值进行判断。而对于
null
,则不适用
typeof
,并且
null
一般也ぎ建议用于检测语句,
null
比较通常不会包含足够的信息以判断值的类型是否合法。但有个例外,如果期望值就是
null
,可以使用全等运算符
val === null
或非全等运算符
val !== null
来检测,另外如果期望值比较模糊,可以为
undefined
或者
null
,也可以使用
val == null
来做检测语句。

当值为引用数据类型时,比如

Date
RegExp
Error
等,则可以使用
instanceof
来作为检测语句。
instanceof
可以检测引用数据类型的构造器和原型链。

从技术上讲,函数也是引用类型,同样存在构造函数

Function
,每个函数都是它的实例。但函数的检测语句则不用
instanceof
,而是使用
typeof
,如:

function fn(){};
console.log(typeof fn === "function");     //true

但这里要注意,使用

typeof
来检测函数类型有个限制,在IE8及更早版本IE浏览器中,使用
typeof
来检测DOM节点(比如
document.getElementById()
)中的函数都返回
object
,个中原因是浏览器对DOM的实现差异。

至于引用类型中的数组检测,现在有两种比较好的最佳实践:

var arr = [10, 2, 'A'];
console.log(Array.isArray(arr));  //true

Array.isArray()
方法是官方提供的数组检测最佳实践,但目前仍然还有些兼容性问题。
IE9+
FireFox4+
Safari5+
opera10.5+
Chrom
都实现这个方法。

但当浏览器不存在此方法时,就要使用另外一种方法:

Object.prototype.toString.call(arr) === "[object Array]";   //true

这是一种非常优雅的数组检测语句,也是适用性最广的,如果你的代码所处生产环境对兼容性要求较高时,保险起见还是使用这种方法吧。

综合来说,检测数组使用如下方法:

function isArray( arr ){
if( typeof Array.isArray === "function" ){
return Array.isArraya( arr );
}else {
return Object.prototype.toString.call( arr ) === "[object Array]";
}
}

最后再来看下属性检测。检测一个属性是在对象中存在时,可以使用两种方法:

in
运算符和
hasOwnProperty()

in
运算符仅仅会简单判断属性是否存在,而不会去读属性的值,这就能有效避免因为属性值为假值(0, “”, false)时出现的歧义判断。

var obj = {
a: 0,
b: 10,
c: false
}
if('a' in obj){
console.log("属性a存在于对象obj中");     //属性a存在于对象obj中
}
if('b' in obj){
console.log("属性b存在于对象obj中");     //属性b存在于对象obj中
}
if('c' in obj){
console.log("属性c存在于对象obj中");     //属性c存在于对象obj中
}

而如果只是想检测实例对象的某个属性是否存在,可以使用

hasOwnProperty()
。所有继承自
Object
的对象都继承了这个方法。如果实例中存在该属性则返回
true
,如果这个属性只存在于原型中,则返回
false
。当然这个方法也是有兼容性,在IE8及更早版本的IE浏览器中,不存在这个方法,所以如果代码的生产环境可能包含IE8及以下时,需要先检测这个方法是否存在,检测方法为
"hasOwnProperty" in object

喜欢本文请扫下方二维码,关注微信公众号: 前端小二,查看更多我写的文章哦,多谢支持。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐