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



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



Так, недавно я играл с Lua через löve2d рамки (Ницца!) - и я думаю, что Луа тоже здорово. Они, как я вижу, эти два языка очень похожие.



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




  • синтаксис

  • домен
  • библиотеки

  • типы (немного)


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



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



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

867   8  

8 ответов:

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

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

    • из-за различий в правилах определения области, ссылка закрытия внешней переменной (называемой "upvalues" на языке Lua) может быть обработана по-разному в Lua и в Javascript. Это чаще всего происходит с закрытие в for петли, и застает некоторых людей врасплох. В Javascript, тело a 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)
      

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

      обновление: JS теперь имеет область блока. Переменные, определенные с помощью let или const уважать объем блока.

  • целочисленные литералы в JS может быть в восьмеричной.
  • JS имеет явную поддержку Юникода.
  • на Lua на not,or,and ключевые слова используются вместо JS ' s !,||, &&.
  • Lua использует ~= для "не равно", а JS использует !==. Например, if foo ~= 20 then ... end.
  • Lua 5.3 и ~ для двоичного побитового XOR, тогда как JS использует ^.
  • на Lua любой тип значения (за исключением nil и NaN) может использоваться для индексации таблицы; в JavaScript, все нестроковые типы (кроме символа) преобразуются в строки перед использованием для индексирования объекта.
  • на JS, назначения рассматриваются как выражения, но в Lua их нет. Таким образом, JS допускает назначения в условиях if,while и do while заявления, но Lua не в if,while и repeat until заявления. Например, if (x = 'a') {} действительно JS, но if x = 'a' do end недопустимый Lua.
  • Lua имеет синтаксический сахар для объявления функции с блочной областью переменные, функции, которые являются полями и методами (local function() end,function t.fieldname() end,function t:methodname() end). JS объявляет их со знаком равенства (let funcname = function optionalFuncname() {},objectname.fieldname = function () {}).

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

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

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

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

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

с моей макушки

Lua ...

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

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

Как назначение функций переменным, может создавать функции на лету, и определить замыкания.

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

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

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

Comments

    Ничего не найдено.