rt:判斷一個變量 arr 是不是數組
function isArray(arr){
//以下方法都可以
//原型鏈
return arr.__proto__ === Array.prototype;
return Object.getPrototypeOf(arr) === Array.prototype;
return Array.prototype.isPrototypeOf(arr);
//constructor構造函數
return arr.constructor === Array;
//Array.isArray()
return Array.isArray(arr);
//typeof
/*typeof 是一個一元運算,放在一個運算數之前,運算數可以是任意類型。
它返回值是一個字符串,該字符串說明運算數的類型。(typeof 運算符返回一個用來表示表達式的數據類型的字符 串。
運算數爲數字 typeof(x) = "number"
字符串 typeof(x) = "string"
布爾值 typeof(x) = "boolean"
對象,數組和null typeof(x) = "object"
函數 typeof(x) = "function")
在 JavaScript 中,判斷一個變量的類型嚐嚐會用 typeof 運算符,在使用 typeof 運算符時採用引用類型存儲值會出現一個問題,無論引用的是什麼類型的對象,它都返回 “object”。這就需要用到instanceof來檢測某個對象是不是另一個對象的實例。
*/
//instanceof 運算符用來檢測 constructor.prototype 是否存在於參數 object 的原型鏈上
return arr instanceof Array //即 arr.constructor.prototype === Array.prototype
//根據對象的class屬性(類屬性),跨原型鏈調用toString()方法 Object.prototype.toString.call()
/*
在js中一個對象一旦被創建,在內部會攜帶創建對象的類型名,一旦創建就不能被修改了。js中提供對象原型中的toString方法去獲取該類型名
*/
return Object.prototype.toString.call(arr) === '[object Array]'
}
進階問題
instanceof在哪些情況下會有問題?爲什麼?var str = 'str'
console.log(str instanceof String) // false
console.log(typeof str) // string
看上面的例子,str只是一個以string爲數據類型的值,但並不屬於String對象的實例
var strobj = new String('bbb')
console.log(strobj instanceof String) // true
此時strobj就是String對象的一個實例了。
instanceof運算符只能用於對象,不能用於原始類型的值