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 17:32

Непонятки с оператором typeof
 
http://shamansir.github.com/JavaScri.../#types.typeof

я вообще не понял либо авторы тупят либо я, Тайпоф не возвращает класс или тип обьекта. Он возвращает то, к какому из нативнйх типов данных принадлежит операнд:

string undefined function number object boolean

авторы этого не знают? О_О Или они просто считают это неправильным?

Но по моему это правильно! Класс обьекта нужно определять по другому! Тут просто определяется тип данных.

DreamTheater 22.02.2012 17:44

https://developer.mozilla.org/en/Jav...erators/typeof

SkyLight 22.02.2012 18:15

Цитата:

Сообщение от Mахmaxmaximus
Класс обьекта нужно определять по другому!

А где вы там увидели, что они класс определяют через typeof? Нету там такого. Определение имени "класса" идет ниже и совсем другим методом.

Mахmaxmaximus 22.02.2012 18:19

Цитата:

Сообщение от SkyLight
А где вы там увидели, что они класс определяют через typeof? Нету там такого. Определение имени "класса" идет ниже и совсем другим методом.

они говорят что тайпоф сломанный, мыл не определяет класс обьекта, и приходится его заменять тем костылем что они написали ниже.
Но тайпоф и не должен определять тип обьекта он должен определять то к какому типу данных javascript относится операнд.
Если операнд относится к дипу данных object то тогда уже можно определять его класс.

Еще раз повторяю, тайпоф определяет на тип класс, а тип данных операнда! В javascript не все есть обьект!


DreamTheater,
и?

vasa_c 22.02.2012 18:22

Ну, люди выражают своё резкое нетерпимое мнение по всем подряд вопросам, включая те, в которых они не всегда хорошо шарят.
Я полностью одобряю!

Mахmaxmaximus 22.02.2012 18:24

Цитата:

Сообщение от vasa_c
Я полностью одобряю!

меня или их?

моя позиция в том что "не знаешь - не учи"

DreamTheater 22.02.2012 18:44

Цитата:

Сообщение от Mахmaxmaximus (Сообщение 159204)
они говорят что тайпоф сломанный, мыл не определяет класс обьекта, и приходится его заменять тем костылем что они написали ниже.
Но тайпоф и не должен определять тип обьекта он должен определять то к какому типу данных javascript относится операнд.
Если операнд относится к дипу данных object то тогда уже можно определять его класс.

Еще раз повторяю, тайпоф определяет на тип класс, а тип данных операнда! В javascript не все есть обьект!


DreamTheater,
и?

То есть typeof работает не так как они хотели бы, но это не означает что он работает неверно.
Цитата:

The typeof operator returns a string indicating the type of the unevaluated operand.
В каком месте тут Вы видите что typeof определяет какие-то "классы"?

Mахmaxmaximus 22.02.2012 18:50

Цитата:

Сообщение от DreamTheater
То есть typeof работает не так как они хотели бы, но это не означает что он работает неверно.

А, ну вот и я к тому, я прост подумал ты как то за них заступился) а по ссылке наоборот подтверждение.

Я реал этот гарден все дочитать не мог и вот решил дочитать и наткнулся на такой вот нубство.. Позор уже отписал переводчикам.

Цитата:

Сообщение от DreamTheater
В каком месте тут Вы видите что typeof определяет какие-то "классы"?

Ну, типы и классы это одно и тоже. Это синонимы.
Но есть типы данных а, есть типы обьектов. Школьки с гардена этого не знают.



И то что оператор new создает обьект им видимо тоже неведомо)

DreamTheater 22.02.2012 19:21

https://developer.mozilla.org/en/Jav...bject/toString

Цитата:

Using toString() to detect object class

toString() can be used with every object and allows you to get its class. To use the Object.prototype.toString() with every object, you need to call Function.prototype.call() or Function.prototype.apply() on it, passing the object you want to inspect as the first parameter called thisArg.
var toString = Object.prototype.toString;

toString.call(new Date); // [object Date]
toString.call(new String); // [object String]
toString.call(Math); // [object Math]

//Since JavaScript 1.8.5
toString.call(undefined); // [object Undefined]
toString.call(null); // [object Null]

vasa_c 22.02.2012 19:39

Цитата:

моя позиция в том что "не знаешь - не учи"
Ну здесь скользкий момент.
В какой-то момент может оказаться, что, что казалось знал и чему учил, на самом деле не знал ни разу.

vasa_c 22.02.2012 19:40

А то что с типами и typeof в JS (и в разных браузерах) ад кромешный, это факт.

DreamTheater 22.02.2012 19:41

Цитата:

Сообщение от vasa_c (Сообщение 159221)
А то что с типами и typeof в JS (и в разных браузерах) ад кромешный, это факт.

И в чем же именно заключаются сложности?

vasa_c 22.02.2012 19:48

Цитата:

И в чем же именно заключаются сложности?
Хэш, порядковый массив и HTML-коллекция это разные структуры данных, но чтобы различить их я должен убиться.
Object.prototype.toString() немного помогает, но кроме одного браузера и я думаю все знают его имя.
Ну и typeof null === "object" тоже круто.

DreamTheater 22.02.2012 19:51

Цитата:

Сообщение от vasa_c (Сообщение 159223)
Хэш, порядковый массив и HTML-коллекция это разные структуры данных, но чтобы различить их я должен убиться.
Object.prototype.toString() немного помогает, но кроме одного браузера и я думаю все знают его имя.
Ну и typeof null === "object" тоже круто.

Все верно, в JS null является объектом без прототипа, соответственно его тип - object.

alert([].constructor === Array);
alert(document.getElementsByTagName('div').constructor === HTMLCollection);

В чем проблема?

Mахmaxmaximus 22.02.2012 19:54

Цитата:

Сообщение от vasa_c
А то что с типами и typeof в JS (и в разных браузерах) ад кромешный, это факт.

Можно примерчик ада? Проверю во всех браузерах.

vasa_c 22.02.2012 19:55

Можно много говорить чем что является с сугубо теоретической точки зрения.
Можно вспомнить аналогии из C++ и Java, что null, это значение объекта, обозначающее его отсутствие.
И вообще подо всё подвести теоретическую базу, откопать ECMA и начать цитировать его, как библию.

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

DreamTheater 22.02.2012 19:59

Цитата:

Сообщение от vasa_c (Сообщение 159226)
Можно много говорить чем что является с сугубо теоретической точки зрения.
Можно вспомнить аналогии из C++ и Java, что null, это значение объекта, обозначающее его отсутствие.
И вообще подо всё подвести теоретическую базу, откопать ECMA и начать цитировать его, как библию.

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

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

Опять же, можете привести пример одного из "грязных хаков"?

vasa_c 22.02.2012 20:00

Цитата:

Можно примерчик ада? Проверю во всех браузерах.
Например, нужно написать универсальную функцию, которая получает на вход некую структуру и выполняет некоторые действия над всеми её объектами.
Просто итерировани, each() тот же.

Соответственно, простые хэши нужно перебрать по свойствам. Массивы, коллекции, arguments, перебрать по порядку.
Функции и HTMLElement перебирать вообще не нужно, так как это уникальные сущности, а не хранилища данных.

Mахmaxmaximus 22.02.2012 20:01

vasa_c,
я еще раз повторю

Цитата:

с типами и typeof в JS ад кромешный
можно примерчик?

vasa_c 22.02.2012 20:02

Цитата:

То есть с Вашей точки зрения те кто пишут спецификации и разрабатывают языки программирования идиоты, которые просто от нечего делать мешают Вам работать?
Перешли на "сперва добейся"?

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

Вы считаете JS идеальным языком?

DreamTheater 22.02.2012 20:03

Во-первых массивы и массивоподобные объекты это разные сущности, которые итерируются совершенно по-разному. А во-вторых уже давным-давно написаны универсальные функции для работы с коллекциями, например в Underscore.

DreamTheater 22.02.2012 20:04

Цитата:

Сообщение от vasa_c (Сообщение 159231)
Вы считаете JS идеальным языком?

Нет, не считаю.

vasa_c 22.02.2012 20:04

Цитата:

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

vasa_c 22.02.2012 20:06

Цитата:

давным-давно написаны универсальные функции для работы с коллекциями, например в Underscore.
Понятно что функции написаны и что более-менее шарящий в предмете человек тоже их напишет если нужно.
Сама проблема именно в том, что эти функции пришлось писать, вместо того, чтобы просто работать с языком.

vasa_c 22.02.2012 20:07

Цитата:

Во-первых массивы и массивоподобные объекты это разные сущности, которые итерируются совершенно по-разному.
Чем должна отличаться сущность итерации по Array() и HTMLCollection?

DreamTheater 22.02.2012 20:09

Цитата:

Сообщение от vasa_c (Сообщение 159235)
Понятно что функции написаны и что более-менее шарящий в предмете человек тоже их напишет если нужно.
Сама проблема именно в том, что эти функции пришлось писать, вместо того, чтобы просто работать с языком.

Конструкция for...in работает с абсолютно любыми видами коллекций, чем не универсальность?

DreamTheater 22.02.2012 20:10

Цитата:

Сообщение от vasa_c (Сообщение 159236)
Чем должна отличаться сущность итерации по Array() и HTMLCollection?

Тем что в массивах есть индексы, а во всех прочих - имена свойств, то есть первые являются числами, а вторые - строками.

Mахmaxmaximus 22.02.2012 20:23

Цитата:

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

я нихрена не понял О_О

в чем ад работы с типами данных с typeof в javascript? можно пример кода где проявляется адовость?

Octane 22.02.2012 20:32

Вообще надо хотя бы разок заглянуть в http://javascript.ru/ecma/part11#a-11.4.3 и «ад кромешный» рассеется.
-------------

Цитата:

Сообщение от DreamTheater
Все верно, в JS null является объектом без прототипа, соответственно его тип - object.

Это Object.prototype.__proto__===null, сам null является отдельным типом, то что выдает typeof — соглашение
Цитата:

Сообщение от Dmitry Soshnikov
Всего стандарт определяет девять типов, причём непосредственно доступны в ECMAScript программе, всего шесть:

• Undefined
Null
• Boolean
• String
• Number
• Object

Остальные три типа доступны лишь на уровне реализации…

Цитата:

Сообщение от Dmitry Soshnikov
оператор typeof возвращает строковое значение, взятое из жёстко закреплённой таблицы, где прописано: “для null – возвращать "object"

http://dmitrysoshnikov.com/ecmascrip...nyih-znacheniy

Mахmaxmaximus 22.02.2012 20:38

Octane,
ты стандарт наизусть знаешь?

DreamTheater 22.02.2012 20:40

Цитата:

Сообщение от Mахmaxmaximus (Сообщение 159249)
Octane,
ты стандарт наизусть знаешь?

Он из тех кто "цитирует ECMAScript как Библию" :D

Octane 22.02.2012 20:43

Ну не наизусть… да и мне далеко до теории уровня Дмитрия Сошникова, он бы сейчас вам тут рассказал!

Mахmaxmaximus 22.02.2012 20:52

А Илья че)?

Gozar 22.02.2012 21:24

Про null на прошлой неделе поднимали вопрос, но стандарт действительно желательно иногда читать.

Кстати вот схемка про null:

http://www.mollypages.org/misc/js.mp

Заглушка это, насколько я понял кто-то сказал и все согласились, чтобы не спорить, т.к идей других не было :)

Mахmaxmaximus 22.02.2012 21:41

Цитата:

Сообщение от Octane
Всего стандарт определяет девять типов, причём непосредственно доступны в ECMAScript программе, всего шесть:

магия

var q = function(){}
alert( typeof q )

var q = ""
alert( typeof q )

var q = {}
alert( typeof q )

var q = 1
alert( typeof q )

var q = undefined
alert( typeof q )

var q = true
alert( typeof q )

var q = null
alert( typeof q )


что значит непосредственно доступны?
я только что получил доступ к семи


ОЙ ЗАТУПИЛ)))))

Kolyaj 22.02.2012 22:16

Mахmaxmaximus,
раз уж ты в дебри языка полез, на тебе небольшую подборку
http://javascript.ru/forum/offtopic/...avascript.html
http://javascript.ru/forum/misc/3158...reference.html
http://javascript.ru/forum/study/572...ipt-ninja.html
http://javascript.ru/forum/misc/5731...h-obektov.html
http://javascript.ru/forum/misc/5329...lik-imjon.html

Mахmaxmaximus 22.02.2012 22:28

Kolyaj,
Ты золотой человек! Я серьезно! Спасибо!

vasa_c 22.02.2012 22:43

Цитата:

Сообщение от DreamTheater
Конструкция for...in работает с абсолютно любыми видами коллекций, чем не универсальность?

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

vasa_c 22.02.2012 22:45

Цитата:

Сообщение от Mахmaxmaximus
я нихрена не понял О_О

в чем ад работы с типами данных с typeof в javascript? можно пример кода где проявляется адовость?

Я привёл простейший пример функции которую нужно написать.
Вот в попытке её написания и отладки под все браузеры и проявляется адовость.

vasa_c 22.02.2012 22:50

Цитата:

Сообщение от Octane
Вообще надо хотя бы разок заглянуть в http://javascript.ru/ecma/part11#a-11.4.3 и «ад кромешный» рассеется.

Так проблема не в том что кто-то стандарт не знает.
Конечно, чтение стандарта и знание внутренней реализации полностью проливает свет на то, почему что-то именно так работает.

У меня нет вопроса почему typeof null возвращает object.
У меня есть вопрос - какого чёрта он возвращает object?

И тот же вопрос есть и у самих разработчиков, к чьему непререкаемому авторитету тут уже аппелировали.
В ES5 typeof null теперь возвращает "null".


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