从Lua学习JavaScript(一)

学习 Lua 对于了解 Javascript 的人来讲就是小菜一碟,Tyler Neylon 写了三篇文章来解释其中的缘由,这是其中的第一篇。javascript

这是经过 Javascript 来学习 Lua 系列文章的第一篇,一共有三篇,第二篇和第三篇。
登录 Tyler 的免费的网络广播频道收听 Lua 能作什么?php

Lua 是一门优雅的,可移植的,高效的而且异常灵活的语言。全部可以编译 C 语言的操做系统都能运行 Lua,这是一些跨平台的框架,好比 Corona SDK 和 Love game engine,选择 Lua 的缘由。Lua 的运行速度很快,足够用来开发游戏——愤怒的小鸟的最初是用 Lua 编写的。 Lua 能和其余的语言很好的融合在一块儿,它做为脚本语言,在 Adobe lightroom 项目中有出色的表现。我认为 Lua 的设计很优美,用起来也很是的舒服。css

对于已经了解 Javascript 的人而言,学习 Lua 是很是简单的,由于Lua 和 Javascript 有不少的共同点。在学习的过程当中,咱们能够经过这些共同点很快的熟悉 Lua,但须要注意二者间一些关键性的不一样的地方。html

经过 Javascript 的相关知识学习 Lua 的系列总共三篇,这是其中的第一篇。这篇文章中包含一些基础概念:安装 Lua,变量,数据类型,操做符和表达式。第二篇将会涉及流程控制和数据结构,第三篇讲解对象相关的一些知识。java

文章中出现的 Javascript 代码大多都遵循 2009 年制定的 EACMScript 5 标准,也就是 ES5 标准。如今最新的 Javascript 标准的是 ES6 或者称为 ES2015。我会用到一些 ES6 的语法,并指出这是 ES6 的特性,这样读者就能知道这段 Javascript 代码遵循的标准。不过读者并不须要了解 ES6,我也不会对用到的 ES6 特性进行解释。node

运行 Lua

官方安装指南传送门
若是在 Mac 上安装了 homebrew,运行 brew install lua。ubuntu 的话,运行 sudo apt-get install lua5.2,若是从源码编译安装能够安装最新的版本的 Lua。在 windows 上请使用 LuaDist 安装。linux

在 Max OSX 和 Linux 上经过编译源码的方式安装 Lua 很简单,执行下面的 shell 命令。若是是 Max OS X,把最后一行的 linux 替换为 macosx 。shell

curl -R -O http://www.lua.org/ftp/lua-5.3.3.tar.gz
tar zxf lua-5.3.3.tar.gz
cd lua-5.3.3 make linux test # Mac 的话把 linux 替换为 macosx. 

安装完成后,就可使用 lua 命令了,运行 lua 应该看到如下输出。macos

$ lua
Lua 5.3.3 Copyright (C) 1994-2016 Lua.org, PUC-Rio > 

任意一个文本编辑器都能用来写 Lua 脚本,写一段代码保存为 my_file.lua,执行 Lua 脚本相似 node.js 执行 Javascript 脚本,使用命令就行了。ubuntu

lua my_file.lua 

注释,空格和分号

Lua 中的多行注释的以 --[[ 开始,以 ]] 结尾。 若是 -- 以后没有 [[,那么这行是一个单行注释。例如:

print('Why, hello!') -- print 方法输出一段字符串 --[[ 这里是一个 多行注释!]] 

Lua 会忽略缩进。通常的空格也会被忽略,可是会保留字符串的空格和单行注释后面的空白行。行尾的分号可写可不写,通常而言不用写。

变量和做用域

和 Javascript 同样, Lua 的变量是动态类型的,也使用垃圾回收器管理内存。多数的 Lua 变量类型都能在 Javascript 中找对应的类型。

Javascript 变量类型 Lua 变量类型 Lua 变量例子
boolean boolean true or false
null or undefined nil nil
number number 3.141
string string 'hi' or "there"
object or array table {a=1, [2]=false}
function function function() return 42 end
symbol(ES6) unique tables 'hi' or "there"

It's handy to classify boolean values in term of falsiness; a value is called falsy when it evaluates to false to a boolean context; Lua 中仅有的假值是 nil 和 false。相似地在 Javascript 中,0''undefined 都是假值。

Lua 的 numbers 类型,因为历史缘由,使用了浮点数来表示——就像 Javascript 的 numbers。从 Lua 5.3 开始,Lua 增长了对整数类型的支持,increasing the range of integral values that can be represented exactly.

直观的来看,若是 Lua 的 number 类型变量被初始化为整数,它被看成一个整数,而且会一直保留整数形式直到遇到可将它变为非整数的操做,好比除法。下面的代码展现了 Lua 如何处计算数学表达式——有些运算获得整数,有些获得浮点数。

-- Lua
n = 100
print(n) --> 100; 使用整数形式存储 print(n * 2) --> 200; 运算结果是整数 print(n / 2) --> 50.0; 运算结果是浮点数 

相似 Javascript 中的 objects,Lua 的 table 类型是一个全能的数据结构。
table 能够被用作哈希表或者是数组。不过 Javascript 中 object 的 keys 只能是字符类型,Lua table 的 keys 能够是任何的非 nil 值。在 Lua 中 只有两个 table 是同一个对象时才会相等,而不是它们拥有相同的内容。

-- Lua
myTable = {}
print(myTable == myTable) --> true print(myTable == {}) --> false 

Lua 中 function 是一等公民——能够建立匿名函数,把函数赋值给变量,也能够把函数看成另外一个函数的参数或者返回值。若是在函数中引用了定义在该函数做用域以外的自由变量,将隐式地造成一个闭包(译者注:和 Javascript 中的闭包很相似)。同时 Lua 中的函数支持高效的尾递归,也就是在函数的结尾调用另外一个函数,调用栈不会增长。

Lua 中还有两个类型 userdata 和 thread。userdata 是使用 Lua 的 C 语言 API 调用 C 语言生成的对象。userdata 就像一个拥有私有数据的 table,也能够自定义它的行为。 Lua 的 thread 是一个 coroutine,容许函数使用 yield 一些值并保持自身的栈和内部状态。

做用域和可变性

Lua 中变量的做用域默认是全局做用域。Lua 的 local 关键字有点像 Javascript 中的 var,只不过 Lua 中没有声明提高。也就是说,Lua 中的 local 和 ES6 中的 let 同样,都是块级做用域。

-- Lua
phi         = 1.618034 -- `phi` 是全局变量。 local gamma = 0.577216 -- `gamma` 只在当前的块做用域下可见。 

Lua 中没有常量或者私有变量。不过能够像 Javascript 中同样,使用闭包来模拟私有变量。建立一个函数,在函数中引用定义在函数以外的变量,这就使得这些变量在函数以外不可见,达到相似私有变量的效果。 Lua 的函数相关内容将在下一篇文章中涉及。

操做符和表达式

Lua 和 Javascript 中的数学运算,像是加法和乘法,基本上是同样的。二者都提供了获取余数的操做,不一样的是: Javascript 中的 在左侧操做数是负数时会返回负值,而 Lua 中的 老是返回非负值。Lua 中可使用 ^ 进行指数操做。

-- Lua
print(2 ^ 10) --> 1024.0 print(-2 % 7) --> 5 

Javascript 不支持操做符重载,可是 Lua 支持。Lua 经过一种称为 metamethods(修改元数据) 特殊函数实现的重载,这部份内容将会在最后一篇文章中解释。Javascript 有一个三元操做符,但 Lua 中并无,不过在 Lua 中能实现相似的效果,这须要借助 Lua 中的短路操做符 or 和 and。

-- Lua

-- Lua 中模拟三元操做符.
local x = myBoolean and valueOnTrue or valueOnFalse -- 例子:找到 a 和 b 的中的最大值. local maxNum = (a > b) and a or b -- 相似 Javascript 中的如下代码 -- var maxNum = (a > b) ? a : b; 

这个实现颇有效除非 valueOnTrue 是假值。大部分状况下都不会有问题由于 Lua 的数字,字符和表不会被看成假值。

比较

在 Javascript 中被普遍认同的的一个最佳实践是使用 == 而不是 ==,由于 Javascript 中的 == 引起使人疑惑的隐式的类型转换。对于 ===, Javascript 只有当比较的值有相同的类型的时候才会返回 true

Lua 只有 == 一种比较操做符,和 Javascript 中的 === 同样要求类型相同。如下的例子使用了 Lua 中的内置函数 tonumber,它将一个字符串转化为数字。

-- Lua
print(6.0 * 7.0 == '42') --> false, 不一样的类型 print(6.0 * 7.0 == tonumber('42')) --> true, 都是 number 类型 

Lua 的 <> 操做符在比较的值是不一样的类型时将会获得 false。它们比较字符使用字符标排序,比较数字使用数字排序。

位操做符

Lua 5.3 引入了内置的位操做符,见下表。表中的操做符在 Lua 和 Javascript 中均可用。

操做符 含义
&
Ι
~ 取反
<< 左移

Lua 中的~,就像 Javascript 中的 ^。

-- Lua
print(6 & 18) --> 2; 00110b AND 10010b = 00010b. print(6 | 18) --> 22; 00110b OR 10010b = 10110b. print(6 ~ 18) --> 20; 00110b XOR 10010b = 10100b. 

Javascript 中区分了 >> 和 >>> 操做符, >> 保持符号而 >>> 使用 0 填充。Lua 中的 >> 就像 Javascript 中的 >>> 的操做符,使用 0 来填充空位。

这篇文章包含了一下基础知识,运行 Lua并理解 Lua 中的数据类型和表达式。下一篇文章将会包含更多的内容,好比Lua 的流程控制关键字,函数和很重要的 table。

做者:coldtiger 连接:https://www.jianshu.com/p/5e872e654bb1 來源:简书 著做权归做者全部。商业转载请联系做者得到受权,非商业转载请注明出处。
相关文章
相关标签/搜索