1. andor都是“短路求值(short-cut evaluation)”,也就是说,他们只会在需要时才会去评估第二个操作数,这样便可以保证一些表达式不会导致运行时错误,比如if a ~= nil and a.b == "a",若a已经为nil了则不会计算第二个操作数了,否则若a为nil时取a.b则会导致程序gg。
    2. LUA中的下标是以1开始的。
    3. table中元素最后的逗号是可选的,这样便无须将最后一个元素作为特例来处理。
    4. LUA中可以多重赋值,a, b = c, d,最后a == c,b == d,同时若两个参数个数不相等,并不会报错,,左边多余的参数会被赋值为nil,右边多余的值则会被丢弃,通过这种方式就可以同时接收函数的多个返回值,local a, b = test(),同时因为是先对等号右边的所有元素求值后再进行赋值==,所以当想交换两个变量时,直接a, b = b, a即可。
    5. LUA中仅有falsenil为假,除此之外的值都视为真,数字0和空字符串也是真,所以用if not xxx then的方式只能判断出xxx是否为falsenil,这样用not xxx的方式便能很好的进行失败的判断,而不应写死为xxx == nilxxx == false
    6. LUA在运行时会自动完成数字与字符串之前的相互转化,但在比较时数字 == 字符串时结果总是false,毕竟是两个不同的数据类型。
    7. LUA中是将nil作为界定数组(表格)结尾的标记,所以local a = {}; a[1000] = 1; print(#a)的结果为0。
    8. LUA中可用_M来代表模块本身
    9. LUA中函数与所有其他值(表格等)一样都是匿名的,即他们都没有名称,函数名只是一个持有该函数内容的一个变量,同一个函数可以被不同的变量持有。
    10. 从技术上将,LUA中只有closure,也即只有闭合函数,函数本身就是一种特殊的closure,一般是用来带指不带“非局部的变量”的closure,而完整的closure = 该函数 + 该函数所需访问的所有“非局部的变量”,所以LUA中通过closure让函数能够访问到外部定义的局部变量。
    11. print默认会输出一个换行,若不需要换行则可以使用io.write,默认输出到stdin,也即终端