JS и его "недостатки"
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.123] |
|
|
Правила раздела:
| Страницы: (66) « Первая ... 14 15 [16] 17 18 ... 65 66 ( Перейти к последнему сообщению ) |
JS и его "недостатки"
|
Сообщ.
#226
,
|
|
|
|
Цитата MyNameIsIgor @ В данном случае это именно с ней и связано. Грубо говоря, в джаваскрипте == позволяет неявное приведение типов, а === не позволяет. Так а что мешает нам написать метод? Цитата MyNameIsIgor @ Я ведь даже код показал. Как это связано с джавовским сравнением ссылок и методом equalTo? Или вы покажете полный аналог на джаве моего примера на джаваскрипте? Искаробки нет метода, эквивалентного JS(==), но мы можем его написать: ![]() ![]() package ru.sources; class Weak { private final Object value; public Weak (Object value) { this.value = value; } private String toString (Object x) { return (x instanceof String) ? (String) x : x.toString(); } public final String toString () { return toString(value); } public final boolean equals (Object other) { String s = toString(value); String t = toString(other); return s.equals(t); } public static Weak toWeak (Object x) { return (x instanceof Weak) ? (Weak) x : new Weak(x); } } public class WeakTyping { public static boolean isEqual (Object x, Object y) { return Weak.toWeak(x).equals(Weak.toWeak(y)); } public static void main (String[] args) { Weak a = new Weak("1"); Weak b = new Weak(1); System.out.println(a == b); System.out.println(a.equals(b)); System.out.println(isEqual( a, b)); System.out.println(isEqual( a, 1)); System.out.println(isEqual("1", b)); System.out.println(isEqual("1", 1)); } } ![]() ![]() false true true true true true И юзать где, и как заблагорассудится. |
|
Сообщ.
#227
,
|
|
|
|
Тут вроде уже были примеры. Так сложно привести? Разве тебе не кажется, что правильно так: ![]() ![]() >>> print(a) ![]() ![]() Traceback (most recent call last): File "<stdin>", line 1, in <module> print(a) NameError: name 'a' is not defined |
|
Сообщ.
#228
,
|
|
|
|
Цитата Астарот @ Вообще есть мнение, что нужно забыть о == и использовать ===, но это только мнение. Т.е. всё же есть среди джавасркипт-прогеров те, кто врубается в ущербность слабой типизация? Должен признать - яфшоке. Цитата korvin @ Так а что мешает нам написать метод? То, что это не будет для всех типов. То, что это будет наш метод с нашим именем, на который всем плевать, а не впиленная в язык слабая типизация. Цитата korvin @ Искаробки нет метода Искаропки нет слабой типизации, а не метода. Соответственно, нет необходимости в костыле-подпорке === |
|
Сообщ.
#229
,
|
|
|
|
Цитата D_KEY @ Тут вроде уже были примеры. Так сложно привести? Разве тебе не кажется, что правильно так: ![]() ![]() >>> print(a) ![]() ![]() Traceback (most recent call last): File "<stdin>", line 1, in <module> print(a) NameError: name 'a' is not defined Тебя спрашивают "почему неудобно", а ты отвечаешь "кажется правильно так" кажется что правильно так - договорись сам с собой объявлять переменные в начале функции, и не знай горя Я так и делаю, например - у меня на одну область видимости только один var. Добавлено Цитата MyNameIsIgor @ Т.е. всё же есть среди джавасркипт-прогеров те, кто врубается в ущербность слабой типизация? Должен признать - яфшоке. Сколько открытий чудных тебя ждет, если ты таки признаешь за остальными людьми право на собственное мнение, я даже боюсь представить. |
|
Сообщ.
#230
,
|
|
|
|
Цитата Астарот @ Сколько открытий чудных тебя ждет, если ты таки признаешь за остальными людьми право на собственное мнение Да я признаю это право. Только "если мнение расходится с мои, то оно неправильное" © korvin, а я тут на интересную темку на лоре наткнулся. Где некий korvin_ с вашим аватаром пинает JS в лице archimag'а за слабую типизацию |
|
Сообщ.
#231
,
|
|
|
|
На радость MyNameIsIgor:
Цитата Избегайте неявного приведения типов При сравнивании переменных интерпретатор JavaScript неявно выполняет приведение типов переменных. Именно поэтому такие операции сравнения, как false == Оили"" == 0, возвращают true. Чтобы избежать путаницы, вызванной неявным приведением типов, всегда используйте операторы === и !==, которые сравнивают и значения, и типы выражений, участвующих в операции: ![]() ![]() var zero = 0; if (zero === false) { // тело этой инструкции не будет выполнено, // потому что zero - это 0, а не false } // антишаблон if (zero == false) { // тело этой инструкции будет выполнено Существует другая точка зрения, согласно которой в некоторых ситуациях, когда достаточно использовать оператор ==, оператор === может оказаться избыточным. Например, когда вы используете метод typeof, вы знаете, что он возвращает строку, поэтому в данном случае нет смысла использовать более строгий оператор сравнения. Однако JSLint требует использовать строгие версии операторов сравнения - они придают непротиворечивость программному коду и упрощают его чтение. (Не приходится думать: «данный оператор == использован намеренно или это упущение программиста?») (с)Stoyan Stefanov |
|
Сообщ.
#232
,
|
|
|
|
Цитата MyNameIsIgor @ То, что это не будет для всех типов. То, что это будет наш метод с нашим именем, на который всем плевать, а не впиленная в язык слабая типизация. Вообще-то в моем примере WeakTyping.isEqual работает для всех типов и для всех сочетаний типов. Цитата MyNameIsIgor @ Искаропки нет слабой типизации, а не метода. Соответственно, нет необходимости в костыле-подпорке === Э-э-э... вообще-то Java(equals) == JS(===). Точнее даже: поведение Java(equals) не определено, а поведение Java(==) далеко не всегда то, что нужно, то, ИМХО, тут в строгой статической Джаве только больше причин для путаницы, чем в JS, где поведение (==) и (===) четко определено. И да, динамическое субтипирование (наследование) ослабляет типизацию =) |
|
Сообщ.
#233
,
|
|
|
|
Цитата korvin @ Вообще-то в моем примере WeakTyping.isEqual работает для всех типов и для всех сочетаний типов. Вам действительно надо объяснять, что такое слабая типизация? Или вам метода достаточно? Цитата korvin @ Точнее, даже поведение Java(equals) не определено, а поведение Java(==) далеко не всегда то, что нужно ЕМНИП, в джаве == сравнивает ссылки на объекты. А поведение equal (или как там метод зовётся?) поределяется пользователем. Возникающую путаницу можно пообсуждать, но, гля, при чём тут слабая типизация? |
|
Сообщ.
#234
,
|
|
|
|
Цитата MyNameIsIgor @ korvin, а я тут на интересную темку на лоре наткнулся. Где некий korvin_ с вашим аватаром пинает JS в лице archimag'а за слабую типизацию ![]() Странно, тема старая, специально искал темы про JS? =) Да, пинал, хотя "пинал" не совсем правильное слово, у нго опыт применения JS значительно больше моего. ЕМНИП, там был спор о JS, как языке общего назначения, а веб затрагивался в несколько ином ключе (http, ftp и прочий зоопарк протоколов vs 9p/Styx). |
|
Сообщ.
#235
,
|
|
|
|
Цитата Астарот @ Цитата D_KEY @ Тут вроде уже были примеры. Так сложно привести? Разве тебе не кажется, что правильно так: ![]() ![]() >>> print(a) ![]() ![]() Traceback (most recent call last): File "<stdin>", line 1, in <module> print(a) NameError: name 'a' is not defined Тебя спрашивают "почему неудобно", а ты отвечаешь "кажется правильно так" ![]() Я не знаю, как объяснить, что ошибки нужно отлавливать и исправлять, а не пропускать Потому и спрашиваю, может быть есть ситуации, в которых данная особенность не будет являться ошибкой? |
|
Сообщ.
#236
,
|
|
|
|
Цитата D_KEY @ Если судить по C/C++, то да...Разве тебе не кажется, что правильно так: А если JS, то нет... Я вообще как-то вот не привык судить язык... Я привык им пользоваться со всеми его особенностями... может поэтому я и не вижу минусов? потому что не задумываюсь "как правильно" или "как должно быть", а просто использую то, что есть... Добавлено Цитата D_KEY @ Да во всех ситуациях, когда это не объект, это не является ошибкой, поскольку я в любом месте могу присвоить любое значение...Потому и спрашиваю, может быть есть ситуации, в которых данная особенность не будет являться ошибкой? А если я буду обращаться к переменной как к объекту, тогда интерпретатор начнет ругаться... |
|
Сообщ.
#237
,
|
|
|
|
Цитата MyNameIsIgor @ Вам действительно надо объяснять, что такое слабая типизация? Или вам метода достаточно? Извольте, ибо я не вижу, почему мой метод isEqual нельзя назвать слаботипизированным. Соответственно разница только в начальной точке, от нее практически любой язык (особенно языки с субтипированием) позволяют реализовать слабое окружение и тем самым практически свести к нулю всю изначальную строгость. |
|
Сообщ.
#238
,
|
|
|
|
Цитата D_KEY @ Я не знаю, как объяснить, что ошибки нужно отлавливать и исправлять, а не пропускать ![]() Ошибкой эту "ошибку" пока считаешь только ты - те, кто имеют с этой "ошибкой" дело каждый день ее таковой не считают. Фактически вся твоя аргументация сводится к "я привык считать что это ошибка, от этого и оттолкнемся". Цитата D_KEY @ Потому и спрашиваю, может быть есть ситуации, в которых данная особенность не будет являться ошибкой? А тебя в который раз спрашивают чем тебе эта "ошибка" помешала, а в ответ "ну, разве это не ошибка?" |
|
Сообщ.
#239
,
|
|
|
|
Цитата korvin @ Извольте, ибо я не вижу, почему мой метод isEqual нельзя назвать слаботипизированным. Можно. На основании этого метода нельзя джаву назвать слаботипизированной. Или мы используем правило "используйте ===, потому что == неявной приводит типы", или правило "в этом модуле я рекомендую пользовать чудо-метод isEqual, потому что [подставить по вкусу]". Это разница между плохо спроектированным языком и "я тут метод на коленке написал". Цитата korvin @ Соответственно разница только в начальной точке, от нее практически любой язык (особенно языки с субтипированием) позволяют реализовать слабое окружение и тем самым практически свести к нулю всю изначальную строгость. Угу, а микроскоп позволяет свести к нулю полезность молотка. Но до этого ещё додуматься извращённым мозгом надо. Это встретит как минимум неприятие в среде коллег/сообщества. |
|
Сообщ.
#240
,
|
|
|
|
Цитата Астарот @ Фактически вся твоя аргументация сводится к "я привык считать что это ошибка, от этого и оттолкнемся". Астя, есть общие принципы проектирования языков программирования. Вот в вики например про строгую типизацию статья: http://en.wikipedia.org/wiki/Strong_typing И некоторые особенности сильной типизации я считаю преимуществом, например: "Strong guarantees about the run-time behavior of a program" |