Это может быть немного поздно, немного лениво, немного скучно, немного навязчиво или немного похоже на «спину, большой рот», но ...
Каждое решение, которое я до сих пор читал, было бы похоже на «давай спать и посмотрим, что случилось завтра».
setInterval (обратный вызов, время) будет долго ждать, а затем обратный вызов, в то время как блокировка времени выполнения. Текущая реализация "setInterval" далека от сохранения потока, даже не говоря уже о параллелизме.
Хотя упомянутые разреженные решения выглядят как, угадайте, что C # ( смеется ), они все еще не работают, как в C # / .NET. Они все еще работают как в C.
В настоящее время JavaScript НЕ предоставляет архитектуру для реализации реальной многопоточности. Лучшим подходом был бы TypeScript, но все же в нем так мало реального решения, что ... больно. JavaScript, JQuery, AJAX, JNode и даже TypeScript - это всего лишь группа Wannabes, полагающихся на благо и плохое настроение разработчиков. Факт. Полная остановка.
Еще несколько отличий:
===
и ! ==
не вводят жонглирование. ^
); JS - нет. JS использует разные операторы, включая тернарный условный оператор (?:
vs и / или
), а также, начиная с версии 5.3, побитовые операторы ( &
, |
и т. Д. По сравнению с метаметодами ).
**
. typeof
и instanceof
), дополнительные операторы присваивания и дополнительные операторы сравнения. ==
, ===
, ! = Операторы
и ! ==
имеют более низкий приоритет, чем >
, > =
, <
, <=
. В Lua все операторы сравнения имеют одинаковый приоритет . getfenv
и setfenv
в Lua 5.1 или _ENV
в Lua 5.2 и 5.3 . Foreach
в JS перебирает свойства объекта. Foreach в Lua (в котором используется ключевое слово для
) перебирает итераторы и является более общим.
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
, учитывают область действия блока.
«pâté». toUpperCase ()
( «ПЕТЕ»
). Lua 5.3 и выше имеют escape-последовательности кодовой точки Unicode в строковых литералах (с тем же синтаксисом, что и escape-последовательности кодовой точки JavaScript), а также встроенную библиотеку utf8
, которая предоставляет базовые поддержка кодировки UTF-8 (например, кодирование кодовых точек в UTF-8 и декодирование UTF-8 в кодовые точки, получение количества кодовых точек в строке и итерация по кодовым точкам). Строки в Lua представляют собой последовательности отдельных байтов и могут содержать текст в любой кодировке или произвольные двоичные данные. Lua не имеет встроенных функций, использующих данные Unicode; поведение string.upper
зависит от локали C. not
, или
, и
ключевые слова используются вместо JS !
, ||
, &&
. ~ =
для «не равно», тогда как JS использует ! ==
. Например, if foo ~ = 20 then ... end
. ~
для двоичного побитового XOR, тогда как JS ] использует ^
. nil
и NaN
) может использоваться для индексации стол. В JavaScript все нестроковые типы (кроме Symbol) преобразуются в строки перед использованием для индексации объекта. Например, после оценки следующего кода значение obj [1]
будет " function t.fieldname () end
, function t: methodname () end
). JS объявляет их знаком равенства ( let funcname = function optionalFuncname () {}
, objectname.fieldname = function () {}
).
Пара тонких отличий, которые заметят хотя бы один раз:
~ =
. В JS это ! =
a: foo ()
вместо a.foo ()
† † , вы можете использовать точку, если хотите, но должны передать self
явно. a.foo (a)
выглядит немного громоздко. Подробнее см. Программирование на Lua .
Если честно, было бы проще перечислить общие для Javascript и Lua вещи, чем перечислить различия. Они оба являются языками сценариев с динамической типизацией, но это все, что вы можете на самом деле. У них совершенно другой синтаксис, разные исходные цели дизайна, разные режимы работы (Lua всегда компилируется в байт-код и запускается на Lua VM, Javascript меняется), список можно продолжать и продолжать.
Массивы и объекты JavaScript ближе, чем вы думаете. Вы можете использовать нотацию массива, чтобы получить доступ к элементам любого из них, и вы можете добавлять нечисловые индексы к массивам. Отдельные элементы массива могут содержать что угодно, и массив может быть разреженным. Они почти идентичные кузены.
Не в последнюю очередь
Lua ...
Lua и JavaScript являются базовыми языками-прототипами.