Objectscript, Давайте Вместе Разработаем Спецификацию: Операторы Сравнения

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:

Теги: #objectscript #спецификация #спецификация #objectscript api #JavaScript #Lua #открытый исходный код #php #открытый исходный код #программирование #api
Вместе с данным постом часто просматривают: