- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
var renderHours = function(s){
var html = '<ul>';
var json = Ext.decode(s);
for(i in json)
if(typeof json[i].from_d != 'undefined')
html += '<li>с <b>'
+ hours[json[i].from_d][1]
+ '</b> - по <b>'
+ hours[json[i].to_d][1]
+ '</b> ('
+ json[i].from_h +':'+ json[i].from_m +'-'
+json[i].to_h +':'+ json[i].to_m +')</li>';
return html+'</ul>';
};
Зачем? Почему нужно сравнивать со строкой, когда x === undefined делает то же самое, но напрямую.
ЗЫ. Было бы интересно, если бы там передавалось что-то типа { from_d : "<img src='site.com/32.jpeg'>" }
Под некоторыми браузерами, как обычно, подразумевается IE?
>It's not a keyword at all, but a variable that (most of the time) happens to be undefined
Открываю, например, MDC и вижу:
>undefined is a property of the global object, i.e. it is a variable in global scope.
>Implemented in JavaScript 1.3 (это было давно)
WTF?
Если это почему-то не работало в ИЕ - в какой версии? Это почти наверняка что-то очень древнее (хз, у меня нет ИЕ и проверить не в чем).
Что сейчас по этому поводу говорит МСДН:
Ну так они же говорят про незадекларированные переменные! json[i].from_d никакая не переменная вообще же.
Но вообще сакральная суть typeof в том, что в случае отсутствия переменной как таковой, он не кинет ошибки, а честно напишет 'undefined':
var eh;
typeof eh === 'undefined'; //true
eh === undefined; //true
typeof neh === 'undefined'; //true
neh === undefined; //ReferenceError: neh is not defined
Как-то вобщем логика такого примера меня смущает - у меня никогда не было ситуации, когда я был не уверен в том, что переменную объявляли уже / еще не объявляли, но будут.
Мне кажется, это имеет смысл при работе с глобальным скопом. Например, для эмуляции нэймспэйсов:
hasOwnProperty в этом случае - плохо потому что собирает только свойства объявленные этим объектом. Т.е. если вы захотите создать пакет с, например, именем __proto__ или что-нибудь такое - может быть облом.
Но вообще, сама по себе идея плохая, т.как создавая такие псевдо-пакеты вы работаете против минимизатора, т.как он уже не сможет повыбрасывать эти имена. Кроме того, вы работаете против других библиотек, и мешаете им использовать минимизатор. Нормальным в Яваскрипте было бы, как раньше в ПХП или в том же эЛиспе - префиксы к функциям. Минимизатор будет с таким хорошо работать, не создаются лишние сущности загрязняющие глобальный неймспейс и т.д.
Когда module заработает - возможно что-то такое в нем будет, а пока я бы такого не делал (но, увы, это частая практика).
Я не утверждаю, что нэймспейсы - хорошая идея. Просто они имеют место быть.
P.S. я знаю, как работает hasOwnProperty. как раз я и не хочу подцепить объект из прототипа, я хочу объявить его именно в нэймспейсе com. Очевидно, объект com должен быть создан только один раз, причём точно не тем, кто использует эти библиотеки. Если он создавался только в одной библиотеке, была бы зависимость от порядка подключения.
По делу я в принципе согласен что это левак, да и в большинстве случаев вообще сравнение с undefined ни к чему.
Всё это в основном от недопонимания человеком того, что он делает. Ну и изредка для красоты, когда typeof проверки в линеечку стоят.)
Мозила разрешает переопределить undefined, и в последней строчке будет number. Хром не разрешает и упадет с ошибкой на предпоследней строчке. ИЕ даже ради такого дела решил поставить, восьмой, но загрузить в него локальный файл не удалось, как-то очень коряво он из под Wine работает.