Jaki jest "właściwy" sposób określenia, czy obiekt jest tablicą?Sposób JavaScriptu dla określenia, czy obiekt jest tablicą
funkcja isArray (o) { ??? }
Jaki jest "właściwy" sposób określenia, czy obiekt jest tablicą?Sposób JavaScriptu dla określenia, czy obiekt jest tablicą
funkcja isArray (o) { ??? }
Najlepszym sposobem:
function isArray(obj) {
return Object.prototype.toString.call(obj) == '[object Array]';
}
ECMAScript 5th Edition Specification definiuje sposób, że i some browsers, jak Firefox, Chrome 3.7alpha 5 wersji beta i najnowsze kompilacje WebKit Nightly zapewniają już natywną implementację, więc możesz ją zaimplementować, jeśli nie jest dostępna:
if (typeof Array.isArray != 'function') {
Array.isArray = function (obj) {
return Object.prototype.toString.call(obj) == '[object Array]';
};
}
jeszcze bezpieczniejsze jest 'return Object.prototype.toString.call (obj) === '[object array]';' aby uniknąć jakiegokolwiek możliwego przymusu – Rixius
@Rixius: Cóż, metoda 'Object.prototype.toString' jest [w pełni opisane] (http://bclary.com/2004/11/07/#a-15.2.4.2) w specyfikacji, wartość zwracana 'String' jest * gwarantowana *, nie widzę żadnej korzyści z używania ścisłego równa się operatorowi, gdy wiesz, że porównasz wartości dwóch ciągów znaków ... – CMS
Ktoś mógł odciąć 'Object.prototype.toString' zawsze lepiej, niż być przykro. – Rixius
To co mam użyć:
function is_array(obj) {
return (obj.constructor.toString().indexOf("Array") != -1)
}
Dzięki za odpowiedź, nie rozumiem, dlaczego x.constructor.toString(). IndexOf ("Array") zwraca 9, jeśli jego instancji tablicy? czy możesz mi powiedzieć? – Sudarshan
function typeOf(obj) {
if (typeof(obj) == 'object')
if (obj.length)
return 'array';
else
return 'object';
} else
return typeof(obj);
}
Można wziąć wziąć Prototype biblioteki definicji metody Object.isArray(), która go Test:
function(object) {
return object != null && typeof object == "object" &&
'splice' in object && 'join' in object;
}
Prototyp nie używa już tej metody, zobacz [tutaj] (http://github.com/sstephenson/prototype/blob/1.6.1/src/lang/object.js#L191) jak to jest zaimplementowane w 1.6.1. – CMS
powinien być w stanie użyć operatora instanceof
:
var testArray = [];
if (testArray instanceof Array)
...
Jedyną wadą 'instanceof' jest praca w środowisku DOM z wieloma ramkami, a obiekt tablicy z jedną ramką nie jest instancją konstruktora' Array' innej ramki. Więcej informacji można znaleźć w [tym artykule] (http://perfectionkills.com/instanceof-considered-harmful-or-how-to-write-a-robust-isarray/). – CMS
jQuery rozwiązuje wiele z tego rodzaju problemów:
jQuery.isArray(obj)
Możesz chcieć podać więcej szczegółów na temat swojego środowiska, np .: czysty javascript? Działasz w przeglądarce? Czy dostępne są prototypy lub inne biblioteki? –