Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Непонятки с оператором typeof (https://javascript.ru/forum/misc/26014-neponyatki-s-operatorom-typeof.html)

Mахmaxmaximus 22.02.2012 23:47

Цитата:

Сообщение от vasa_c
И задача эта не такая простая как с первого взгляда кажется.

Я читая то сообщение ответил что прошу пример. Разве не понятно что повтор того сообщения новой информации мне не принесет? Я ЧИТАЯ то твое сообщение попросил привести примеры.

Приведи пример где что-то работает адово и неправильно? А то я что-то вообще не понимаю о чем ты? Может тебе прсто стоит почитать учебник для начинающий если тебе что-то кажется трудным? Или спецификацию. А лучше напиши мне я тебе на вопросы отвечу и побьясню что как работает чтобы не казалось адовым. я же помочь хочу. Если ты не пришлешь пример с кодом где у тебя возникают проблемы и адовый дискомфорт, то будем считать что это просто твоя нубоватость его вызывает).
И тебе просто нужно подучиться. И набраться опыта.


vasa_c 23.02.2012 12:24

Mахmaxmaximus, твой съезд на личности не добавляет авторитета твоим сообщениям.

Попробую пояснить в последний раз - я понимаю как и что работает, безо всяких объяснений. Меня не до конца нравится как именно это работает.

Mахmaxmaximus 23.02.2012 14:39

Цитата:

Сообщение от vasa_c
Попробую пояснить в последний раз - я понимаю как и что работает, безо всяких объяснений. Меня не до конца нравится как именно это работает.

как тут безличности если ты - личность, и у тебя проблемы.
Они могут быть связанными с твоим незнанием с нубоватостью!
Либо с языком.

Вот я и просил пример кода чтобы обьяснить что да как.
Просто у меня адовости же нет, я бы и хотел чтобы у тебя её не было.

vasa_c 23.02.2012 14:53

Проблемы есть у всех, но мы здесь обсуждаем не их, а typeof.

"Адовость" в том, что чтобы написать простую функцию требуется множество выкрутасов с последующей отладкой во всех браузерах.

Попробую ещё раз описать её.
Нужно проитерировать произвольное входное значение.
Для этого нужно соотнести её с одним из трёх семантически различных типов:

1. грубо говоря "словарь": то что итерировать нужно через for..in.

2. список (Array, arguments, HTMLCollection ...), перебираемый последовательным доступом.

3. скаляр, сюда же нужно отнести function, DOMElement, TextNode и другие подобные структуры.
хотя они и являются объектами, но работать нужно с их значением, а не набором привязанных свойств.

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

DreamTheater 23.02.2012 15:48

function each(collection, callback, scope) {
    var key;

    for (key in collection) {
        if (collection.hasOwnProperty(key) {
            callback.call(scope, collection[key], key, collection);
        }
    }
}


Кроссбраузерность 100%. Я потратил на написание меньше минуты.

vasa_c 23.02.2012 16:58

Первое же на вскидку, что могу сказать:

1. Chrome, Opera и Safari в HTMLCollection переберут и свойство length

2. В IE7 у HTMLCollection вообще нет метода hasOwnProperty() - вылетит с ошибкой.

3. 3-й пункт моего примера не обрабатывается.

4. Любое добавленное к массиву или коллекции свойство попадёт в перебор.
Пример - перебор jQuery-объекта.

Mахmaxmaximus 23.02.2012 17:35

function each(collection, callback, scope) {
    var key;

    for (key in collection) if (collection.hasOwnProperty(key) {
         
            callback.call(scope, collection[key], key, collection);
      
    }
}



1. Chrome, Opera и Safari в HTMLCollection переберут и свойство length
обманываете

2. В IE7 у HTMLCollection вообще нет метода hasOwnProperty() - вылетит с ошибкой.
это как то связано с javascript?

4. Любое добавленное к массиву или коллекции свойство попадёт в перебор.
Пример - перебор jQuery-объекта.

так ты это и хотел, а если нет, то отвечу так:

есть универсальный итератор, я его выше показал, если нужен персональный итератор для определенного класса сущностей то сделай его.

DreamTheater 23.02.2012 17:42

Добавлять свойства к уже определенным ранее объектам это признак дурного тона, а если Вам было необходимо расширить функционал уже нативных коллекций, тогда следовало бы создать наследника и использовать его в своих нуждах. В таком случае пользовательские свойства не попадают под итерацию.

nikita.mmf 23.02.2012 17:45

Цитата:

Сообщение от Mахmaxmaximus
4. Любое добавленное к массиву или коллекции свойство попадёт в перебор.
Пример - перебор jQuery-объекта.
так ты это и хотел

Вот пример о чем вообще идет речь.
var arr = [1,2,3]; 
arr.foo = 'bar'; 
for( var  prop in arr ) { 
    arr.hasOwnProperty( prop ) && console.log( prop, arr[prop] ) ;
}


Для перебора нужно использовать, то что для это предназначено.

DreamTheater 23.02.2012 17:49

Цитата:

Сообщение от nikita.mmf (Сообщение 159431)
Вот пример о чем вообще идет речь.
var arr = [1,2,3]; 
arr.foo = 'bar'; 
for( var  prop in arr ) { 
    arr.hasOwnProperty( prop ) && console.log( prop, arr[prop] ) ;
}


Для перебора нужно использовать, то что для это предназначено.

Массивы перебираются через
for (var i = 0; i < arr.length; i++)
, можно ведь написать так?


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