:) поверьте, я в курсе того, что Вы мне рассказываете, я лишь уточнил, что в PHP уже такая идеология (на текущий момент) — когда большинство встроенных функций объявлены глобально.
> Для кокой то списочных данных которые нужно перебирать нужно использовать Array так как он для этого оптимизирован
не факт, в теории — и [] и {} — объекты
> но при это скорость перебора ниже
вот если говорить о реализациях (и не обязательно JS) то скорость перебора — именно перебора структуры, когда ключ не известен — ни смещение не получить в массиве, ни хэш не вычислить по строковому ключу, для получения смещения, то перебор массива будет быстрее.
Да, это если теоретически и относительно абстрактых данных в JS, где и то — [], и другое — {} — все нативный объект, лишь с разным [[Class]]'ом и [[Prototype]]'ом.
> Это если абстрагироваться от каждой отдельной реализации и их тараканов.
А вот это вообще самое главное. По сути (абстрактно) это два одинаковых объекта, но в одном из них — алгоритм сложнее => скорость медленнее. В глубине же — как раз могут использоваться либо массивы (где доступ к элементам намного быстрее база[+смещение]), либо хэши, построенные на массивах — и соответственно, работать медленнее.
По мне так — разделение на только-численные индесы и не только-численные должно исчезнуть и в этом плане PHP (жертвуя ресурсами) делает более абстрактную вещь.
Я вот тоже (касательно теории) посмотрел на алгоритм — вроде быстрее должно быть (хотя...), проверил на реализациях — нихрена =)
Вы должны понимать, что работа cо структурой «массив» (безотносительно конкретики — ни JS, ни PHP, ни Ruby, ни т.д. сейчас не важны) быстрее работы со структурой «ассоциативный массив». При этом само понятие «ассоциативный массив» более общее, нежели «хэш-таблица» (хэш-таблица — всего лишь одна из реализаций ассоциативного массива).
Поэтому, если относительно какой-то задачи нужен именно массив (т.е. последовательность однотипных элементов определенного размера в памяти), то его использование — будет быстрее, если бы мы использовали более абстрактную структуру данных, как, например, ассоциативный массив, который построен внутри себя на массивах (в лучшем случае), а в более абстрактных данных — может использовать уже и списки и т.д.
Что касается JS — массив, здесь является также объектом (в какой форме это сделано на уровне движков в реализациях — сказать точно не могу (к тому же движки разные), но можно всегда поизучать исходники). Можно и простые тесты провести, и поверхностно проанализировать работу движков (где мы увидим, что при операции присвоения [] работает быстрее, чем {}):
var t1, t2, t3, t4;
var a = [];
var b = {};
t1 = new Date().getTime();
for (var k = 0; k < 500000; k++) {
a[k] = true;
}
t2 = new Date().getTime();
t3 = new Date().getTime();
for (var k = 0; k < 500000; k++) {
b[k] = true;
}
t4 = new Date().getTime();
alert([t2 - t1, t4 - t3]);
В PHP решили не разграничивать эти понятия и усилить абстракцию, что, несомненно, понесет потери в ресурсах, но упростит разработку.
А насчет «холивор затевался» — повторю, я вообще смутно понимаю, как люди, которые это не создавали, могут об этом холиворить еще (создается впечатление, что они отстаивают свой продукт)? Не лучше ли изучать и то, и то, и это, и делать определенные выводы, быть в курсе, что есть так и так — и вот так лучше, а здесь надо доработать. При этом кокретизация aka PHP — JS — весьма поверхностна, нужно копать глубже в сторону теоретических абстрактых структур данных.
а внутри что? смотрели? подход здесь такой — «спасибо PHP-разработчикам, которые позаботились обо мне и написали уже готовую функцию array_shift для работы с хэшем», а не «всего одна строчка».
Еще раз — в PHP используются только хэши, со своими операциями доступа / удаления / добавления и т.д. К хэшам применили функции, связанные с массивами. Назвали все это дело «array». Все.
В JS — есть массивы (со своим набором функций) и хэши (со своим). При этом для хэшей не применимы функции массивов. Вывод — написать свои такие функции. При этом (в теории, и ради экспериментов) — можно и расширить движок — тогда ощущение, что использованы «костыли» — пропадет — вроде как будет уже встроенная конструкция, да?
да-да, это известно, и на протяжении этой статьи уже говорилось, что только цикл и спасет. Я просто хотел показать, что человек начнет говорить — вот мне еще цикл надо юзать, тогда как в PHP я использую array_shift(...). C другой стороны, я так же говорю — ну сделайте обертку в виде того же array_shift. Разница лишь в том, что в PHP это уже написано кем-то, а здесь надо самому =) И вроде как ощущение, что array_shift — это конструкция языка (то, что дано изначально без дополнительных телодвижений).
Хотя нет, вру. Теоретические алгоритмы разные, и сходу сложно оценить. К тому же — реализации алгоритмов тоже разные. На практике же получается obj.prop быстрее, чем 'prop' in obj:
var a = {};
Object.prototype.b = true;
var t1;
var t2;
var t3;
var t4;
t1 = new Date().getTime();
for (var k = 0; k < 1000000; k++) {
if ('b' in a) {}
}
t2 = new Date().getTime();
t3 = new Date().getTime();
for (var k = 0; k < 1000000; k++) {
if (a.b) {}
}
t4 = new Date().getTime();
alert([t2 - t1, t4 - t3]);
я говорю, подобные wrapper'ы для объектов Вы можете написать сами (или, если лень, использовать уже кем-то написанные; но не советую сильно увлекаться, JS, действительно, идеологически отличается от PHP, поэтому, если хотите более детально изучать JS, относительно некоторых вещей нужно мыслить не так, как Вы привыкли в PHP).
> Вот например вы вот так на PHP можете
> воборка значения из json по определенному пути например users/1/name выберет в массиве пользователей второго и вернет его имя ну как элегантно.
> path.split('/').reduce(«a,c->a[c]»,json);
А что там мочь? при чем здесь какая-то реализация пользовательской функции, определенной методом массива? В PHP все равно глобальные функции для этого используются — ну напишут такую же — и что? — пожалуйста.
т.е.
var a = [];
[].pushKey(100, 1);
a.lenght // 102
a[100] // 1
a[101] // 1
однотипных данных?
[1, 'test', {a: 10}]числовых ключей Вы имеете в виду
> Для кокой то списочных данных которые нужно перебирать нужно использовать Array так как он для этого оптимизирован
не факт, в теории — и [] и {} — объекты
> но при это скорость перебора ниже
вот если говорить о реализациях (и не обязательно JS) то скорость перебора — именно перебора структуры, когда ключ не известен — ни смещение не получить в массиве, ни хэш не вычислить по строковому ключу, для получения смещения, то перебор массива будет быстрее.
> Array.prototype.pushKey
?
> this[key] = val;
??
> return this.push(val);
???
:)
Да, это если теоретически и относительно абстрактых данных в JS, где и то — [], и другое — {} — все нативный объект, лишь с разным [[Class]]'ом и [[Prototype]]'ом.
> Это если абстрагироваться от каждой отдельной реализации и их тараканов.
А вот это вообще самое главное. По сути (абстрактно) это два одинаковых объекта, но в одном из них — алгоритм сложнее => скорость медленнее. В глубине же — как раз могут использоваться либо массивы (где доступ к элементам намного быстрее база[+смещение]), либо хэши, построенные на массивах — и соответственно, работать медленнее.
По мне так — разделение на только-численные индесы и не только-численные должно исчезнуть и в этом плане PHP (жертвуя ресурсами) делает более абстрактную вещь.
Я вот тоже (касательно теории) посмотрел на алгоритм — вроде быстрее должно быть (хотя...), проверил на реализациях — нихрена =)
да, спасибо, я в курсе.
> в пхп в данном случае прейдется весь массив оборачивать в класс а не просто добавить функцию
неа, как раз-таки — просто добавить функцию, поскольку здесь другая идеология (в случае же с reduce'ом добавлять не придется, так функция уже есть)
расскажите подробней ;)
Поэтому, если относительно какой-то задачи нужен именно массив (т.е. последовательность однотипных элементов определенного размера в памяти), то его использование — будет быстрее, если бы мы использовали более абстрактную структуру данных, как, например, ассоциативный массив, который построен внутри себя на массивах (в лучшем случае), а в более абстрактных данных — может использовать уже и списки и т.д.
Что касается JS — массив, здесь является также объектом (в какой форме это сделано на уровне движков в реализациях — сказать точно не могу (к тому же движки разные), но можно всегда поизучать исходники). Можно и простые тесты провести, и поверхностно проанализировать работу движков (где мы увидим, что при операции присвоения [] работает быстрее, чем {}):
var t1, t2, t3, t4; var a = []; var b = {}; t1 = new Date().getTime(); for (var k = 0; k < 500000; k++) { a[k] = true; } t2 = new Date().getTime(); t3 = new Date().getTime(); for (var k = 0; k < 500000; k++) { b[k] = true; } t4 = new Date().getTime(); alert([t2 - t1, t4 - t3]);В PHP решили не разграничивать эти понятия и усилить абстракцию, что, несомненно, понесет потери в ресурсах, но упростит разработку.
А насчет «холивор затевался» — повторю, я вообще смутно понимаю, как люди, которые это не создавали, могут об этом холиворить еще (создается впечатление, что они отстаивают свой продукт)? Не лучше ли изучать и то, и то, и это, и делать определенные выводы, быть в курсе, что есть так и так — и вот так лучше, а здесь надо доработать. При этом кокретизация aka PHP — JS — весьма поверхностна, нужно копать глубже в сторону теоретических абстрактых структур данных.
показалось? — for — не? :D
а внутри что? смотрели? подход здесь такой — «спасибо PHP-разработчикам, которые позаботились обо мне и написали уже готовую функцию array_shift для работы с хэшем», а не «всего одна строчка».
Еще раз — в PHP используются только хэши, со своими операциями доступа / удаления / добавления и т.д. К хэшам применили функции, связанные с массивами. Назвали все это дело «array». Все.
В JS — есть массивы (со своим набором функций) и хэши (со своим). При этом для хэшей не применимы функции массивов. Вывод — написать свои такие функции. При этом (в теории, и ради экспериментов) — можно и расширить движок — тогда ощущение, что использованы «костыли» — пропадет — вроде как будет уже встроенная конструкция, да?
да-да, это известно, и на протяжении этой статьи уже говорилось, что только цикл и спасет. Я просто хотел показать, что человек начнет говорить — вот мне еще цикл надо юзать, тогда как в PHP я использую array_shift(...). C другой стороны, я так же говорю — ну сделайте обертку в виде того же array_shift. Разница лишь в том, что в PHP это уже написано кем-то, а здесь надо самому =) И вроде как ощущение, что array_shift — это конструкция языка (то, что дано изначально без дополнительных телодвижений).
— количества итераций;
— наличия свойства в объекте;
Тогда результаты меняются и «скачут».
var a = {}; Object.prototype.b = true; var t1; var t2; var t3; var t4; t1 = new Date().getTime(); for (var k = 0; k < 1000000; k++) { if ('b' in a) {} } t2 = new Date().getTime(); t3 = new Date().getTime(); for (var k = 0; k < 1000000; k++) { if (a.b) {} } t4 = new Date().getTime(); alert([t2 - t1, t4 - t3]);нет, оператор in все же быстрее, чем доступ к свойствам
ну, выглядит — это другой вопрос, говорилось о функционале
> воборка значения из json по определенному пути например users/1/name выберет в массиве пользователей второго и вернет его имя ну как элегантно.
> path.split('/').reduce(«a,c->a[c]»,json);
А что там мочь? при чем здесь какая-то реализация пользовательской функции, определенной методом массива? В PHP все равно глобальные функции для этого используются — ну напишут такую же — и что? — пожалуйста.
в php — хэши, смотрите реализацию /ext/standard/array.c