javascript のオブジェクトが配列かどうかをチェックする関数が下記に紹介されていたので試してみた。
サンプルコードは下記のよーな感じ。
<html>
<head>
<script type="text/javascript">
<!--
function IsArray(array)
{
return !(
!array ||
(!array.length || array.length == 0) ||
typeof array !== 'object' ||
!array.constructor ||
array.nodeType ||
array.item
);
}
// examples
function check_array(){
alert( IsArray( [] ) ); // true ← falseになる?
alert( IsArray( [1,2,3] ) ); // true
alert( IsArray( {a:1} ) ); // false
alert( IsArray( document.forms[0] ) ); // false
alert( IsArray( [document.forms[0]] ) ); // true
}
// -->
</script>
</head>
<body onload="check_array()";>
</body>
</html>
で、喜び勇んでやってみたら、どーも、
alert( IsArray( [] ) );
の部分がtrueではなくfalseになるっぽい。
うーむ。正しい?
function IsArray(array) {
return (typeof(array) == "object" &&
array.constructor.toString().indexOf(" Array(") > 0);
}
function IsArray(array) {
return (typeof(array) == "object" && array != null &&
array.constructor.toString().indexOf(" Array(") >= 0);
}
これが最終版であることを祈ります・・・
function IsArray(array) {
return (typeof(array) == "object" && array != null &&
typeof(array.constructor) == "function" &&
array.constructor.toString().indexOf(" Array(") >= 0);
}
短縮して書くと、こうかな?
function IsArray(array) {
return !!(array && array.constructor &&
array.constructor.toString().indexOf(" Array(") >= 0);
}
お騒がせしました。
var ary = new Array();
if (ary instanceof Array) { ...
instanceof 演算子の存在を忘れてました・・・ ○| ̄|_
りょーち@管理人です。
コメントいただきましてありがとうございます。
Javascriptについて、あまり詳しくないのですが、22:04に記載いただいたものと00:34に記載いただいたものではどう違うのでしょう?
22:04バージョンではよろしくないのでしょうか?
22:04バージョンではサンプルプログラムは期待通りの結果を返しているようです。
var a = []
alert(a.constructor===Array)
他のobjectの場合
var b = {}
alert(b.constructor===Object)
var f = function(){}
alert(f.constructor===Function)
コメントいただきましてありがとうございます。
うーむ。素晴らしいです。javascriptをあまり理解できていないので、技術的な言及ができないのですが、
--------
function IsArray(a){
return(a.constructor===Array);
}
--------
って感じでよさそうなんですねぇ。
constructorってのがよくわかってないので、今度よくしらべてみます。
いただいた例を拝見するかぎりでは、大本のオブジェクトが何者かってのを調べることができるんですねー。
すばらしすぎます。
更に勉強してみます。ありがとうございました。
IsArray=Array.isArray;
としてみては