Как в JS узнать что объект — массив?
Узнал на семинаре Кантора такую штуку. Как узнать, что объект, который пришёл на вход — массив? Конечно, лучше использовать утиную типизацию, но если нам нужен именно массив, со всей полнотой методов, не проверять же каждый?
Кстати, если
Я до недавнего времени думал, что правильный способ такой:
console.log([] instanceof Array); // trueА редко его используют, потому что конструкция «instanceof» не везде реализована. Я заблуждался. Вот правильный способ:
console.log(Object.prototype.toString.call([]) == '[object Array]'); // trueИ вот почему. Оказывается, у каждого фрейма своя иерархия типов, если один фрейм передаёт во второй
<script>
function Up(arr, iframeWindow) {
alert(arr instanceof Array); // false
alert(arr instanceof iframeWindow.Array); // true
alert(Object.prototype.toString.call([]) == '[object Array]'); // true
}
</script>
<iframe src="data:text/html, <script>parent.Up([], window)</script>"></iframe>
Комментарии 15
if (Boolean.valueOf(stringValue).length() == 4) {
// stringValue is «true» :)
}
Только «Boolean.valueOf.call(stringValue).length», наверное :) И на «null» оно тоже «4» вернёт. И на «1234» — тоже.
Знатная подлянка. Между контекстами JS можно безопасно передавать только вочто-нибудь сериализованные объекты, и пересоздавать их на принимающей стороне заново.давным-давно, ещё во времена IE 5.5, потерял кучу времени. Приложение у меня было многофреймовое, JSON'а тогда ещё не было, и пришлось здорово поизвращаться.
Я на ней однажды,
Комментарий для ixth:
Насколько я знаю, напротив, в стандарте закреплено, что строка будет именно такой.
Проверил по спеке — действительно, часть стандарта.
Комментарий для Евгения Степанищева:
я полагал, что Кантор должен к тебе ходить на семинары;-)