| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > JavaScript: Общие вопросы > намбер или не намбер? |
| Автор: cruelangel 3.10.2007, 20:53 | ||
возвращает: yes no у кого-нибудь есть идеи, почему? |
| Автор: AKS 3.10.2007, 21:04 |
А тут идей не может быть никаких. Все в соответствии со спецификацией. |
| Автор: cruelangel 3.10.2007, 21:16 |
| мрак... |
| Автор: AKS 3.10.2007, 21:21 | ||
Для еще большей "темени" (специально для Вас):
|
| Автор: cruelangel 3.10.2007, 21:25 |
| спасибо, уже нашёл: var n= Object(1); |
| Автор: fidres 9.10.2007, 05:41 |
| кхы-кхы.... а не проще ли проверку на isNaN делать? |
| Автор: AKS 9.10.2007, 06:35 |
Да уж, действительно "кхы-кхы". ))))))))))))) Вы о чем? Проверку чего и для чего? |
| Автор: fidres 12.10.2007, 04:03 |
| AKS, ну на сколько я понял, чувак пытается установить является ли переменная числом... для этого проверяет её тип. смысл в том, что есть встроенные функции определения. не помню точно isNaN или isNum... но не в этом смысл. при желании можно найти описание любой встроеной функции, а не изобретать какие-то свои методы. |
| Автор: cruelangel 12.10.2007, 13:08 |
| fidres, NaN - это тоже число, просто оно особенное, также как и Infinity AKS, в третьих я не против обращений типа "чувак", "перец", "чел" и многих других, пока они не имеют целью унижение собеседника Вообще мне нужно было определить является ли переменная числом и соответственно наследует ли она методы от Number.prototype. проверка ( Object( n ) instanceof Number ) вполне себе нормально работает. вообще, код, приведённый в первом посте, ярко иллюстрирует глупость разработчиков яваскрипта. видите ли числа наследуют у Number методы и поля, но не хотят в этом добровольно сознаваться - приходится крутить их в бараний рог. |
| Автор: AKS 12.10.2007, 14:38 | ||||||||||
В таком случае написать Number.prototype.test было ошибкой.
instanceof всегда нормально работает.
Не то, чтобы "ярко" - он вообще не имеет отношения к глупости или мудрости разработчиков яваскрипт. Могу согласиться, что это яркая демонстрация знаний писавшего.
Да, числа в яваскрипт - хитрые малые. Не всем и не каждому они "добровольно признаются", кто они на самом деле. И правильно делают - при таком-то отношении:
А желание "крутить в бараний рог", по моим наблюдениям, напрямую зависит еще и от темперамента программиста. Точно, как в народной мудрости: "Сила есть - ума не надо". К тому же, модно сейчас даже сам яваскрипт "крутить в бараний рог", чего уж там про числа говорить. |
| Автор: cruelangel 12.10.2007, 16:22 |
| > В таком случае написать Number.prototype.test было ошибкой. почему? |
| Автор: AKS 12.10.2007, 17:48 | ||
А как этот метод может "определить является ли переменная числом и соответственно наследует ли она методы от Number.prototype"??? |
| Автор: cruelangel 12.10.2007, 19:00 |
| по факту своего выполнения |
| Автор: AKS 12.10.2007, 19:12 | ||||
| cruelangel, мы друг друга не поняли - это точно. Для меня фраза "определить является ли переменная числом и соответственно наследует ли она методы от Number.prototype" означает следующее (на примере):
Возможно Вы имели ввиду проверку, вроде такой:
, но я в ней не могу усмотреть какой-либо смысл. :( |
| Автор: cruelangel 12.10.2007, 20:11 |
| я вообще не предлагал так проверять. этот код был написан для иллюстрации, что методы-таки наследуются, в то время как instanceof возвращает false; |
| Автор: fidres 14.10.2007, 09:37 | ||
прошу прощения за оффтоп.
это во-первых. а во-вторых, я осмыслил код именно так, как я попытался его интерпритировать словами. есть переменная. с ней пытаются произвести действия. действия эти направлены на то, чтобы в конечном счёте установить ТИП переменной... или я не прав? если я что-то не правильно сказал - думаю, не лучший способ объяснять мне это нравоучением, да ещё и в общем фрэйме форума, привязываясь к словам. есть кнопочка http://forum.vingrad.ru/act-Msg/CODE-04/MID-30365/p-1284791/t-175341.html, на которую стоит нажать и высказать всё своё мировозрение, не показывая другим какой Вы на самом деле умный! это так - не в обиду сказано. я, конечно, ни на йоту не сомневаюсь в вашей компитенции в данном вопросе, но не стоит ставить себя выше других - это не прилично. |
| Автор: vasac 14.10.2007, 11:19 | ||||
К своим друзьям, подругам и собутыльникам я обращаюсь так, как мне и им нравится. И указаний от третьих лиц по этому поводу не принимаю. Когда же я прихожу на форум, я стараюсь общаться с принятым на этом форуме этикете. И большинство остальных тоже стараются. Аргументируйте чем вы лучше остальных.
Так какого же черта вы свой поток мыслей выложили здесь? |
| Автор: Zeroglif 14.10.2007, 13:22 | ||||||
Тип примитивного значения по определению не является объектным, это не объект, соответственно не чей-либо "экземпляр", нет наследования, нет свойств и т.п., "a primitive value is a datum that is represented directly at the lowest level of the language implementation". Оператор instanceof работает только с объектами, возвращая false в противном случае, так что цитирую AKS-a: "всё в соответствии со спецификацией". Необходимо различать объектный vs. не-объектный тип в javascript, а идеи типа "всё в javascript является объектом!" из головы желательно выкинуть. Наследует и станет "экземпляром" не примитивное значение, а объект "над" ним (корреспондирующий с ним), автоматически создаваемый только в те моменты, когда в соответствии с ECMAScript это потребуется, например:
Во всех этих случаях принудительно создан (на уровне логики движка это может быть реализовано как угодно) новый объект (объектный тип Оbject, объектный "подтип" или "класс" Number), который наследует свойства от Number.prototype и Object.prototype и соответственно является "экземпляром" как Number, так и Оbject (под "является экземпляром" подразумевается то, что в цепи прототипов этого объекта есть и Number.prototype, и Object.prototype). Отсюда зная, что "над" примитивным значением будет создан объект соответствующего "подтипа" совершенно не нужно конвертировать тип в объектный, достаточно только проверить сам тип примитивного значения:
Если на месте переменной n не примитивное значение, а объект, то выявлять его природу (у кого он наследует) с помощью instanceof на мой взгляд не совсем правильно с практической точки зрения, проще проверить наличие какого-нибудь нужного свойства и с ним уже работать, в любом случае дать на 100 процентов верный ответ на вопрос о "подтипе" объекта невозможно, учитывая динамику javascript и возможность переопределения всего и вся. |
| Автор: cruelangel 14.10.2007, 15:04 |
| > Во всех этих случаях принудительно создан (на уровне логики движка это может быть реализовано как угодно) новый объект угу, а теперь, внимание, вопрос - какого лешего instanceof не создаёт этого "надобъекта"? > с помощью instanceof на мой взгляд не совсем правильно с практической точки зрения очень даже правильно. тем самым мы проверяем обладает ли какой-либо объект необходимыми методами, либо в нём они сознательно перегружены. |
| Автор: Zeroglif 14.10.2007, 18:00 | ||||
Ты так спрашиваешь, будто привык к обратному и очень удивился. Можно поставить вопрос иначе - какого лешего программисты не знают, как работают операторы языка, и ждут от них чего-то особенного? А почему сделали так, как сделали - вопрос к сделавшим.
Оператор instanceof никак не проверяет наличие методов, не выдаёт на каком уровне находится прототип, пользы от него мало, получив true от instanceof, ты можешь нарваться на метод: a) отсутствующий в природе; б) свой, не наследуемый; в) наследуемый от другого прототипа в цепочке; p.s. пост за номером 666... ещё и в адрес cruelangel... чёта волнуюсь как-то... |
| Автор: cruelangel 14.10.2007, 19:13 |
| > получив true от instanceof, ты можешь нарваться на метод всё это примеры осознанной перегрузки методов. если программист перегрузил эти методы - значит он хочет, чтобы они были перегружены. именно поэтому и применяется instanceof, а не obj1.func1==obj2.func1 > Ты так спрашиваешь, будто привык к обратному и очень удивился. я привык к логичному и последовательному поведению. instanceof проверяет наследуются ли методы от прототипа указанной функции. для примитивных типов она нагло врёт. и не надо отмазываться, что на уровне интерпретатора это не объекты. на уровне процессора вообще никаких объектов не существует - только инструкции процессору и состояние регистров. однако мы наблюдаем, что в яваскрипте примитивные типы ведут себя как объекты. а кто выглядит как собака и лает как собака, того как обычно называют? на всякий случай, объект - это данные к которым ассоциирован некоторый набор функций. вот чем примитивные типы не являются - так это ХЭШЕМ (хэш - не обязательно является объектом, а объект - хэшем). |
| Автор: Zeroglif 14.10.2007, 22:58 | ||||||||||
По моим пунктам а) б) в) как тебе поможет instanceof, чтобы принять смелое и безошибочное решение о вызове нужного метода?
Во-первых, "прототип указанной функции" здесь вообще не при чём, во-вторых, конкретная проверка того, "наследуются ли методы", не проводится, т.к. процедура и результат наследования (делегирования) зависит от наличия/отсутствия собственного свойства у объекта, а также от цепи прототипов. То есть, полученное true в результате работы instanceof совершенно не означает, что некое свойство будет обязательно унаследовано, с практической точки зрения эта информация малоинформативна. Может будет, а может нет.
Гы... всё ж наоборот, на уровне интерпретатора возможно всё, спорить об этом трудно, но тут речь идёт о едином для всех, но не признаваемым тобой, стандарте языка, который описал типы и обозначил поведение и алгоритмы. Можно сказать, что таким образом стандарт "отмазывается" от фантазёров и анархистов всех мастей, плодящих свои собственные виртуальные миры и смыслы...
Прям обнаблюдались, первые попавшиеся объекты:
Представь, что вышеупомянутый нолик - это действительно полноценный объект и попробуй объяснить с использованием цитат из доков-спеков, почему же тогда поведение различно. Для чего в целой куче операций в javascript проверяется наличие объекта, если кругом одни объекты? Если считать, что конвертация в другой тип, которой в javascript полно, влечёт за собой пересмотр теории и типов, то спрашивается, как и чем объяснять такое необъектное поведение нолика. ECMAScript-то это объяснить сможет, а вот вольная ассоциация про собак-кошек уже в голову как-то не лезет.
|
| Автор: fidres 19.10.2007, 12:27 |
| и снова прошу прощение за оффтопик. я не лучше и не хуже. но обращаться буду так, как я хочу. к тому же "чувак" - это не "ломак", согласись. мне, лично, не холодно и не жарко от того, что меня называют "чуваком". это, я лично считаю, по-приятельски и не в обиду. на что, соответственно, cruelangel и ответил, что он не в обиде. именно для того, чтоб ответить там, где была затронута суть вопроса. и вообще. я очень не люблю когда меня начинают делать флэймером. это унижает не только меня, но и тех людей, с кем подспудно я начинаю перепалку. считаю, что достойные люди должны себя достойно вести, а не начинать склоку при первом же удобном случае. если кто-то назвал вас не очень хорошим словом - первое правило хорошего тона - сделайте вид, что вы этого не заметили... что, в общем-то, и продемонстировал cruelangel. но кое-кто (не буду показывать пальцем) начал кричать, что, мол, оскорбили и унизили!.. |
| Автор: vasac 19.10.2007, 12:52 | ||
| Но склоку начали именно вы. Даже не "чуваком", а своим ответом, после того, как вас поправили. Обращаться нужно так, как хочется тому, к кому вы обращаетесь, а в случае публичной дискуссии и тем, что это читает.
А меня учили по другому — нужно сразу по лицу Почему то, в реале мало кто решается подойти к группе незнакомых людей и сказать "эй, чуваки, подвиньтесь". Господа модераторы, вырежьте нас куда-нибудь в мусорку. |
| Автор: cruelangel 1.11.2007, 09:56 |
| http://darkodemon.blogspot.com/2007/10/blog-post_27.html я изложил свою мысль более развёрнуто. |
| Автор: vasac 1.11.2007, 16:09 | ||
Да не происходит передача объектов по ссылке. Всегда по значению. Только для объектов значение — ссылка (reference type). Только в объект мы можем добавить свойства, а в примитив нет. Единственное, что мы можем сделать с переменной, содержащей примитивное значение, это заменить это самое значение. Переменной, содержащей ссылку на объект мы так же можем заменить значение. В этом единственном случае, где можно сравнивать передачу объектов и примитивов, результат будет одинаков для обоих случаев. Локальная переменная изменит значение и окончательно порвет "связь" с глобальной. Глобальная продолжит содержать, то что в ней было изначально. Вне зависимости, объект передавался или примитив. |
| Автор: cruelangel 1.11.2007, 21:41 |
| > Да не происходит передача объектов по ссылке. Всегда по значению. и вообще, передача по ссылке не возможна, ибо всегда что-нибудь копируется на уровне языка обычные объекты передаются по ссылке, а примитивные - по значению. как там реализовано на уровне интерпретатора - дело десятое. |
| Автор: vasac 2.11.2007, 10:49 |
| Все-таки объекты передаются по значению, которым является ссылка Можно это сократить до "передаются по ссылке", но всё же это понятие достаточно устоявшееся и обычно обозначает (во всяком случае большинство это понимают так) — передачу "переменной" по ссылки, а не "значения". Т.е. мы можем внутри функции заменить значение глобальной переменной. А в JS это не так. Впрочем, это уже спор о терминах. Можете привести пример, где бы раскрывался глубинный смысл различия передачи в функцию примитива или reference? А так же пример для вашей статьи, где это бы влияло при передачи примитива/объекта-над-примитивом. |
| Автор: Astraller 19.11.2007, 12:18 | ||
cruelangel, тут вот встал вопрос определить число ли? Искал подходящую функцию - не нашел. Решил до смешного просто:
|