判斷一個變量是數組還是對象


javascript中如何准確判斷一個變量是什么,面試中這是考一個人基本功扎不扎實必定會問的一個問題。如果你還不是很清楚,相信這篇文章會對你有所幫助。

一,判斷方法

1.typeof
     我們能夠使用typeof判斷變量的身份,判斷字符串得到string,數字和NaN得到number,函數會得到function等,但是判斷數組,對象和null時都會得到object,詳細請看js數據類型,這就是typeof的局限性,並不能准確的判斷該變量的"真實身份"。那如何判斷一個變量是數組還是對象?

 2.instanceof
    使用instanceof可以用來判斷一個變量是數組還是對象,原理如下:
    數組也是對象的一種,使用instanceof都會返回true

    var arr = new Array();
    var arr = ['aa','bb','cc'];
    var obj = {
    a: 'aa',
    b: 'bb',
    c: 'cc'
    };
    console.log(arr instanceof Array); //true
    console.log(arr instanceof Object); //true
    console.log(obj instanceof Array); //false
    console.log(obj instanceof Object); //true

 

instanceof是如何判斷的:

      instanceof 運算符用來測試一個對象在其原型鏈中是否存在一個構造函數的 prototype 屬性,意思就是該變量通過原型鏈上能否找到構造函數的prototype 屬性,還不清楚原型鏈的請看原型鏈,所以就能明白為什么instanceof判斷一個變量可以分清楚它到底是數組還是對象:

    Array.prototype === arr.__proto__
    Object.prototype === arr.__proto__.__proto__
   因為arr的原型鏈上存在Array.prototype和Object.prototype
   只有Array類型的變量才會滿足arr instanceof Array和arr instanceof Object都返回true,
     也只有Object類型變量才滿足obj instanceof Array返回false,obj instanceof Object返回true
                    

3.constructor

var arr = ['aa','bb','cc'];
var obj = {
'a': 'aa',
'b': 'bb',
'c': 'cc'
};
console.log(arr.constructor === Array); //true
console.log(arr.constructor === Object); //false
console.log(obj.constructor === Object); //true

 

4.Object.prototype.toString.call()
                Object.prototype.toString.call()方法可以精准判斷變量類型,它返回[object constructorName]的字符串格式,這里的constructorName就是call參數的函數名

 var a = NaN;
var b= '222';
var c = null; 
var d = false;
var e = undefined;
var f = Symbol();
var arr = ['aa','bb','cc'];
var obj = {
'a': 'aa',
'b': 'bb',
'c': 'cc'
};
var res = Object.prototype.toString.call(arr);
console.log(res); //[object Array]
var res2 = Object.prototype.toString.call(obj);
console.log(res2); //[object Object]
var res3 = Object.prototype.toString.call(a);
console.log(res3); //[object Number]
var res4 = Object.prototype.toString.call(b);
console.log(res4); //[object String]
var res4 = Object.prototype.toString.call(c);
console.log(res4); //[object Null]
var res5 = Object.prototype.toString.call(d);
console.log(res5); //[object Boolean]
var res6 = Object.prototype.toString.call(e);
console.log(res6); //[object Undefined]
var res7 = Object.prototype.toString.call(f);
console.log(res7); //[object Symbol]

 

二,總結        判斷簡單數據類型可以用typeof,判斷數組,對象使用instanceof,constructor和 Object.prototype.toString.call(),最好使用Object.prototype.toString.call(),更加精准


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM