31.08.2011, 19:23
|
|
Профессор
|
|
Регистрация: 01.07.2010
Сообщений: 387
|
|
кстати прикольно пофиксили
Цитата:
|
Ну по такой логике в пределах еще и "vasyaPupkin" всенда существует, но его значение не определено
|
я отталкивался от предположения, что массив это участок в памяти, а new Array(n) его выделяет. В вашем случае компилятор просто возвращает тот же undefined, хотя выделения памяти под него небыло и оно не было объявлено.
Так что с точки зрения железа вроде это 2 разных undefined. Может я в чём-то неправ?
Последний раз редактировалось float, 31.08.2011 в 19:25.
|
|
31.08.2011, 19:23
|
Профессор
|
|
Регистрация: 16.03.2010
Сообщений: 1,618
|
|
Сообщение от float
|
Стандартная функция не вызывает fn если элемент undefined.
|
Вызывает, если элемент undefined, но свойство с таким индексом есть:
var t = new Array(5);
t[1] = undefined;
t.map(function(c, i) {alert(c); return 2;});
|
|
31.08.2011, 19:26
|
Профессор
|
|
Регистрация: 16.03.2010
Сообщений: 1,618
|
|
Сообщение от float
|
я отталкивался от предположения, что массив это участок в памяти, а new Array(n) его выделяет. В вашем случае компилятор просто возвращает тот же undefined, хотя св-во не объявлено и выделения памяти под него небыло.
|
Лучше отталкиваться от предположения, что Array - это обычный объект. Только у него есть сеттер на добавление индексов, чтобы менять свойство length.
|
|
31.08.2011, 19:34
|
|
Профессор
|
|
Регистрация: 01.07.2010
Сообщений: 387
|
|
Цитата:
|
Лучше отталкиваться от предположения, что Array - это обычный объект. Только у него есть сеттер на добавление индексов, чтобы менять свойство length.
|
хм... учтёмс
|
|
31.08.2011, 19:43
|
|
Профессор
|
|
Регистрация: 01.07.2010
Сообщений: 387
|
|
У меня кстати есть предложение по сжиманию кода. Я у себя делаю так:
(function(A) {
})(Array.prototype);
Имхо коротко и понятно
Хотя в вашем случае это будет не так красиво, зачем-то ещё Array передаёте...
Последний раз редактировалось float, 31.08.2011 в 19:45.
|
|
31.08.2011, 20:01
|
|
|
Регистрация: 10.07.2008
Сообщений: 3,873
|
|
Сообщение от float
|
зачем-то ещё Array передаёте...
|
isArray не в прототипе
|
|
31.08.2011, 20:14
|
Новичок на форуме
|
|
Регистрация: 19.02.2008
Сообщений: 9,177
|
|
Сообщение от float
|
я отталкивался от предположения, что массив это участок в памяти, а new Array(n) его выделяет.
|
В JavaScript массив это обычный объект, у которого переопределён внутренний метод [[Set]], который следит за свойством length и за числовыми свойствами.
Правила такие
При установке свойства length удаляются числовые свойства больше либо равные новому length.
При установке числового свойства, если length не больше этого свойства, то length устанавливается на единицу больше этого свойства.
Отрицательный length, кстати, присвоить нельзя.
Некоторые следствия из этих правил.
Свойство length равно количеству элементов в массиве только при аккуратной работе с массивом (нет пропусков элементов). В общем случае length всегда больше максимального индекса в массиве.
Чтобы очистить массив, достаточно свойству length присвоить 0.
|
|
31.08.2011, 21:22
|
|
Профессор
|
|
Регистрация: 01.07.2010
Сообщений: 387
|
|
Цитата:
|
При установке свойства length
|
перепроверил даже. блин глазам не верю . всегда считал length рид онли... бывает же такое.
Да... я уже понял, что рассматривать низкий уровень в js-се не катит, тк его движки сами написаны на ОО язке/ах...
Kolyaj, сенкс за доходчивое объяснение.
Наверное надо всё таки собраться и прочитать http://javascript.ru/ecma/part15
Последний раз редактировалось float, 31.08.2011 в 21:26.
|
|
02.09.2011, 22:27
|
|
|
Регистрация: 10.07.2008
Сообщений: 3,873
|
|
Переопределенные 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
|
|
02.09.2011, 22:52
|
Новичок на форуме
|
|
Регистрация: 19.02.2008
Сообщений: 9,177
|
|
Сообщение от 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')])
|
|
|
|