Javascript-форум (https://javascript.ru/forum/)
-   Ваши сайты и скрипты (https://javascript.ru/forum/project/)
-   -   Библиотечка . (https://javascript.ru/forum/project/6025-bibliotechka.html)

float 31.08.2011 19:23

кстати прикольно пофиксили:)
Цитата:

Ну по такой логике в пределах еще и "vasyaPupkin" всенда существует, но его значение не определено
я отталкивался от предположения, что массив это участок в памяти, а new Array(n) его выделяет. В вашем случае компилятор просто возвращает тот же undefined, хотя выделения памяти под него небыло и оно не было объявлено.
Так что с точки зрения железа вроде это 2 разных undefined. Может я в чём-то неправ?

Sweet 31.08.2011 19:23

Цитата:

Сообщение от float
Стандартная функция не вызывает fn если элемент undefined.

Вызывает, если элемент undefined, но свойство с таким индексом есть:
var t = new Array(5);
t[1] = undefined;
t.map(function(c, i) {alert(c); return 2;});

Sweet 31.08.2011 19:26

Цитата:

Сообщение от float
я отталкивался от предположения, что массив это участок в памяти, а new Array(n) его выделяет. В вашем случае компилятор просто возвращает тот же undefined, хотя св-во не объявлено и выделения памяти под него небыло.

Лучше отталкиваться от предположения, что Array - это обычный объект. Только у него есть сеттер на добавление индексов, чтобы менять свойство length.

float 31.08.2011 19:34

Цитата:

Лучше отталкиваться от предположения, что Array - это обычный объект. Только у него есть сеттер на добавление индексов, чтобы менять свойство length.
хм... учтёмс:)

float 31.08.2011 19:43

У меня кстати есть предложение по сжиманию кода. Я у себя делаю так:
(function(A) {

})(Array.prototype);


Имхо коротко и понятно:)
Хотя в вашем случае это будет не так красиво, зачем-то ещё Array передаёте...

Octane 31.08.2011 20:01

Цитата:

Сообщение от float
зачем-то ещё Array передаёте...

isArray не в прототипе

Kolyaj 31.08.2011 20:14

Цитата:

Сообщение от float
я отталкивался от предположения, что массив это участок в памяти, а new Array(n) его выделяет.

В JavaScript массив это обычный объект, у которого переопределён внутренний метод [[Set]], который следит за свойством length и за числовыми свойствами.

Правила такие
При установке свойства length удаляются числовые свойства больше либо равные новому length.
При установке числового свойства, если length не больше этого свойства, то length устанавливается на единицу больше этого свойства.
Отрицательный length, кстати, присвоить нельзя.

Некоторые следствия из этих правил.
Свойство length равно количеству элементов в массиве только при аккуратной работе с массивом (нет пропусков элементов). В общем случае length всегда больше максимального индекса в массиве.
Чтобы очистить массив, достаточно свойству length присвоить 0.

float 31.08.2011 21:22

Цитата:

При установке свойства length
перепроверил даже. блин глазам не верю:). всегда считал length рид онли... бывает же такое.
Да... я уже понял, что рассматривать низкий уровень в js-се не катит, тк его движки сами написаны на ОО язке/ах...
Kolyaj, сенкс за доходчивое объяснение.
Наверное надо всё таки собраться и прочитать http://javascript.ru/ecma/part15 :)

Octane 02.09.2011 22:27

Переопределенные constructor, toString, toLocaleString, valueOf, hasOwnProperty, propertyIsEnumerable и isPrototypeOf не становятся enumerable в IE<9, поэтому Object.keys({toString: fn}) вернет пустой массив.
Думаю toString и valueOf хорошо бы пофиксить.

___________________
offtop
Раньше этого как-то не замечал, а вот сейчас наткнулся, такое во всех браузерах:
function F() {}
F.prototype.constructor = F;
F.prototype.toString = F;

for (var key in new F) {
    alert(key);
}
constructor не становится enumerable, в отличие от toString

Kolyaj 02.09.2011 22:52

Цитата:

Сообщение от Octane
Переопределенные constructor, toString, toLocaleString, valueOf, hasOwnProperty, propertyIsEnumerable и isPrototypeOf не становятся enumerable в IE<9, поэтому Object.keys({toString: fn}) вернет пустой массив.

О, спасибо за список. Давно хочу этим заняться, но пока только toString в Object.mixin пофиксил.


Цитата:

Сообщение от Octane
constructor не становится enumerable, в отличие от toString

Потому что constructor переопределяется, а toString создаётся.
function F() {}
alert([F.prototype.hasOwnProperty('constructor'), F.prototype.hasOwnProperty('toString')])


Часовой пояс GMT +3, время: 21:33.