тонкие различия между JavaScript и Lua [закрыто]

StackOverflow https://stackoverflow.com/questions/1022560

  •  06-07-2019
  •  | 
  •  

Вопрос

Я просто люблю JavaScript.Это так элегантно (представьте себе тихий вздох влюбленного фаната на заднем плане).

Итак, недавно я играл с Lua через любовь2d framework (хорошо!) — и я думаю, что Lua тоже великолепен.Насколько я понимаю, эти два языка очень похожий.

Есть очевидные различия, например

  • синтаксис
  • проблемная область
  • библиотеки
  • типы (немного)

но какие из них более тонкие?Есть ли что-нибудь, что JavaScript-кодер считает само собой разумеющимся, но работающее в Lua немного по-другому?Существуют ли какие-либо подводные камни, которые могут быть неочевидны опытному программисту одного языка, пробующему другой?

Например:в Lua массивы и хеши не разделены (есть только таблицы) — в JavaScript это числовые массивы и хешированные объекты.Что ж, это одно из наиболее очевидных различий.

Но есть ли различия в области видимости переменных, неизменяемости или чем-то в этом роде?

Это было полезно?

Решение

Еще несколько отличий:

  • Луа имеет встроенную поддержку сопрограммы.
    • ОБНОВЛЯТЬ:JS теперь содержит ключевое слово yield внутри генераторов, что обеспечивает поддержку сопрограмм.
  • Луа не конвертирует между типами для любых операторов сравнения.В JS только === и !== не печатай жонглировать.
  • Луа имеет оператор возведения в степень (^); JS нет. JS использует различные операторы, включая тернарный условный оператор (?: против and/or), а начиная с 5.3 — побитовые операторы (&, |, и т. д.против. метаметоды ).
    • ОБНОВЛЯТЬ:В JS теперь есть оператор возведения в степень **.
  • JS имеет инкремент/декремент, операторы типа (typeof и instanceof), дополнительные операторы присваивания и дополнительные операторы сравнения.
  • В JS, ==, ===, != и !== операторы имеют более низкий приоритет, чем >, >=, <, <=.В Lua все операторы сравнения являются тот же приоритет.
  • Луа поддерживает хвостовые вызовы.
  • Луа поддерживает присвоение списку переменных.Хотя это еще не является стандартом в Javascript, движок JS Mozilla (и в некоторой степени Opera) поддерживает аналогичную функцию, начиная с JS 1.7 (доступного как часть Firefox 2) под названием "задание на деструктуризацию".Деструктуризация в JS носит более общий характер, поскольку ее можно использовать в контекстах, отличных от присваивания, например определения функций и вызовы и инициализаторы цикла. Деструктуризация задания некоторое время был предложенным дополнением к ECMAScript (языковому стандарту Javascript).
    • ОБНОВЛЯТЬ:Деструктуризация (и назначение деструктуризации) теперь является частью спецификации ECMAScript, уже реализованной во многих движках.
  • В Луа, ты можешь операторы перегрузки.
  • В Луа, вы можете манипулировать средой с помощью getfenv и setfenv в Lua 5.1 или _ENV в Луа 5.2 и 5.3.
  • В JS, все функции являются вариативными.В Луа, функции должны быть явно объявлен как вариативный.
  • Foreach в JS циклически перебирает свойства объекта. Для каждого в Луа (которые используют ключевое слово for) циклически перебирает итераторы и является более общим.
    • ОБНОВЛЯТЬ:JS имеет Итерируемые объекты и сейчас, многие из которых встроены в обычные структуры данных, которые вы ожидаете, например Array.Их можно зациклить с помощью for...of синтаксис.Для обычных объектов можно реализовать свои собственные функции итератора.Это приближает его к Lua.
  • JS имеет глобальную и функциональную область видимости. Луа имеет глобальная и блочная область видимости.Структуры управления (например, if, for, while) представить новые блоки.

    • Из-за различий в правилах области видимости ссылка замыкания на внешнюю переменную (называемая «upvalues» на языке Lua) может обрабатываться по-разному в Lua и в Javascript.Чаще всего это происходит с закрытия в for петли, и застает некоторых людей врасплох.В Javascript, тело А for цикл не вводит новую область видимости, поэтому все функции, объявленные в теле цикла, ссылаются на те же внешние переменные.В Lua каждая итерация for цикл создает новые локальные переменные для каждой переменной цикла.

      local i='foo'
      for i=1,10 do
        -- "i" here is not the local "i" declared above
        ...
      end
      print(i) -- prints 'foo'
      

      Приведенный выше код эквивалентен:

      local i='foo'
      do
        local _i=1
        while _i<10 do
          local i=_i
          ...
          _i=_i+1
        end
      end
      print(i)
      

      Как следствие, функции, определенные в отдельных итерациях, имеют разные повышающие значения для каждой переменной цикла, на которую ссылаются.См. также ответы Николя Бола на Реализация замыканий в Lua? и "Какова правильная семантика замыкания переменной цикла?", и "Семантика общего для".

      ОБНОВЛЯТЬ:JS теперь имеет область действия блока.Переменные, определенные с помощью let или const соблюдайте область действия блока.

  • Целочисленные литералы в JS может быть в восьмеричном формате.
  • JS имеет явную поддержку Unicode, а внутренние строки кодируются в UTF-16 (поэтому они представляют собой последовательности пар байтов).Различные встроенные функции JavaScript используют данные Unicode, например: "pâté".toUpperCase() ("PÂTÉ"). Луа 5.3 и выше имеют escape-последовательности кодовых точек Unicode в строковых литералах (с тем же синтаксисом, что и escape-последовательности кодовых точек JavaScript), а также встроенные utf8 библиотека, которая обеспечивает базовую поддержку Кодировка UTF-8 (например, кодирование кодовых точек в UTF-8 и декодирование UTF-8 в кодовые точки, получение количества кодовых точек в строке и перебор кодовых точек).Строки в Lua представляют собой последовательности отдельных байтов и могут содержать текст в любой кодировке или произвольные двоичные данные.Lua не имеет встроенных функций, использующих данные Unicode;поведение string.upper зависит от локали C.
  • В Луа, not, or, and ключевые слова используются вместо JS's !, ||, &&.
  • Луа использует ~= для «не равно», тогда как JS использует !==.Например, if foo ~= 20 then ... end.
  • Луа 5.3 и выше использовать ~ для двоичного побитового XOR, тогда как JS использует ^.
  • В Луа, любой тип значения (кроме nil и NaN) можно использовать для индексации таблицы.В JavaScript, все нестроковые типы (кроме символа) преобразуются в строки перед использованием для индексации объекта.Например, после оценки следующего кода значение obj[1] будет "string one" в JavaScript, но "number one" в Луа: obj = {}; obj[1] = "number one"; obj["1"] = "string one";.
  • В JS, присваивания рассматриваются как выражения, но в Луа они не.Таким образом, JS позволяет выполнять задания в условиях 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 () {}).

Другие советы

Пара тонких отличий, которые хотя бы раз вас заметят:

  • Не равно пишется ~= в Луа.В JS это есть !=
  • Луа массивы основаны на 1 - их первый индекс равен 1, а не 0.
  • Lua требует двоеточия, а не точки для вызова методов объекта.Ты пишешь a:foo() вместо a.foo()

вы можете использовать точку, если хотите, но вам придется пройти self переменная явно. a.foo(a) выглядит немного громоздко.Видеть Программирование на Lua для получения подробной информации.

Честно говоря, было бы проще перечислить общие черты Javascript и Lua, чем перечислять различия.Оба языка сценариев являются динамически типизированными, но на самом деле это все, что вы можете сделать.У них совершенно разный синтаксис, разные первоначальные цели проектирования, разные режимы работы (Lua всегда компилируется в байт-код и запускается на виртуальной машине Lua, Javascript варьируется), этот список можно продолжать и продолжать.

Массивы и объекты JavaScript ближе, чем вы думаете.Вы можете использовать нотацию массива, чтобы получить доступ к элементам любого из них, а также добавлять к массивам нечисловые индексы.Отдельные элементы массива могут содержать что угодно, и массив может быть разреженным.Они почти идентичные двоюродные братья.

С верхней части моей головы

Луа...

  1. поддерживает сопрограммы
  2. не имеет ограничений на использование строки/числа в качестве ключа для таблицы.Все работает.
  3. обработка ошибок несколько неуклюжа.Либо вы ничего не обрабатываете, либо используете компьютерный звонок метод
  4. Кажется, я читал что-то о различиях в лексическом объеме и о том, что у Lua лучший вариант.
  5. Если я правильно помню, поддержка регулярных выражений в Lua ограничена.

Мне понравился этот вопрос и ответы на него.Дополнительные причины, по которым эти два языка кажутся мне более похожими, чем нет:

Оба присваивать функции переменным, смогите построить функции на лету, и определить затворы.

Тест показывает, что текущий Javascript также возвращает объекты или, по крайней мере, строки из логических выражений, как это делает lua:

function nix(){
    alert(arguments[0]||"0");
} 
nix();

Lua и JavaScript являются прототипами базовых языков.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top