判斷一個變量是不是數組

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運算符只能用於對象,不能用於原始類型的值

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章