128 votes

les différences subtiles entre le JavaScript et le Lua

J'adore tout simplement JavaScript. C'est tellement élégant (imaginez le bruit de lovestruck fanboy de soupirer en arrière-plan).

Ainsi, récemment, j'ai joué avec Lua via le löve2d cadre (nice!) - et je pense que Lua est aussi grande. Ils façon dont je le vois, ces deux langues sont très similaires.

Il y a des différences évidentes, comme

  • la syntaxe
  • domaine du problème
  • les bibliothèques
  • types (un peu)

mais qui sont les plus subtiles? Est-il rien d'un codeur JavaScript serait de prendre pour acquis que les œuvres en Lua légèrement différent? Existe-il des pièges qui peuvent ne pas être évidentes pour le codeur expérimenté d'une langue en essayant de l'autre?

Par exemple: en Lua, les tableaux et les tables de hachage ne sont pas séparés (il y a seulement les tableaux) en JavaScript, ils sont numériques, des Tableaux et hachés Objets. Eh bien, c'est l'une des plus évidentes différences.

Mais il y a des différences dans la portée des variables, l'immuabilité ou quelque chose comme ça?

195voto

outis Points 39377

Certains plus de différences:

  • Lua a un support natif pour les coroutines.
  • Lua n'est pas la conversion entre les types de tous les opérateurs de comparaison. En JS, seulement "= = = "et"!==' ne tapez pas jongler.
  • Lua est un opérateur exponentiel (^); JS qui ne fonctionne pas. JS a de nombreux autres opérateurs, y compris l'opérateur conditionnel ternaire (?:), d'incrémentation/décrémentation, des opérateurs au niveau du bit, type d'opérateurs (typeof et instanceof), d'autres opérateurs d'affectation et de supplémentaires pour les opérateurs de comparaison.
  • En JS, d'égal à égal et non pas égale opérateurs sont de plus faible priorité supérieure à moins que et coll. En Lua, tous les opérateurs de comparaison sont du même ordre de priorité.
  • Lua prend en charge les appels tail.
  • Lua prend en charge l'affectation à une liste de variables. Même s'il n'est pas encore la norme en Javascript, Mozilla JS moteur (et de l'Opéra, dans une certaine mesure) a pris en charge une fonctionnalité similaire depuis JS 1.7 (disponible en tant que partie de la version 2 de Firefox) sous le nom de "déstructuration d'affectation". Déstructuration dans le JS est plus général, comme il peut être utilisé dans des contextes autres que l'affectation, tels que les définitions de fonctions et appels et boucle initialiseurs. Déstructuration de cession a été un ajout proposé à ECMAScript (la langue standard derrière Javascript) pour un certain temps.
  • En Lua, vous pouvez la surcharge des opérateurs.
  • En Lua, vous pouvez manipuler les environnements avec getfenv & setfenv.
  • En JS, toutes les fonctions sont variadic. En Lua, les fonctions doivent être explicitement déclarée comme variadic.
  • Foreach en JS passe en boucle sur les propriétés de l'objet. Foreach en Lua (qui utilisent le mot-clé for) passe en boucle sur les itérateurs et est plus général.
  • JS a mondiale et la portée de la fonction. Lua a global et le bloc de portée. Les structures de contrôle (par exemple, if, for, while) introduire de nouveaux blocs.

    • En raison des différences dans les règles de portée, d'une fermeture du référencement d'une variable externe (appelé "valeurs amont" dans le langage Lua) peuvent être traités différemment en Lua et en Javascript. Ce qui est le plus expérimenté avec fermetures en for boucles, et les captures de certaines personnes par surprise. En Javascript, le corps d'un for boucle de ne pas introduire un nouveau champ d'application, de sorte que toutes les fonctions déclarées dans le corps de la boucle toutes le même extérieur variables. En Lua, à chaque itération de l' for boucle crée de nouvelles variables locales pour chaque variable de boucle.

      local i='foo'
      for i=1,10 do
        -- "i" here is not the local "i" declared above
        ...
      end
      print(i) -- prints 'foo'
      

      Le code ci-dessus est équivalente à:

      local i='foo'
      do
        local _i=1
        while _i<10 do
          local i=_i
          ...
          _i=_i+1
        end
      end
      print(i)
      

      En conséquence, les fonctions définies dans les séparer itérations ont différentes valeurs amont de chaque référencé variable de boucle. Voir aussi Nicolas Bola de réponses à la mise en Œuvre de fermetures en Lua? et "Ce sont la sémantique correcte d'une fermeture de plus d'une variable de boucle?", et "La Sémantique du Générique de".

  • Les littéraux entiers en JS peut être en octal.
  • JS a explicite support de l'Unicode.
  • En lua, ~ est utilisé à la place de !. (comme dans, if foo ~= 20 then ... end) (techniquement, la syntaxe, mais il est très facile de les oublier et les causes de bogues subtils).
  • En lua, l' not/or/and mots-clés sont utilisés à la place de !/||/&& (également de la syntaxe, mais aussi facile d'oublier).
  • En Lua, tout type de valeur (sauf nil et NaN) peut être utilisé pour indexer un tableau; en JavaScript, l'objet, les index sont convertis en chaînes.

14voto

richq Points 29694

Quelques différences subtiles qui va vous attraper au moins une fois:

  • Pas l'égalité est orthographié ~= en Lua. En JS c'est - !=
  • Lua tableaux sont à base de 1 - le premier indice est de 1 au lieu de 0.
  • Lua nécessite une virgule plutôt qu'un délai pour appeler les méthodes de l'objet. Vous écrivez a:foo() au lieu de a.foo()

vous pouvez utiliser une période si vous voulez, mais doivent passer à l' self variable explicitement. a.foo(a) semble un peu lourd. Voir la Programmation en Lua pour plus de détails.

12voto

Dave Rigby Points 5375

Pour être honnête, il serait plus facile d'énumérer les choses qui sont communes à Javascript et Lua que de lister les différences. Ils sont à la fois dynamiquement typés, les langages de script, mais c'est à peu près aussi loin que vous pouvez aller vraiment. Ils ont totalement différente de la syntaxe, de différentes original objectifs de conception, les différents modes de fonctionnement (Lua est toujours compilé en bytecode et de courir sur la VM Lua, Javascript varie), la liste est longue et sur.

8voto

Nosredna Points 33670

JavaScript les tableaux et les objets sont plus proches que vous ne le pensez. Vous pouvez utiliser la notation de tableau pour obtenir les éléments de l'un d'eux, et vous pouvez ajouter des indices numériques pour tableaux. Individuelle des éléments d'un tableau peut contenir quoi que ce soit, et la matrice peuvent être rares. Ils sont presque identiques cousins.

4voto

WeakPointer Points 191

J'ai aimé cette question et les réponses fournies. D'autres raisons les deux langues semblent de plus en plus semblables que de ne pas m':

Les deux affecter des fonctions à des variables, peut construire des fonctions à la volée, et de définir les fermetures.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X