Обновить
2
0
Dmitry Soshnikov@dsCode

Пользователь

Отправить сообщение
:) не-не, я про:

т.е. сделать из массива объект и еще дублировать значения? :)
насчет расширения прототипа Array — я знаю, я спрашивал о методе, который Вы предлагаете:

т.е.

var a = [];

[].pushKey(100, 1);

a.lenght // 102
a[100] // 1
a[101] // 1
:) поверьте, я в курсе того, что Вы мне рассказываете, я лишь уточнил, что в PHP уже такая идеология (на текущий момент) — когда большинство встроенных функций объявлены глобально.
> а не для хранение однотипных данных

однотипных данных?

[1, 'test', {a: 10}]


числовых ключей Вы имеете в виду

> Для кокой то списочных данных которые нужно перебирать нужно использовать Array так как он для этого оптимизирован

не факт, в теории — и [] и {} — объекты

> но при это скорость перебора ниже

вот если говорить о реализациях (и не обязательно JS) то скорость перебора — именно перебора структуры, когда ключ не известен — ни смещение не получить в массиве, ни хэш не вычислить по строковому ключу, для получения смещения, то перебор массива будет быстрее.

> Array.prototype.pushKey

?

> this[key] = val;

??

> return this.push(val);

???

:)
> Теоретически

Да, это если теоретически и относительно абстрактых данных в JS, где и то — [], и другое — {} — все нативный объект, лишь с разным [[Class]]'ом и [[Prototype]]'ом.

> Это если абстрагироваться от каждой отдельной реализации и их тараканов.

А вот это вообще самое главное. По сути (абстрактно) это два одинаковых объекта, но в одном из них — алгоритм сложнее => скорость медленнее. В глубине же — как раз могут использоваться либо массивы (где доступ к элементам намного быстрее база[+смещение]), либо хэши, построенные на массивах — и соответственно, работать медленнее.

По мне так — разделение на только-численные индесы и не только-численные должно исчезнуть и в этом плане PHP (жертвуя ресурсами) делает более абстрактную вещь.

Я вот тоже (касательно теории) посмотрел на алгоритм — вроде быстрее должно быть (хотя...), проверил на реализациях — нихрена =)
> лучше когда функция принадлежит тому объекту которому относится

да, спасибо, я в курсе.

> в пхп в данном случае прейдется весь массив оборачивать в класс а не просто добавить функцию

неа, как раз-таки — просто добавить функцию, поскольку здесь другая идеология (в случае же с reduce'ом добавлять не придется, так функция уже есть)
> На самом деле в javascript объект это объект а чтобы он был полноценным хешем прейдется кое что дописать

расскажите подробней ;)
Вы должны понимать, что работа 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 — весьма поверхностна, нужно копать глубже в сторону теоретических абстрактых структур данных.
> а где ты тут видишь цыкл? ;-)

показалось? — for — не? :D
> всего одна строчка

а внутри что? смотрели? подход здесь такой — «спасибо PHP-разработчикам, которые позаботились обо мне и написали уже готовую функцию array_shift для работы с хэшем», а не «всего одна строчка».

Еще раз — в PHP используются только хэши, со своими операциями доступа / удаления / добавления и т.д. К хэшам применили функции, связанные с массивами. Назвали все это дело «array». Все.

В JS — есть массивы (со своим набором функций) и хэши (со своим). При этом для хэшей не применимы функции массивов. Вывод — написать свои такие функции. При этом (в теории, и ради экспериментов) — можно и расширить движок — тогда ощущение, что использованы «костыли» — пропадет — вроде как будет уже встроенная конструкция, да?
> for

да-да, это известно, и на протяжении этой статьи уже говорилось, что только цикл и спасет. Я просто хотел показать, что человек начнет говорить — вот мне еще цикл надо юзать, тогда как в 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]);

> Подозреваю, что… myarray[«Строка поиска»]… быстрее, чем… «Строка поиска» in myarray

нет, оператор in все же быстрее, чем доступ к свойствам

дана структура данных, индексами которой могут являться числа и строки, удалить первый элемент из структуры.
> выглядит это куда лучше чем тоже самое в пхп

ну, выглядит — это другой вопрос, говорилось о функционале
я говорю, подобные wrapper'ы для объектов Вы можете написать сами (или, если лень, использовать уже кем-то написанные; но не советую сильно увлекаться, JS, действительно, идеологически отличается от PHP, поэтому, если хотите более детально изучать JS, относительно некоторых вещей нужно мыслить не так, как Вы привыкли в PHP).
> Вот например вы вот так на PHP можете
> воборка значения из json по определенному пути например users/1/name выберет в массиве пользователей второго и вернет его имя ну как элегантно.
> path.split('/').reduce(«a,c->a[c]»,json);

А что там мочь? при чем здесь какая-то реализация пользовательской функции, определенной методом массива? В PHP все равно глобальные функции для этого используются — ну напишут такую же — и что? — пожалуйста.
> я хочу знать чем структура массивов и хешей javascript лучше структуры массивов в php

в php — хэши, смотрите реализацию /ext/standard/array.c

Информация

В рейтинге
Не участвует
Откуда
Санкт-Петербург, Санкт-Петербург и область, Россия
Дата рождения
Зарегистрирован
Активность