- 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>';
};
wvxvw 11.07.2012 21:17 # −1
Зачем? Почему нужно сравнивать со строкой, когда x === undefined делает то же самое, но напрямую.
ЗЫ. Было бы интересно, если бы там передавалось что-то типа { from_d : "<img src='site.com/32.jpeg'>" }
Lowezar 11.07.2012 21:40 # +1
bormand 11.07.2012 21:46 # +6
Под некоторыми браузерами, как обычно, подразумевается IE?
WGH 12.07.2012 00:06 # 0
>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?
roman-kashitsyn 12.07.2012 00:21 # 0
wvxvw 12.07.2012 12:31 # 0
Если это почему-то не работало в ИЕ - в какой версии? Это почти наверняка что-то очень древнее (хз, у меня нет ИЕ и проверить не в чем).
Что сейчас по этому поводу говорит МСДН:
Ну так они же говорят про незадекларированные переменные! json[i].from_d никакая не переменная вообще же.
guest 11.09.2012 13:05 # 0
AjiTae 12.07.2012 12:36 # 0
Но вообще сакральная суть typeof в том, что в случае отсутствия переменной как таковой, он не кинет ошибки, а честно напишет 'undefined':
var eh;
typeof eh === 'undefined'; //true
eh === undefined; //true
typeof neh === 'undefined'; //true
neh === undefined; //ReferenceError: neh is not defined
wvxvw 12.07.2012 12:49 # 0
Как-то вобщем логика такого примера меня смущает - у меня никогда не было ситуации, когда я был не уверен в том, что переменную объявляли уже / еще не объявляли, но будут.
roman-kashitsyn 12.07.2012 12:58 # 0
Мне кажется, это имеет смысл при работе с глобальным скопом. Например, для эмуляции нэймспэйсов:
wvxvw 12.07.2012 13:36 # 0
hasOwnProperty в этом случае - плохо потому что собирает только свойства объявленные этим объектом. Т.е. если вы захотите создать пакет с, например, именем __proto__ или что-нибудь такое - может быть облом.
Но вообще, сама по себе идея плохая, т.как создавая такие псевдо-пакеты вы работаете против минимизатора, т.как он уже не сможет повыбрасывать эти имена. Кроме того, вы работаете против других библиотек, и мешаете им использовать минимизатор. Нормальным в Яваскрипте было бы, как раньше в ПХП или в том же эЛиспе - префиксы к функциям. Минимизатор будет с таким хорошо работать, не создаются лишние сущности загрязняющие глобальный неймспейс и т.д.
Когда module заработает - возможно что-то такое в нем будет, а пока я бы такого не делал (но, увы, это частая практика).
roman-kashitsyn 12.07.2012 13:47 # 0
Я не утверждаю, что нэймспейсы - хорошая идея. Просто они имеют место быть.
P.S. я знаю, как работает hasOwnProperty. как раз я и не хочу подцепить объект из прототипа, я хочу объявить его именно в нэймспейсе com. Очевидно, объект com должен быть создан только один раз, причём точно не тем, кто использует эти библиотеки. Если он создавался только в одной библиотеке, была бы зависимость от порядка подключения.
wvxvw 12.07.2012 14:23 # 0
AjiTae 12.07.2012 13:03 # 0
wvxvw 12.07.2012 13:06 # +2
AjiTae 12.07.2012 13:20 # 0
По делу я в принципе согласен что это левак, да и в большинстве случаев вообще сравнение с undefined ни к чему.
Всё это в основном от недопонимания человеком того, что он делает. Ну и изредка для красоты, когда typeof проверки в линеечку стоят.)
wvxvw 12.07.2012 14:49 # 0
Мозила разрешает переопределить undefined, и в последней строчке будет number. Хром не разрешает и упадет с ошибкой на предпоследней строчке. ИЕ даже ради такого дела решил поставить, восьмой, но загрузить в него локальный файл не удалось, как-то очень коряво он из под Wine работает.