А можно просто вызвать "Булево(111+2*"333")".
Кстати, забавно то, что результатом того же выражения в Питоне будет посчитанное число 37629 а не булево, как можно бы подумать. Питон смотрит первое Или, и если оно ложно, то просто отдает второе значение, не приводя его. Для И будет аналогично, но первым в условии уже должно быть Истина.
кста, если хочешь что-то реально не очевидное
Сообщить(истина + "41");
Сообщить(1 + истина И "да");
Да ладно, принципы-то простые
булева истина приводится к числу как 1, а к строке как "Да"
строка "да" приводится к булеву как истина
ноль приводится к булеву как ложь
операция для знака + определяется по левому операнду
истина+"41" = число(истина) + число("41") = 1 + 41 = 42
"41" + истина = "41" + строка(истина) = "41" + "Да" = "41Да"
-1 + истина и "да" = -1 + число(истина) и "да" = 0 и "да" = булево(0) и булево("да") = Ложь И Истина = Ложь
Блин, знал, что она неявно преобразует типы, но настолько...
Ладно хоть 2*"а333" ошибку выдает.
Сам пользоваться я конечно этим не буду. У меня в голове более жесткая типизация, чем в платформе. )))
Но знать надо. Мало ли за кем код разгребать придется.
стандартная проблема новичка:
КодОшибки = 418;
ОписаниеОшибки = "чайничек кипит";
Сообщить(КодОшибки + ": " + ОписаниеОшибки);
операция "+" перегружена. В данном случае программист ожидает конкатенацию строк, а не сложение. Но компилятор определяет операцию по значению левого операнда и пытается выполнить сложение. Число + строка даст ошибку.
грубо говоря и на примерах
1 + 4 = 5
1 + "4" = 5
"1" + 4 = "14"
"я1" + 4 = "я14"
1 + "я4" = ошибка
в комменте выше я просто привел пример часто встречающейся ошибки при написании.
почему не явно? Все логично, есть строка, ее умножают на два, адинэс\джаваскрипт смотрит что в ней лежит и пытается преобразовать в число, получилось? Умножай, это не запрещено, не получилось - вот тебе эксепшн. Но стоит помнить, что в этих языках, прости господи, "+" -это в первую очередь конкатинация и только потом - сложение.
В принципе логично, но само все это сделано изначально через жопу
Это неявное приведение типов. Динамическую типизацию вполне можно было нормально сделать.
Мы так в 9-м классе писали пробный вариант ГИА (государственной итоговой аттестации, если кто не знает). Писали в своей школе и со своими учителями.
Пишем русский язык, между парт ходит учительница. Замечает, что я подозрительно смотрю себе в кулак. Подходит, отнимает у меня бумажку, а там шпаргалка - "Жи Ши пиши с буквой И" :)
Потому что надо: у тебя было одно яблоко тебе дали ещё одно яблоко. Потому что в условии Ивана было яблоко, дали ещё одно (не уточнили чего одно). Есть текст яблоко, есть цифра 1. Что получается когда текст яблоко соединяем с цифрой 1? Правильно 1 яблоко.
Похоже мой язык тоже javascript.
Если тебе дали одно яблоко и одно что-то, то у тебя два чего-то. Одно из которых на самом деле является яблоком.
Я тут проверила в ассемблере и питоне. При 1+яблоко тоже даёт результат 1яблоко. Хотя может я неправильно вводу. Прошу проверить знающих задачу на других языках или перепроверить на питоне или ассемблере. Спасибо.
ассемблере и питоне
Странное сочетание.
Про ассемблер можно сказать, что Яблоко+1=аблоко. Это верно для x86 с его add для любых целочисленных типов и для двух однобайтовых кодировок (CP866, CP1251).
GNU Assembler ужасает.
Ассемблер это у бывшего коллеги-инженера. Проверял он. Питоном проверила племянница. Я сидела раздавала указания. Отсюда странное сочетание.
Я всегда знал, что нельзя доверять человеку, который говорит на языке с неявным приведением типов
А Википедия так и говорит, кстати:
Это один из наиболее противоречивых терминов в области типизации, так как он не имеет одного общепринятого значения, и разные авторы используют его в разных значениях
Вообще "Строгая" типизация только мутное понятие, поэтому я решил уточнить.
В пхп другая проблема: популярность и низкая стоимость входа дает среднее качество разработчика ниже плинтуса. Еще и обидчивость – почему-то характерная черта большинства пхпшников.
Пожалуйста, назови любой язык из повсеместно применяемых, который был бы хуже js. Даже php с определенной версии исправил достаточно недостатков, чтобы стать лучше.
Ну 1С может быть... но его и повсеместно применяемым языком-то назвать сложно.
Отсутствие нормальной типизации даже с TS. Постоянные попытки неявно скастить всё, что можно, куда угодно. Отсутствие вменяемой работы с арифметикой - integer и double слиты воедино. Игры в многопоточность, по факту остающиеся в одном потоке и тормозящие друг друга. Необходимость просто зазубрить кучу вещей из спеки, потому что реальное поведение не такое, какое было бы очевидным. Какого черта это всё вообще существует в де-факто стандарте индустрии?!
Java - не лучший язык, kotlin и даже C# гораздо лучше. Но просто сравни https://github.com/denysdovhan/wtfjs и ближайший аналог, который я нашел - http://javawtf.blogspot.com/
Про php или про js?
Для начала можно почитать https://habr.com/ru/post/142140/ и https://habr.com/ru/company/ruvds/blog/499670/
++++++++++[>+>+++>+++++++>++++++++++<<<<-]>>++++++++++++.>>++++++++.-----------.++++++++++++++++++++.--------------.+.+++++++++++.<<----------.>>----------.+++++.<<.>>------------.++++++++++++++++.-----------------.++++++++.+++++.--------.+++++++++++++++.------------------.++++++++.<<++++++++++.
!!'false' == !!'true' // -> true
!!'false' === !!'true' // -> true
true - это false, спасибо js!
Надо же пример показать, чтобы непонимающие плюсанули. Получается интерпретация программы интерпретаторами, не имеющими представления о языке.
При этом в документации написано, что любая непустая строка при переводе в логическое значение даёт true (истина).
Во всех нормальных языках строка не кастуется к boolean. Так что да, дурной именно javascript, потому что позволяет это сделать.
То что для кого-то проблема выучить несколько правил приведения типов не делает язык дурным. В чужой монастырь со своим уставом не ходят
А я таки буду. Дело не в учении дополнительных правил. Дело в том, что компилятор допускает целый класс ошибок, который он мог бы отследить.
Более того, ценой быстродействия. Вместо того, чтобы реализовать несколько примитивных типов с примитивными же правилами у нас есть монстр-инстанс, для каждой переменной, которая умеет всё.
Я могу предположить только проверку на null в условии. Но "if (a != null)" небольшая цена за отсутствие багов.
Мне кажется не один язык программирования не работает столько со строками как джс.
if(a) {console.log(a)} else { console.log(“лошадь в огурцах»)}
И таким не хитрым способом мы:
- Вывели текст если он есть
- обработали вывод если там Пустая строка
- обработало вывод если там undefined
- обработали вывод если там null
И я считаю это прекрасно
Swift:
print(a?.Description() ?? "<лошадь в огурцах>")
C# :
Debug.WriteLine(a?.ToString() ?? "<лошадь в огурцах>")
А если ну очень хочется игнорировать тип - используйте базовый тип как тип параметра функции. Но эта такая редкость, что я могу пересчитать использование такого подхода на пальцах одной руки.
Да это шутка. Ну ладно, а так?
0 == false // -> true
'' == false // -> true
null == false // -> false
!!null // -> false
Про пустую строку уже сказал.
null – это отдельный тип и он не равен ни true ни false.
Но при принудительном приведении результатом будет false.
Потому что для калькулятора нужно вводить это выражение со скобками, так как он при вводе нового действия автоматически считает предыдущее (то есть когда у тебя введено 2+2, а потом ты вводишь умножение, то калькулятор производит сложение, а потом только умножение). На семерке, кстати, калькулятор в обычном режиме умеет в скобки.
слышал, что в америкосии приоритета у умножения нет и действия выполняются в порядке очереди по строке. млжет под них пример. хз, правда или нет
if ( $your_lang == "JS")
{
$lang = "true";
}
else
{
$lang = "false";
}
return $lang;
https://pastebin.com/BaWjjmK1 - вот кстати код из той же категории :D
И да - это реальный код, из common-библиотеки одного из сборок эмулятора сервера L2 :)