тонкие различия между JavaScript и Lua
Я просто люблю JavaScript. Это так элегантно (представьте себе тихий звук влюбленного фаната, вздыхающего на заднем плане).
Так, недавно я играл с Lua через löve2d рамки (Ницца!) - и я думаю, что Луа тоже здорово. Они, как я вижу, эти два языка очень похожие.
есть очевидные различия, как
- синтаксис
- библиотеки
- типы (немного)
домен
но какие из них более утонченные? Есть ли что-нибудь, что кодер JavaScript будет считать само собой разумеющимся, что работает в Lua немного иначе? Есть ли какие-либо подводные камни, которые могут быть не очевидны для опытного кодера одного языка, пытающегося использовать другой?
например: в Lua массивы и хэши не разделяются (есть только таблицы) - в JavaScript они являются числовыми массивами и хэшируются Объекты. Ну, это одно из наиболее очевидных различий.
но есть ли различия в области переменных, неизменяемости или что-то вроде этого?
8 ответов:
еще несколько отличий:
- Lua имеет встроенную поддержку для сопрограммы.
- обновление: JS теперь содержит ключевое слово yield внутри генераторов,предоставляя ему поддержку сопрограмм.
- Luaне преобразовывает между типов для любых операторов сравнения. В JS, только
===и!==не типа жонглировать.- Lua есть оператор возведения в степень (
^);JS нет. JS использует различные операторы, включая тернарный условный оператор (?:vsand/or), и, начиная с 5.3, побитовые операторы (&,|и т. д. против метаметоды).
- обновление: JS теперь имеет оператор возведения в степень
**.- JS есть инкремент / декремент, операторы типа (
typeofиinstanceof), дополнительные операторы присваивания и дополнительные операторы сравнения.- на JS на
==,===,!=и!==операторы имеют более низкий приоритет, чем>,>=,<,<=. В Lua, все операторы сравнения являются тот же приоритет.- Lua поддерживает хвост звонит.
- обновление: JS now поддержка хвостовых вызовов.
- 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, тело aforцикл не вводит новую область, поэтому любые функции, объявленные в теле цикла, ссылаются на те же внешние переменные. В 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 ...
- поддерживает сопрограммы
- не имеет ограничений только на строку / число в качестве ключа для таблицы. Все работает.
- обработка ошибок несколько неуклюжая. Либо вы ничего не обрабатываете, либо используете pcall метод
- Я думаю, что я читал что-то о различиях в лексическом объеме и что Lua имеет лучший.
- если я правильно помню поддержка регулярных выражений в lua ограничена
Мне понравился этот вопрос и ответы. Дополнительные причины два языка кажутся мне более похожими, чем нет:
Как назначение функций переменным, может создавать функции на лету, и определить замыкания.
тест показывает, что текущий Javascript также возвращает объекты или, по крайней мере, строки из логических выражений, таких как lua:
function nix(){ alert(arguments[0]||"0"); } nix();
Comments