- 1
new Array(100).map(function(x) { return Math.random() * 1000; });
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+160
new Array(100).map(function(x) { return Math.random() * 1000; });
Угадайте результат.
Мда. Массив длины 100, в котором нет ни одного ключа, и на котором, очевидно, не работают мапы...
new Array(3) - тут length == 3, все элементы undefined, но мап не видит элементов.
[undefined, undefined, undefined] - тут тоже length == 3, все элементы undefined, но мап все видит.
А я думал такой бредовый пиздец это прерогатива с++ и php...
Отвечу сам себе - нет, тоже не видит. Т.е. этот конструктор мало того, что совершенно бесполезен, так еще и не дает возможность запилить инициализированный массив из одного элемента: new Array(1,2) можно, а new Array(1) - нет.
Неа.
console.time('qwe');
console.time('asd');
P.S. Уже третий линк на хабр за сегодня.
метастазы
во всех кинотеатрах страны
На заре моей програмистской карьеры мне довелось писать клиент к "бинго" игрушке, конечно, игра очень простая, но и не совсем рандом. Т.е. конечно, рандом, но инфраструктура привязаная к сюжету занимает больше, чем сюжет. "Сервер" к этой игре слабал какой-то народный зодчий на С#, работало оно плохо даже по тогдашним представлениям, и код был вообще ужас. Но 3-4 тысячи клиентов в пиковые часы обслуживал.
P.S. 20-30 игр это получается 80-120 человек, если они играют 2х2.
Зато можно так :)
А еще можно в качестве второго параметра передавать функцию, которая будет вычислять значение элемента массива в зависимости от его индекса.
Но на самом деле всё это не нужно.
Или даже просто так:
Это мало кто знает, и никто не пользуется, но, например, 2 точки подряд в жабоскрипте используются в одном случае, когда у литерала числа в десятеричном представлении нужно вызвать какую-то функцию. Т.е. 100..toString() например, а в неутвержденном, но реализованом E4X те же две точки значать выборку всех наследников у XML / XMLList.
Ну а с появлением трех точек, возможно появятся смешные опечатки. Особенно принимая во внмимания большую нелюбовь жабоскриптеров к синтаксису в целом игнорирование пробелов в частности.
It's new sport game for programmers.
Первый new Array, второй [], а возвращается тот, что создается map.
Представленный выше велосипед:
1. Создаём пустой массив и устанавливаем его длину в 100.
2. Создаём из этого массива List(массив аргументов) из, соответственно, 100 элементов, каждый из которых будет undefined.
3. Создаём еще один массив через [] с сотней аргументов undefined.
4. Получаем массив из 100 элементов undefined.
5. Создаём еще один пустой массив и устанавливаем его длину в 100.
6. Создаём калбэк, возвращающий рандомное значение, помноженное на 1000.
7. 100 раз проверяем наличие элемента во 2ом массиве, если есть запускаем калбэк с этим значением, пишем результат по такому-то индексу в конечный массив.
Велосипед с push:
1. Создаём пустой массив и переменную, инициализированную в 100.
2. 100 раз декрементируем значение переменной, пишем рандомное значение, помноженное на 1000, в массив и инкрементируем его длину.
push - вызов API функции, который предполагает кучу разных проверок, оберток, он и системное время прочитает, и может даже какие-то временные объекты в памяти разместит и т.д. Т.как это функция с варируемым числом аргументов, то и для аргументов еще обертка есть.
Типично предполагать, что динамические массивы будут выделять память постепенно, удваиавая ее. Т.е. если вы начнете с массива с нулевой длиной, то он будет расти когда вы добавите в него второй, четвертый, восьмой и т.д. элементы, конечно, в реальности начинает расти с каких-нибудь пары тысяч, т.как выделяется с запасом в рассчете на то, что жабоскриптерам особо большие массивы все равно ни к чему, то, в принципе, догадка неплохая.
Таким образом, если вы не записываете просто по индексу значение, вся эта механика усложняется тем, что нузно каждое какое-то время перевыделять память под массив, копировать и т.д.
Далее, память под массив, по крайней мере в AS выделяется при создании, и выделяется ее столько, сколько было указано в конструкторе, таким образом последующие записи по индексу становятся элементарными операциями. В случае с жабоскриптом, получаем что таких примитивных операций просто нет, т.как нельзя предварительно заготовить память, и пользоваться push - вобщем-то то же самое, что и записывать по индексу.
Еще большая лажа начинается, когда в массиве пропущены элементы, и часть массива существует в памяти как массив, а часть, - как хеш-мап, и там тоже свои усложнения, с которыми push так или иначе столкнется, хеширование ключей, слежение за тем, чтобы "сумки" куда ключи складываются не наполнялись выше какого-то определенного предела - все это не нужно при обычной записи по индексу.
А в браузерном жабоскрипте никто и не замахивается на какие-то серьезные вещи. Даже какой-нибудь примитивный редактор звука - уже облом изза плохой, по определению и задумке реализации массивов. А видео редактора на жабоскрипте мы, при нашей жизни, скорее всего и не увидим никогда.