ObjectScript — это новый, встраиваемый и очень легкий объектно-ориентированный язык программирования с открытым исходным кодом.
ObjectScript расширяет возможности таких языков, как JavaScript, Lua и PHP. Синтаксис в основном взят из JavaScript, множественное присваивание — из Lua, а работа со свойствами — из PHP. Проект ObjectScript очень молод; лишь недавно появились первые рабочие и стабильные версии.
Тем не менее, вопрос спецификации некоторых аспектов языка до конца не решен и находится в стадии разработки.
Например, операторы сравнения работают по-разному в разных языках сценариев, в зависимости от того, какие типы данных участвуют в сравнении и какой алгоритм используется в конкретном языке программирования.
Вопрос достаточно деликатный, потому что.
Результат логического выражения определяет, как раз, будет ли выполняться фрагмент кода или нет. Русская пословица «одна голова хорошо, а много лучше» подсказывает мне, что лучше обратиться к сообществу программистов и точно понять, какое поведение при сравнении (это операторы > =, > , <=, <, ==, !=) of different data types на языке сценариев является наиболее подходящим.
Разработайте коллективное решение и закрепите результат в спецификации ObjectScript. ObjectScript поддерживает перегрузку операторов сравнения для объектов, но я предлагаю в текущем вопросе сосредоточиться на работе операторов сравнения только для примитивных типов данных, это null, boolean, число и строка.
Как работает PHP в сравнении
PHP преобразует аргументы в числовые типы, если один из аргументов является числом.null преобразуется в 0, true в 1, false в 0, строка преобразуется в число до первого недопустимого символа, после чего возвращается число (полученное в данный момент).
В результате, если оба аргумента являются числами, происходит числовое сравнение, если строки — сравнение строк.
Давайте запустим следующий скрипт на PHP:
он выведет:echo "'a' > 'b' \t--> "; var_dump('a' > 'b'); echo "'a' < 'b' \t--> "; var_dump('a' < 'b'); echo "'a' > 1 \t--> "; var_dump('a' > 1); echo "'a' < 1 \t--> "; var_dump('a' < 1); echo "'1' > 1 \t--> "; var_dump('1' > 1); echo "'1' < 1 \t--> "; var_dump('1' < 1); echo "'+2.9' > 1 \t--> "; var_dump('+2.9' > 1); echo "'+2.9' < 1 \t--> "; var_dump('+2.9' < 1); echo "'2.9' > 1 \t--> "; var_dump('2.9' > 1); echo "'2.9' < 1 \t--> "; var_dump('2.9' < 1); echo "true > 1 \t--> "; var_dump(true > 1); echo "false < 1 \t--> "; var_dump(false < 1); echo "null > 1 \t--> "; var_dump(null > 1); echo "null < 1 \t--> "; var_dump(null < 1);
'a' > 'b' --> bool(false)
'a' < 'b' --> bool(true)
'a' > 1 --> bool(false)
'a' < 1 --> bool(true)
'1' > 1 --> bool(false)
'1' < 1 --> bool(false)
'+2.9' > 1 --> bool(true)
'+2.9' < 1 --> bool(false)
'2.9' > 1 --> bool(true)
'2.9' < 1 --> bool(false)
true > 1 --> bool(false)
false < 1 --> bool(true)
null > 1 --> bool(false)
null < 1 --> bool(true)
Как работает JavaScript в сравнении
JavaScript также преобразует аргументы в числовые типы, если один из них является числом, и делает это в соответствии со следующими правилами: значение null в 0, неопределенное в NaN, true в 1, false в 0, строка преобразуется в число, если недопустимый символ.встречается в строке, то возвращается NaN. В результате, если оба аргумента — числа (NaN — тоже число), то сравнение происходит обычным математическим способом, но нужно иметь в виду, что любое сравнение с NaN всегда возвращает false. Например, при обычном программировании на PHP NaN встречается редко и почти никогда не обрабатывается отдельно, поэтому строки в PHP в любом случае будут преобразованы в допустимое число, в случае ошибки будет возвращен 0, а в JS ситуация отличается.
Если аргументами сравнения являются строки, происходит сравнение строк.
В PHP нет неопределенного типа данных, только null. При конвертации скриптов из PHP в JS мы всегда думали о том, что использовать в JS вместо PHP null, либо JS null, либо JS undefine. Поэтому мы должны включить в JS-тест неопределенное и проверить, как оно работает в сравнении с числом.
Давайте запустим следующий JS-код в браузере: console.log("'a' > 'b' \t--> ", 'a' > 'b');
console.log("'a' < 'b' \t--> ", 'a' < 'b');
console.log("'a' > 1 \t--> ", 'a' > 1);
console.log("'a' < 1 \t--> ", 'a' < 1);
console.log("'1' > 1 \t--> ", '1' > 1);
console.log("'1' < 1 \t--> ", '1' < 1);
console.log("'+2.9' > 1 \t--> ", '+2.9' > 1);
console.log("'+2.9' < 1 \t--> ", '+2.9' < 1);
console.log("'2.9' > 1 \t--> ", '2.9' > 1);
console.log("'2.9' < 1 \t--> ", '2.9' < 1);
console.log("true > 1 \t--> ", true > 1);
console.log("false < 1 \t--> ", false < 1);
console.log("null > 1 \t--> ", null > 1);
console.log("null < 1 \t--> ", null < 1);
console.log("undefined > 1 \t--> ", undefined > 1);
console.log("undefined < 1 \t--> ", undefined < 1);
консоль отобразит: 'a' > 'b' --> false
'a' < 'b' --> true
'a' > 1 --> false
'a' < 1 --> false
'1' > 1 --> false
'1' < 1 --> false
'+2.9' > 1 --> true
'+2.9' < 1 --> false
'2.9' > 1 --> true
'2.9' < 1 --> false
true > 1 --> false
false < 1 --> true
null > 1 --> false
null < 1 --> true
undefined > 1 --> false
undefined < 1 --> false
Как работает Lua в сравнении
Lua позволяет сравнивать только числа с числами, строки со строками.В противном случае выдается ошибка типа: попытка сравнить число со строкой.
Вы даже не можете сравнить логическое значение с числом, и вы даже не можете сравнить логическое значение с логическим значением.
Lua использует nil вместо null. Невозможно сравнить ноль с числом; ноль с нулем — одно и то же.
В общем, тестирование Lua как таковое по этому вопросу провалилось.
Как работает ObjectScript в сравнении
Если один из аргументов сравнения является строкой, происходит сравнение строк.В противном случае (если аргументы имеют примитивные типы) они преобразуются в числа и происходит математическое сравнение.
null преобразуется в 0, true в 1, false в 0, строка полностью преобразуется в число, если строка содержит недопустимые символы, то возвращается 0.
В итоге код на ОС: print("'a' > 'b' \t--> ", 'a' > 'b')
print("'a' < 'b' \t--> ", 'a' < 'b')
print("'a' > 1 \t--> ", 'a' > 1)
print("'a' < 1 \t--> ", 'a' < 1)
print("'1' > 1 \t--> ", '1' > 1)
print("'1' < 1 \t--> ", '1' < 1)
print("'+2.9' > 1 \t--> ", '+2.9' > 1)
print("'+2.9' < 1 \t--> ", '+2.9' < 1)
print("'2.9' > 1 \t--> ", '2.9' > 1)
print("'2.9' < 1 \t--> ", '2.9' < 1)
print("true > 1 \t--> ", true > 1)
print("false < 1 \t--> ", false < 1)
print("null > 1 \t--> ", null > 1)
print("null < 1 \t--> ", null < 1)
выведет следующее: 'a' > 'b' --> false
'a' < 'b' --> true
'a' > 1 --> true
'a' < 1 --> false
'1' > 1 --> false
'1' < 1 --> false
'+2.9' > 1 --> false
'+2.9' < 1 --> true
'2.9' > 1 --> true
'2.9' < 1 --> false
true > 1 --> false
false < 1 --> true
null > 1 --> false
null < 1 --> true
Общий
Сведем результаты в одну таблицу:Вопрос для знатоков
Так какое же поведение сравнения следует считать эталонным? для скриптового языка программирования и зафиксировать его в спецификации ObjectScript? Пожалуйста, выскажитесь в комментариях, потому что.Я уверен, что каждый голос будет учтен и, возможно, ваше слово станет решающим в выборе дальнейшего пути развития ObjectScript. Другие соответствующие статьи об ObjectScript:
- ObjectScript API, интеграция с C++.
Часть 4. Соединение пользовательских классов и функций в C++
- ObjectScript API, интеграция с C++.
Часть 3: подключение модуля с функциями на C++
- ObjectScript API, интеграция с C++.
Часть 2. Выполнение скрипта на ОС с C++
- ObjectScript API, интеграция с C++.
Часть 1: работа со стеком, вызов функций ОС из C++
- ObjectScript — новый язык программирования, более быстрый, чем PHP и JS.
- ObjectScript — новый язык программирования
-
Журнал «Афиша» Сменит Концепцию И Редакцию
19 Oct, 24 -
История Развития Флеш-Памяти
19 Oct, 24 -
Адский Ux Spotify
19 Oct, 24 -
Bing Работает И Доступен Каждому!
19 Oct, 24 -
Умные Часы – Очевидно, Но Недоступно
19 Oct, 24 -
Управляем Дюймовыми Жалюзи Недорого
19 Oct, 24 -
Ридер Fujitsu Flepia: Цветной Экран И Wi-Fi
19 Oct, 24