對於function ,string, number, undefined等幾種資料型別的物件來說,typeof完全可以判斷出來,但是為array的時候
var arr =
newarray
('1'
,'2'
,'3'
,'4');
alert
(typeof
(arr)
;//object
你會收到乙個object的答案,有點讓人失望。
instanceof操作運算子會返回乙個boolean型別的值, 指出物件是否是特定的型別
console.
log(
instanceof
(arr)))
;//true
返回true
小總結:看來我們今天的問題已經得到了解決,但事實上在多個frame中穿梭就會出現大問題。
var iframe = document.
createelement
('iframe');
document.body.
(iframe)
; xarray = window.frames[window.frames.length-1]
.array;
var array =
newxarray
('1'
,'2'
,'3'
,'4');
alert
(array instanceof
array);
//false
alert
(array.constructor === array)
//false
結果返回兩個false,有點令人失望。
ecma-626寫道
object.prototype.tostring() when the tostring method is called ,the following steps taken;
1.get the [[class]] property of this object .
2.compute a string value by concatenating the three string "[object", result(1),and "]".
3.return result(2).
上面的規範定義了object.prototype.tostring的行為;首先,取得物件的乙個內部屬性[[ class]],然後依據這個屬性,返回乙個類似"[object array]"的字串作為結果(看過ecma標準的都應該知道,[[ ]]用來表示語言內部用到的,外部不可以直接訪問的屬性,稱為內部屬性)。利用這個方法,再配合call,我們可以取得任何物件的內部屬性[[class]], 然後把型別檢測轉化為字串比較,以達到我們的目的。還是先來看看再ecma標準中array的描述吧。
new
array
([item0,
[item1[
,...]]
]);the [
[class
]] property of the newly constrcted object is set to "array"
.
於是利用這點,第三種方法登場了。
function
isarray
(obj)
call改變tostring的引用為待檢測的物件,返回此物件的字串表示,然後對比此字串是否是』[object array]』,以判斷是否是array的例項。也許你要問為什麼不直接o.tostring()?嗯,雖然array繼承自object, 也會有tostring 方法,但是這個方法可能會被改寫而達不到我們的要求,而object.prototype會很純淨。
和前面的幾個方案不同,這個方法很好的解決了跨frame物件構建的問題,經過測試,各大瀏覽器的相容也很好,可以放心使用。乙個好訊息是,很多框架都計畫借鑑此方法以實現某些特殊的比如陣列,正規表示式等物件型別的判定,不用我們自己寫了。
如何判斷乙個js物件是不是Array
1.instance of 2 constructor 3 isarray 1 var a new array a instanceof array true 2 var a new array a.constructor array true 3 對支援isarray的瀏覽器 var a new ...
如何判斷乙個js物件是不是Array
1.instance of 2 constructor 3 isarray 1 var a new array a instanceof array true 2 var a new array a.constructor array true 3 對支援isarray的瀏覽器 var a new ...
如何判斷乙個物件是不是數值
要判斷乙個物件是不是陣列的方式有多種,這裡我們乙個乙個來分析 在使用array.isarray方法之前,我們先來普及一下它的作用以及如何使用 作用 它是用於判斷某個物件是否是陣列 使用 語法格式 array.isarray 物件 下面我們就用乙個小例項來看看它怎麼判斷乙個物件是不是陣列 functi...