Array.isArray()方法
作用:判斷某個對象是否是數(shù)組
語法:Array.isArray(對象),返回值為布爾值
注意點:兼容性問題(ES5)
面試題
var o = {};
var a ={};
var b = {name:"張三"};
o["a"] = "Test-a";
o["b"] = "Test-b";
o[b] = "Demo-b";
o[a] = "Demo-a";
console.log(o.a); // Test-a
console.log(o.b); // Test-b
console.log(o[a]); // Demo-a
console.log(o[b]); // Demo-a
console.log(o["a"]); // Test-a
console.log(o["b"]); // Test-b
var arr1= [1,2,3];
console.log( arr1.toString()); //字符串類型的1,2,3
var func = function () {
};
console.log(typeof func.toString()); //string
console.log(a.toString()); //[object Object] [類型 構(gòu)造函數(shù)]
console.log(b.toString()); //[object Object]
console.log(o);
當(dāng)使用[]訪問屬性的時候郁副,屬性是字符串锣夹,如果屬性不是字符串页徐,會將 屬性當(dāng)做變量來處理,當(dāng)變量的值為數(shù)組银萍,會將數(shù)組的值轉(zhuǎn)換成字符串樣式变勇;當(dāng)變量的值為函數(shù),會將函數(shù)轉(zhuǎn)換成字符串樣式的函數(shù)贴唇;當(dāng)變量為對象搀绣,會將對象的值都轉(zhuǎn)換為[object Object] 的字符串,以上皆默認(rèn)使用toString方法
在使用[]語法設(shè)置對象的時候:
- []中存放的是字符串戳气,那么這個字符串就直接作為key
- []中存放的不是字符串链患,那么就把[]中部分當(dāng)成一個變量來處理,查找最近變量瓶您,獲取其值麻捻,如果對應(yīng)的值是字符串,那么就直接作為key;如果對應(yīng)的值是對象呀袱,那么就嘗試把這個對象轉(zhuǎn)換為字符串(toString)
toString:
返回的是對當(dāng)前對象的字符串描述贸毕。
Array.isArray()方法兼容性問題
思路:根據(jù)上述面試題,能否借用Object的原型對象上的toString方法將數(shù)組轉(zhuǎn)換成[object Array] 夜赵,由此來判斷是否是數(shù)組
代碼示例
var arr1 = [1,2,3];
console.log(Object.prototype.toString.call(arr1)); //[object Array]
var date = new Date();
console.log(typeof date); //[object Date]
console.log(Object.prototype.toString.call(function () {
})); //[object Function]
//由以上代碼執(zhí)行的結(jié)果可以判斷明棍,借用Object的原型對象上的toString方法可以將對象轉(zhuǎn)換成[object 構(gòu)造函數(shù)]的字符串形式,從中可以觀察到對象的構(gòu)造函數(shù) 油吭,進(jìn)而我們可以通過這個方法來判斷是否是數(shù)組
if (typeof Array.isArray 击蹲!=‘function’){
Array.isArray=function(arr){
return Object.prototype.toString.call(arr)=='[object Array] ';
}
}
instanceOf補(bǔ)充
作用:
01 檢查某個對象是否由某個構(gòu)造函數(shù)創(chuàng)建出來的署拟;
02 檢查該對象的構(gòu)造函數(shù)的原型對象是否在該對象的原型鏈上;
代碼示例
function Person() {
}
var p1 = new Person();
console.log(p1 instanceof Person); //true
Person.prototype = {}; //原型對象被替換歌豺,
console.log(p1 instanceof Person); //false
基本包裝類型
- String
- Number
- Boolean
基本包裝類型創(chuàng)建對象
- new String/Number/Boolean()
- new Object('字符串' | 數(shù)值 | 布爾類型的值)
- Object('字符串' | 數(shù)值 | 布爾類型的值)
注意:new Object()與Object()會根據(jù)傳入的參數(shù)推穷,內(nèi)部會做一個判斷來創(chuàng)建字符串對象/數(shù)值對象/布爾類型的對象
注意:通過構(gòu)造函數(shù)()方法創(chuàng)建的不是對象,是基本數(shù)據(jù)類型的值(除了Object)
var str1 = new String("demo01");
var str2 = "demo01";
var str3 = new Object("demo01");
var str4 = Object("demo01");
var str5 = String("demo01"); //字符串還是字符串對象类咧?注意馒铃,通過構(gòu)造函數(shù)()方法創(chuàng)建的不是對象,是基本數(shù)據(jù)類型的值
console.log(typeof str1, typeof str2,typeof str3,typeof str4); //
console.log(typeof str5); //string
var num1 = new Number(1);
var num2 = 1;
var num3 = new Object(1);
console.log(typeof num1, typeof num2,typeof num3);
var bool1 = new Boolean(true);
console.log(bool1);
var bool2 = true;
console.log(typeof bool1, typeof bool2);
基本包裝類型注意點
- 比較痕惋,等于與全等于
var str1 = new String("demo01"); //ox11
var str2 = "demo01";
var str3 = new Object("demo01"); //0x22
var str4 = Object("demo01");
var str5 = String("demo01"); //字符串還是字符串對象区宇?
var str6 = "demo01";
console.log(str2 == str6); //true 兩個都是基本類型的值在比較的時候比較內(nèi)容(demo01)
console.log(str1 == str2); //true 類型不一樣,內(nèi)部有隱式的轉(zhuǎn)換(對象.valueOf)
console.log(str1 == str3); //false,存儲的內(nèi)容是地址
- 基本類型的數(shù)據(jù)也可以訪問屬性和方法
var str01 = "string01";
console.log(str01.length); //8
//var tmp = new String(str01);
//tmp.length ==>8
//tmp = null;
console.log(str01.substr(1, 2)); //tr
var str02 = new String("sting02");
str02.name = "默認(rèn)的name";
console.log(str02.name); //默認(rèn)的name
str01.name = "測試的名稱";
console.log(str01.name); //undefined
實際上值戳,每當(dāng)讀取一個基本數(shù)據(jù)類型的值议谷,后臺就會創(chuàng)建一個對應(yīng)基本包裝類型的對象,從而能夠使基本數(shù)據(jù)調(diào)用一些方法堕虹。
引用類型與基本包裝類型的主要區(qū)別就在于對象的生命周期卧晓,使用new操作符創(chuàng)建的引用類型的實例,在執(zhí)行流離開當(dāng)前作用域之前都一直保存在內(nèi)存中赴捞。而自動創(chuàng)建的基本包裝類型的對象逼裆,只存在于這一行代碼的執(zhí)行期(瞬間),然后立即銷毀赦政。這就意味著我們不能在運(yùn)行時為基本數(shù)據(jù)類型添加屬性和方法胜宇。
Number使用注意
<script>
Number.prototype.sum = function (n) {
return n + this;
};
var num1 = new Number(10);
console.log(num1.sum(20)); //30
var num2 = 11;
console.log(num2.sum(10)); //21
// console.log(10.sum(5)); //不可以這樣調(diào)用
console.log((10).sum(5)); //這樣是可以的 15 表達(dá)式 加上一個()
</script>