A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

首先是空比较的问题,有时会出现将变量与null值进行比较的情况,例如:

if(val !== null){
    val.sort();
    val.forEachj(function(){
        //执行逻辑代码...
    })
}
1
2
3
4
5
6
上例中,可以预见变量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
1
2
但这里要注意,使用typeof来检测函数类型有个限制,在IE8及更早版本IE浏览器中,使用typeof来检测DOM节点(比如document.getElementById())中的函数都返回object,个中原因是浏览器对DOM的实现差异。

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

var arr = [10, 2, 'A'];
console.log(Array.isArray(arr));  //true
1
2
Array.isArray()方法是官方提供的数组检测最佳实践,但目前仍然还有些兼容性问题。IE9+、FireFox4+、Safari5+、opera10.5+和Chrom都实现这个方法。

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

Object.prototype.toString.call(arr) === "[object Array]";   //true
1
这是一种非常优雅的数组检测语句,也是适用性最广的,如果你的代码所处生产环境对兼容性要求较高时,保险起见还是使用这种方法吧。

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

function isArray( arr ){
    if( typeof Array.isArray === "function" ){
        return Array.isArraya( arr );
    }else {
        return Object.prototype.toString.call( arr ) === "[object Array]";
    }
}
1
2
3
4
5
6
7
最后再来看下属性检测。检测一个属性是在对象中存在时,可以使用两种方法: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中
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
而如果只是想检测实例对象的某个属性是否存在,可以使用hasOwnProperty()。所有继承自Object的对象都继承了这个方法。如果实例中存在该属性则返回true,如果这个属性只存在于原型中,则返回false。当然这个方法也是有兼容性,在IE8及更早版本的IE浏览器中,不存在这个方法,所以如果代码的生产环境可能包含IE8及以下时,需要先检测这个方法是否存在,检测方法为"hasOwnProperty" in object。
---------------------
【转载,仅作分享,侵删】
作者: 一期一会
原文:https://blog.csdn.net/qq_34832846/article/details/86298448


1 个回复

正序浏览
奈斯
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马