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

Это может быть немного поздно, немного лениво, немного скучно, немного навязчиво или немного похоже на «спину, большой рот», но ...

Каждое решение, которое я до сих пор читал, было бы похоже на «давай спать и посмотрим, что случилось завтра».

setInterval (обратный вызов, время) будет долго ждать, а затем обратный вызов, в то время как блокировка времени выполнения. Текущая реализация "setInterval" далека от сохранения потока, даже не говоря уже о параллелизме.

Хотя упомянутые разреженные решения выглядят как, угадайте, что C # ( смеется ), они все еще не работают, как в C # / .NET. Они все еще работают как в C.

В настоящее время JavaScript НЕ предоставляет архитектуру для реализации реальной многопоточности. Лучшим подходом был бы TypeScript, но все же в нем так мало реального решения, что ... больно. JavaScript, JQuery, AJAX, JNode и даже TypeScript - это всего лишь группа Wannabes, полагающихся на благо и плохое настроение разработчиков. Факт. Полная остановка.

120
задан P̲̳x͓L̳ 20 March 2014 в 09:52
поделиться

6 ответов

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

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

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

       local i = 'foo'
      для i = 1,10 сделать
       - «i» здесь не местное «i», указанное выше
       ...
      конец
      print (i) - печатает 'foo'
      

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

       local i = 'foo'
      делать
       местный _i = 1
       пока _i <10 делать
       местный я = _i
       ...
       _i = _i + 1
       конец
      конец
      печать (я)
      

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

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

  • Целочисленные литералы в JS могут быть в восьмеричном формате.
  • JS явно имеет Unicode support, а внутренние строки кодируются в UTF-16 (так что они представляют собой последовательности пар байтов). Различные встроенные функции JavaScript используют данные Unicode, например «pâté». toUpperCase () ( «ПЕТЕ» ). Lua 5.3 и выше имеют escape-последовательности кодовой точки Unicode в строковых литералах (с тем же синтаксисом, что и escape-последовательности кодовой точки JavaScript), а также встроенную библиотеку utf8 , которая предоставляет базовые поддержка кодировки UTF-8 (например, кодирование кодовых точек в UTF-8 и декодирование UTF-8 в кодовые точки, получение количества кодовых точек в строке и итерация по кодовым точкам). Строки в Lua представляют собой последовательности отдельных байтов и могут содержать текст в любой кодировке или произвольные двоичные данные. Lua не имеет встроенных функций, использующих данные Unicode; поведение string.upper зависит от локали C.
  • В Lua , not , или , и ключевые слова используются вместо JS ! , || , && .
  • Lua использует ~ = для «не равно», тогда как JS использует ! == . Например, if foo ~ = 20 then ... end .
  • Lua 5.3 и выше используют ~ для двоичного побитового XOR, тогда как JS ] использует ^ .
  • В Lua любой тип значения (кроме nil и NaN ) может использоваться для индексации стол. В JavaScript все нестроковые типы (кроме Symbol) преобразуются в строки перед использованием для индексации объекта. Например, после оценки следующего кода значение obj [1] будет " function t.fieldname () end , function t: methodname () end ). JS объявляет их знаком равенства ( let funcname = function optionalFuncname () {} , objectname.fieldname = function () {} ).
185
ответ дан 24 November 2019 в 01:39
поделиться

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

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

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

12
ответ дан 24 November 2019 в 01:39
поделиться

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

11
ответ дан 24 November 2019 в 01:39
поделиться

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

7
ответ дан 24 November 2019 в 01:39
поделиться

Не в последнюю очередь

Lua ...

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

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

1
ответ дан 24 November 2019 в 01:39
поделиться
Другие вопросы по тегам:

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