编写可维护代码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。
喜欢本文请扫下方二维码,关注微信公众号: 前端小二,查看更多我写的文章哦,多谢支持。
相关文章推荐
- 《编写可维护的 JavaScript》读书笔记第9章:将配置数据从代码中分离出来
- 《编写可维护的 JavaScript》读书笔记第9章:将配置数据从代码中分离出来
- 《编写可维护的 JavaScript》读书笔记第9章:将配置数据从代码中分离出来
- Web前端开发最佳实践(12):JavaScript代码中有大量写死的配置数据?这些数据难以维护,你需要合理组织这些数据
- ↗☻【编写可维护的JavaScript #BOOK#】第9章 将配置数据从代码中分离出来
- Effective Objective-C 2.0 编写高质量iOS与OS X代码 在既有类中使用关联对象存放自定义数据
- 如何编写高质量和可维护的代码
- 老码农冒死揭开行业黑幕:如何编写无法维护的代码
- Safe C++ 读书笔记:对基本数据类型进行封装,以编写更安全的C++代码
- 8 个帮助你编写可维护、精简化前端代码的 CSS 策略
- 8个帮助你编写可维护、精简化前端代码的 CSS 策略
- 编写可维护代码的总结
- 如何编写可维护的面向对象JavaScript代码
- SharePoint2010企业开发最佳实践(一)----在 SharePoint Server 中编写有效代码
- 由画板实例来把握代码编写格式和提高编程能力以及OOP思想的实践
- iOS应用开发最佳实践:编写高质量的Objective-C代码
- 实践C++ 代码维护的思考
- iOS6 编程:Core Data持久化数据存储(3)-编写Core Data代码
- js原生代码编写一个鼠标在页面移动坐标的检测功能,兼容各大浏览器
- 编写可维护的javascript:分离配置数据