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

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

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

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

  • Синтаксис
  • проблемный домен
  • библиотеки
  • типы (немного)

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

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

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

117 голосов | спросил stefs 21 J0000006Europe/Moscow 2009, 01:10:56

7 ответов


0

Еще несколько различий:

  • Lua имеет встроенную поддержку сопрограмм .
    • ОБНОВЛЕНИЕ : теперь JS содержит ключевое слово yield внутри генераторов, предоставляя ему поддержку сопрограмм.
  • Lua не конвертирует между типами для любых операторов сравнения. В JS только === и !== don не жонглируйте.
  • Lua имеет оператор возведения в степень (^); JS нет. JS использует различные операторы, включая троичный условный оператор (?: против 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 функции должны быть явно объявлены как VARIADIC .
  • Foreach в JS проходит по свойствам объекта. Foreach в Lua (который используйте ключевое слово for) зацикливание на итераторах и является более общим.
    • ОБНОВЛЕНИЕ : в JS есть Iterables теперь и многие из них встроены в обычные структуры данных, которые вы ожидаете, такие как Array. Они могут быть зациклены с помощью синтаксиса for...of. Для обычных объектов можно реализовать свои собственные функции итератора. Это приближает его к Луа.
  • JS имеет глобальную и функциональную область. Lua имеет глобальную и блочную область действия . Управляющие структуры (например, if, for, while) представить новый блоки .

    • Из-за различий в правилах области видимости ссылки на внешние переменные (называемые «значениями вверх» на языке Lua) могут обрабатываться по-разному в Lua и в Javascript . Чаще всего это происходит с замыканиями в for loop и застает некоторых врасплох. В 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 имеет явную поддержку Юникода, а внутренние строки кодируются в UTF-16 (поэтому они представляют собой последовательности пар байтов). Различные встроенные функции JavaScript используют данные Unicode, такие как "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.
  • В Lua not, or, and ключевые слова используются вместо JS в !, ||, &&
  • Lua использует ~= для «не равно», тогда как JS использует !==. Например, if foo ~= 20 then ... end.
  • Lua 5.3 и выше используйте ~ для двоичного побитового XOR, тогда как JS использует ---- +: = 49 =:. + ----
  • В Lua значения любого типа (кроме ^ и nil) может использоваться для индексации таблицы; в JavaScript все нестроковые типы (кроме Symbol) преобразуются в строки перед использованием для индексации объекта.
  • В JS назначения обрабатываются как выражения, но в Lua это не так. Таким образом, JS разрешает присваивания в условиях NaN, if и while, но Луа не в do while, if и while заявления. Например, repeat until является допустимым JS, но if (x = 'a') {} недействителен Lua.
  • Lua имеет синтаксический сахар для объявления переменных функций блочной области, функций, являющихся полями, и методов (if x = 'a' do end, local function() end, function t.fieldname() end). JS объявляет их знаком равенства (function t:methodname() end, let funcname = function optionalFuncname() {})
ответил 19 +03002018-10-19T09:34:46+03:00312018bEurope/MoscowFri, 19 Oct 2018 09:34:46 +0300 2018, 09:34:46
0

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

ответил DaveR 21 J0000006Europe/Moscow 2009, 01:48:31
0

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

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

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

ответил richq 22 J0000006Europe/Moscow 2009, 10:15:40
0

С макушки головы

Луа ...

  1. поддерживает сопрограммы
  2. не имеет ограничений только на строку /число в качестве ключа для таблицы. Все работает.
  3. обработка ошибок несколько неуклюжа. Либо вы ничего не делаете, либо используете pcall метод
  4. Я думаю, что прочитал кое-что о различиях в лексической области и что у Lua есть лучший.
  5. Если я правильно помню, поддержка регулярных выражений в lua ограничена
ответил jitter 21 J0000006Europe/Moscow 2009, 02:11:22
0

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

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

ответил WeakPointer 22 ThuEurope/Moscow2011-12-22T12:09:28+04:00Europe/Moscow12bEurope/MoscowThu, 22 Dec 2011 12:09:28 +0400 2011, 12:09:28
0

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

function nix(){
    alert(arguments[0]||"0");
} 
nix();
ответил Adder 17 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowMon, 17 Sep 2012 15:59:05 +0400 2012, 15:59:05
0

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

ответил 3 J000000Friday09 2009, 13:21:20

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132