Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #91 (permalink)  
Старый 31.08.2011, 19:23
Аватар для float
Профессор
Отправить личное сообщение для float Посмотреть профиль Найти все сообщения от float
 
Регистрация: 01.07.2010
Сообщений: 387

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

Последний раз редактировалось float, 31.08.2011 в 19:25.
Ответить с цитированием
  #92 (permalink)  
Старый 31.08.2011, 19:23
Профессор
Отправить личное сообщение для Sweet Посмотреть профиль Найти все сообщения от Sweet
 
Регистрация: 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;});
Ответить с цитированием
  #93 (permalink)  
Старый 31.08.2011, 19:26
Профессор
Отправить личное сообщение для Sweet Посмотреть профиль Найти все сообщения от Sweet
 
Регистрация: 16.03.2010
Сообщений: 1,618

Сообщение от float
я отталкивался от предположения, что массив это участок в памяти, а new Array(n) его выделяет. В вашем случае компилятор просто возвращает тот же undefined, хотя св-во не объявлено и выделения памяти под него небыло.
Лучше отталкиваться от предположения, что Array - это обычный объект. Только у него есть сеттер на добавление индексов, чтобы менять свойство length.
Ответить с цитированием
  #94 (permalink)  
Старый 31.08.2011, 19:34
Аватар для float
Профессор
Отправить личное сообщение для float Посмотреть профиль Найти все сообщения от float
 
Регистрация: 01.07.2010
Сообщений: 387

Цитата:
Лучше отталкиваться от предположения, что Array - это обычный объект. Только у него есть сеттер на добавление индексов, чтобы менять свойство length.
хм... учтёмс
Ответить с цитированием
  #95 (permalink)  
Старый 31.08.2011, 19:43
Аватар для float
Профессор
Отправить личное сообщение для float Посмотреть профиль Найти все сообщения от float
 
Регистрация: 01.07.2010
Сообщений: 387

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

})(Array.prototype);


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

Последний раз редактировалось float, 31.08.2011 в 19:45.
Ответить с цитированием
  #96 (permalink)  
Старый 31.08.2011, 20:01
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

Сообщение от float
зачем-то ещё Array передаёте...
isArray не в прототипе
Ответить с цитированием
  #97 (permalink)  
Старый 31.08.2011, 20:14
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Сообщение от float
я отталкивался от предположения, что массив это участок в памяти, а new Array(n) его выделяет.
В JavaScript массив это обычный объект, у которого переопределён внутренний метод [[Set]], который следит за свойством length и за числовыми свойствами.

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

Некоторые следствия из этих правил.
Свойство length равно количеству элементов в массиве только при аккуратной работе с массивом (нет пропусков элементов). В общем случае length всегда больше максимального индекса в массиве.
Чтобы очистить массив, достаточно свойству length присвоить 0.
Ответить с цитированием
  #98 (permalink)  
Старый 31.08.2011, 21:22
Аватар для float
Профессор
Отправить личное сообщение для float Посмотреть профиль Найти все сообщения от float
 
Регистрация: 01.07.2010
Сообщений: 387

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

Последний раз редактировалось float, 31.08.2011 в 21:26.
Ответить с цитированием
  #99 (permalink)  
Старый 02.09.2011, 22:27
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 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
Ответить с цитированием
  #100 (permalink)  
Старый 02.09.2011, 22:52
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 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')])
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск