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

DreamTheater 22.02.2012 23:04

Цитата:

Сообщение от vasa_c (Сообщение 159289)
Именно. Она универсально работает со всем подряд и ей совершенно всё равно, что семантически работать с ними нужно по разному.
Ей всё равно, что при переборе HTMLCollection мне не нужен ни item, ни length.

Цитата:

Where only the properties of the object should be considered, a hasOwnProperty check should be performed to ensure that only properties of the object and not inherited properties are used (propertyIsEnumerable can also be used but is not intuitive).
Кто же виноват что Вы не знаете элементарных основ.

vasa_c 22.02.2012 23:11

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

Вы продолжаете отвечать на вопросы "почему так?" ответом "потому что так".
На вопрос "почему таков стандарт" - "потому что так написано в стандарте".

Gozar 22.02.2012 23:18

/me Достал попкорн и наблюдает "у кого больше" :)

Mахmaxmaximus 22.02.2012 23:18

Цитата:

Сообщение от vasa_c
какого чёрта он возвращает object?

а что он должен по твоему возвращать?Kolyaj,
по моему все есть в этом блоге который я перечитал
http://dmitrysoshnikov.com/

DreamTheater 22.02.2012 23:22

Цитата:

Сообщение от vasa_c (Сообщение 159298)
Гражданин, я ни с кем из присутствующих не переходил на личности и не высказывал своё мнения о чьей либо компетенции.
Попрошу и вас воздержаться.
Хотя "вы" разрешаю писать с маленькой буквы.

Вы продолжаете отвечать на вопросы "почему так?" ответом "потому что так".
На вопрос "почему таков стандарт" - "потому что так написано в стандарте".

Если не нравится JS, пишите на Java, C++, на чем угодно, Вас кто-то заставляет? Но тем не менее Вы пришли сюда, в JS комьюнити, и высказываете тут свое "фе" по отношению к языку, о котором, похоже, вообще имеете весьма поверхностное представление.

Думаю, люди, которые программируют на JS, сами могут сделать выводы о том насколько хорош язык и насколько он подходит для решения их задач.

vasa_c 22.02.2012 23:23

Цитата:

Сообщение от Mахmaxmaximus
а что он должен по твоему возвращать?

он должен возвращать что-нибудь по чему я смогу идентифицировать суть того, что получил, а не "object" в 80% случаев.

С чем наконец то начинают соглашаться и сами разработчики: http://wiki.ecmascript.org/doku.php?...ny:typeof_null

Mахmaxmaximus 22.02.2012 23:25

Цитата:

Сообщение от vasa_c
С чем наконец то начинают соглашаться и сами разработчики: http://wiki.ecmascript.org/doku.php?...ny:typeof_null

ну вот соглашаются, в чем проблема? я тоже думаю что нужно бы создать тип для null.

Так можно пример с АДОМ типов данных и работой оператора typeof ?

vasa_c 22.02.2012 23:25

Цитата:

Сообщение от DreamTheater
Если не нравится JS, пишите на Java, C++, на чем угодно, Вас кто-то заставляет? Но тем не менее Вы пришли сюда, в JS комьюнити, и высказываете тут свое "фе" по отношению к языку, о котором, похоже, вообще имеете весьма поверхностное представление.

Мне нравится JS и мне нравится писать о нём.
Но он мне нравится, как мой рабочий инструмент, а не как объект боготворения.
И мне кажется вы слишком близко к сердцу принимаете нашу беседу.

vasa_c 22.02.2012 23:34

Цитата:

Сообщение от Mахmaxmaximus
Так можно пример с АДОМ типов данных и работой оператора typeof ?

Ну успокойтесь уже.
Я в первом же ответе после вашего сообщения предложил подумать над простейшей функцией. В ней нужно определять типы переменных. И задача эта не такая простая как с первого взгляда кажется.

vasa_c 22.02.2012 23:36

Всем спокойной ночи, пусть у всех всё будет хорошо.

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++)
, можно ведь написать так?

nikita.mmf 23.02.2012 17:57

Цитата:

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

Так нужно написать, об этом ведь и идет речь. Каждый перебор должен вестись согласно типу. Для массивов и массивоподобных( arguments, htmlcollection ) объектов через for( ; ; ), а для объектов через for in.

DreamTheater 23.02.2012 18:09

Цитата:

Сообщение от nikita.mmf (Сообщение 159439)
Так нужно написать, об этом ведь и идет речь. Каждый перебор должен вестись согласно типу. Для массивов и массивоподобных( arguments, htmlcollection ) объектов через for( ; ; ), а для объектов через for in.

Ну вот, а чувак похоже хочет чтобы все решалось применением метода сделатьВсеХорошо().

nikita.mmf 23.02.2012 18:20

DreamTheater,
просто вы привели код с for in, в который по сути необходимо добавить проверку типов.

DreamTheater 23.02.2012 18:28

Цитата:

Сообщение от nikita.mmf (Сообщение 159446)
DreamTheater,
просто вы привели код с for in, в который по сути необходимо добавить проверку типов.

:agree:

vasa_c 23.02.2012 18:50

Цитата:

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

вестимо так!

vasa_c 23.02.2012 18:52

Цитата:

Сообщение от DreamTheater
Ну вот, а чувак похоже хочет чтобы все решалось применением метода сделатьВсеХорошо().

я хочу перебирать словари через for..in, а списки через for (;;), но для этого сначала нужно определить чем является полученная структура. И typeof нам в этом не помогает.

vasa_c 23.02.2012 18:55

Цитата:

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

это связано с тем, что универсальный кроссбраузерный пример, написанный за минуту не работает.

Mахmaxmaximus 23.02.2012 19:07

Цитата:

Сообщение от vasa_c
И typeof нам в этом не помогает.

конечно, потому что этот оператор не для этого, с чего бы ему помогать:p
Тебе поможет секретное свойство предназначенное для этого)

Mахmaxmaximus 23.02.2012 19:22

Я еще раз всем обьясню:

1)есть типы данных: обьект, строка, число, булиан, андефайнд, function. ВСЕ!

2) тип данных "Обьект" в свою очередь делятся на свои типы(КЛАССЫ):
Массивы, DOM элементы, просто обьекты(словари) , jQuery обьекты и.т.п.

typeof определяет тип данных! обьект не обьект строка не строка, число ли не число.


если ты хочешь оператор который бы возвращал класс обьекта, например "Array" или "DOMelement" то для этого есть специальное волшебное свойство, тебе нужно просто обратится к нему, к свойству в котором лежит строчка с названием класса обьекта.

alert([1,2,3,4,5] .constructor.name)

alert({a:1}  .constructor.name)

alert(document.createElement('a') .constructor.name)

при чем всё выше по типу данных - обьекты.
видишь как все просто)) и операторы не нужны XD

vasa_c 26.02.2012 14:34

Прошу прощения за отсутствие, надеюсь не скучали :)

Цитата:

Сообщение от Mахmaxmaximus
Я еще раз всем обьясню:

Максмаксмаксимус, ты вообще умеешь вести дискуссию без менторского тона?

Цитата:

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

console.log(document.getElementsByTagName("script").constructor.name);
console.log(document.createElement("div").constructor.name);
console.log(document.createTextNode("text").constructor.name);


Firefox 10.0.2, Ubuntu:
Цитата:

undefined
undefined
undefined
Opera 10.62
Цитата:

Object
Function.prototype
Object
IE под рукой нет, но что-то гложат меня сомнения, что там всё лучше.
Насколько помню, там у DOM-объектов раньше вообще конструкторов и прототипов не было.


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