Я просто люблю JavaScript. Это так элегантно (представьте себе тихий звук вздоха влюбленного фаната).
Итак, недавно я играл с Lua через фреймворк löve2d (приятно!) - и я думаю, что Lua тоже великолепен. На мой взгляд, эти два языка очень похожи.
Есть очевидные различия, например
- синтаксис
- проблемная область
- библиотеки
- типы (немного)
но какие из них более тонкие? Есть ли что-то, что кодировщик JavaScript считает само собой разумеющимся, что работает в Lua только немного иначе? Есть ли какие-то подводные камни, которые могут быть не очевидны для опытного программиста одного языка, пытающегося использовать другой?
Например: в Lua массивы и хеши не разделены (есть только таблицы) - в JavaScript это числовые массивы и хешированные объекты. Что ж, это одно из наиболее очевидных отличий.
Но есть ли различия в области видимости переменных, неизменяемости или чем-то подобном?
источник
Ответы:
Еще несколько отличий:
===
и!==
не жонглируйте.^
); JS этого не делает. JS использует разные операторы, включая тернарный условный оператор (?:
vsand/or
) и, начиная с версии 5.3, побитовые операторы (&
,|
и т. Д. По сравнению с метаметодами ).**
.typeof
иinstanceof
), дополнительные операторы присваивания и дополнительные операторы сравнения.==
,===
,!=
и!==
операторы имеют более низкий приоритет , чем>
,>=
,<
,<=
. В Lua все операторы сравнения имеют одинаковый приоритет .getfenv
иsetfenv
в Lua 5.1 или_ENV
в Lua 5.2 и 5.3 .Foreach
в JS перебирает свойства объекта. Foreach в Lua (который использует ключевое словоfor
) перебирает итераторы и является более общим.Array
. Их можно перебрать с помощьюfor...of
синтаксиса. Для обычных объектов можно реализовать свои собственные функции итератора. Это приближает его к Lua.JS имеет глобальную и функциональную область видимости. Lua имеет глобальную и блочную область видимости . Управляющие структуры (например
if
,for
,while
) ввести новые блоки .Из-за различий в правилах области видимости ссылка на внешнюю переменную (называемая «upvalues» на языке Lua) может обрабатываться по-разному в Lua и Javascript . Чаще всего это происходит с замыканиями в
for
циклах и застает некоторых людей врасплох. В Javascript телоfor
цикла не вводит новую область видимости, поэтому все функции, объявленные в теле цикла, ссылаются на одни и те же внешние переменные . В Lua каждая итерацияfor
цикла создает новые локальные переменные для каждой переменной цикла.Приведенный выше код эквивалентен:
Как следствие, функции, определенные в отдельных итерациях, имеют разные значения для каждой переменной цикла, на которую указывает ссылка. См. Также ответы Николаса Бола на вопрос « Реализация закрытий в Lua?». и « Какова правильная семантика замыкания для переменной цикла? » и « Семантика универсального for ».
ОБНОВЛЕНИЕ : JS теперь имеет блокировку. Переменные , определенные с
let
илиconst
соблюдение блока объема."pâté".toUpperCase()
("PÂTÉ"
). Lua 5.3 и выше имеют escape-последовательности кодовой точки Unicode в строковых литералах (с тем же синтаксисом, что и escape-последовательности кодовой точки JavaScript), а также встроеннуюutf8
библиотеку, которая обеспечивает базовую поддержку кодировки UTF-8.(например, кодирование кодовых точек в UTF-8 и декодирование UTF-8 в кодовые точки, получение количества кодовых точек в строке и повторение кодовых точек). Строки в Lua представляют собой последовательности отдельных байтов и могут содержать текст в любой кодировке или произвольные двоичные данные. Lua не имеет встроенных функций, использующих данные Unicode; поведениеstring.upper
зависит от локали C.not
,or
,and
ключевые слова используются вместо JS «с!
,||
,&&
.~=
для «не равно», тогда как JS использует!==
. Например,if foo ~= 20 then ... end
.~
двоичный побитовый XOR, тогда как JS использует^
.nil
иNaN
) можно использовать для индексации таблицы. В JavaScript все нестроковые типы (кроме Symbol) преобразуются в строки перед использованием для индексации объекта. Например, после оценки следующего кода, значениеobj[1]
будет"string one"
в JavaScript, но"number one"
в Lua:obj = {}; obj[1] = "number one"; obj["1"] = "string one";
.if
,while
иdo while
заявления, но Lua не вif
,while
иrepeat until
заявления. Например,if (x = 'a') {}
допустим JS, ноif x = 'a' do end
недействителен Lua.local function() end
,function t.fieldname() end
,function t:methodname() end
). JS объявляет их знаком равенства (let funcname = function optionalFuncname() {}
,objectname.fieldname = function () {}
).источник
~=
можно спровоцировать скрытые ошибки. Это может спровоцировать синтаксические ошибки , но они совсем не тонкие.Пара тонких отличий, которые заметят хотя бы раз:
~=
в Lua. В JS это!=
a:foo()
вместоa.foo()
†† при желании можно использовать точку, но
self
переменную необходимо передать явно.a.foo(a)
выглядит немного громоздко. См. « Программирование на Lua» для подробностей.источник
†
для аннотации создает впечатление, чтоa.foo()
он умер xDЕсли честно, было бы проще перечислить общие для Javascript и Lua вещи, чем перечислить различия. Они оба являются языками сценариев с динамической типизацией, но это все, что вы можете на самом деле. У них совершенно другой синтаксис, разные исходные цели дизайна, разные режимы работы (Lua всегда компилируется в байт-код и запускается на Lua VM, Javascript меняется), список можно продолжать и продолжать.
источник
prototype
или именования объектов объектов, несмотря на то, что это именно то, что представляют собой таблицы lua), с функциями как первоклассный гражданин, несмотря на то, что они не функционируют в традиционном смысле (неизменяемость , декларативная разработка и т. д.),Массивы и объекты JavaScript ближе, чем вы думаете. Вы можете использовать нотацию массива, чтобы получить доступ к элементам любого из них, и вы можете добавлять нечисловые индексы к массивам. Отдельные элементы массива могут содержать что угодно, и массив может быть разреженным. Они почти идентичные кузены.
источник
С верхней части моей головы
Lua ...
источник
Мне понравился этот вопрос и предоставленные ответы. Дополнительные причины, по которым эти два языка кажутся мне более похожими, чем нет:
Оба присваивают функции переменным, могут создавать функции на лету и определять замыкания.
источник
Lua и JavaScript являются базовыми языками-прототипами.
источник
Тест показывает, что текущий Javascript также возвращает объекты или, по крайней мере, строки из логических выражений, таких как lua:
источник