面試題:判斷一個物件是不是陣列型別
阿新 • • 發佈:2018-11-08
<script> //判斷一個物件是不是陣列型別 typeof不能檢視所有型別 var obj1={x:1,y:2}, obj2=[1,2,3], obj3=new Date(); //1.判斷爹(原型物件) console.log( obj1.__proto__==Array.prototype,//false obj2.__proto__==Array.prototype,//true obj3.__proto__==Array.prototype,//false //條件,//false //條件,//true //條件,//false ); // console.log( Array.prototype.isPrototypeOf(obj1),//Array的老公是obj1的爹嗎 Array.prototype.isPrototypeOf(obj2), Array.prototype.isPrototypeOf(obj3), ); //2.判斷媽媽(建構函式) //每個原型物件有一個constructor屬性,指向建構函式 console.log( obj1.constructor==Array, obj2.constructor==Array, obj3.constructor==Array, ); console.log( obj1 instanceof Array,//instanceof-->例項 obj1 是Array的例項嗎? obj2 instanceof Array, obj3 instanceof Array, ); obj4={x:1,y:2}; //嚴謹 //3.驗DNA(每個物件中都隱藏著一個class屬性,記錄著物件建立時的型別名,不隨著繼承關係的改變而改變) //物件的祖宗是object,他的方法中存在toString方法返回的是一個型別[object 內建型別],但是最直接用toString的時候,js會認為在檢視內容,在其原型物件中建立一個toString方法,所以不會輸出型別,只有用call這個不講理的方法會讓物件找到想要用的函式。 console.log( Object.prototype.toString.call(obj1)=="[object Array]", Object.prototype.toString.call(obj2)=="[object Array]", Object.prototype.toString.call(obj3)=="[object Array]", //Object.prototype.toString.call(obj4)=="[object Array]", /*obj1.toString(), obj2.toString(), obj3.toString(),*/ ); //4.Array.isArray()嚴謹 console.log( Array.isArray(obj1), Array.isArray(obj2), Array.isArray(obj3), ); </script>