从js到lua
为了搞unity的热更新,可能需要用到lua.
lua是什么东西?一种脚本语言。脚本语言一般轻量, 简单.
js大家都很熟悉吧。因此我拿它与lua对比
相同点-----------------------------------------------------
基本类型都差不多,追求简单。
string / string 字符串类型都是string,没有char等
number / number 都没有int, double等,是不是很简单呀
boolean / boolean
function / function 都是作为第一类,也可作为参数,可变参数也都是...
object / table property/metatable 原型链 __index里面的元素不被修改
null | underfined / nil
var | let|const / local 定义变量的方式差不多(期版本,如果不定义变量,就是全局属性和lua类似)
async / coroutine 都有协程
window|global/_G 定义的全局变量
... | ... 可变参数
property|setmetatable 都是基于对象的继承
proxy|metatable 为了让对象参与各种调用和计算,js使用了 valueof,tostring(),proxy
hasOwnProperty|rawset/rawget 操作元始属性
Object.getPrototypeOf | getmetatable() 得到属性链
不同点----------------------------------------------------
js有变量提升 lua没有变量提升
js==,===,!=和!==运算符的优先级低于>,>=,<,<=。 lua中 所有比较运算符都具有相同的优先级。
js中数组的下标 从0开始 lua中数组的下标从1开始
js全局变量存在window中 lua全局变量存在_G中
js模块化 import/export lua模块化require/return(实质上就是函数)
js块是放在{}中的 lua中块是以end结束
js的运算符+有两重性(连接符,运行算), lua的运算符+只表示运算符,lua的连接符用...
js判断相等 “5”==5 true lua判断相等 "5"==5 false;
js判断不等 5 != "5" lua判断不等 5 ~= "5"
js逻辑运算符&& || ! lua逻辑运算符 and or not
js正则表达式转义字符用\ lua正则表达式转义字符用%
js有表示空有两种null, underfined lua表示空用用nil
js表示串块`` lua表示字符串块 [[]]
js表里的初始索引以0开始 lua表里的初始索引以1开始
js有array类型 lua里没有,用table充当
js有局部变量/全局变量通过作用域区分 lua通过关键字区分
js中对象参与计算 valueOf/toString lua 通过 setmetatable({},{__add})
js中属性调用方法 array. / str. lua中 table(arr,), sting(str, )
js中有switch,continue,i++,三元去处符等 lua中没有
js中的对像键值只能是字符串 lua中是任意非空
js语句块 {} lua do end
---tabel相关的方法--- 很简单 concat,insert,remove,sort
1:js arr转化为字符串 arr.join(",") lua 中数组转化为字符串 table.concat(table, ",")
2:js arr插入,删除 shift,pop,splice,unshift,push lua中 tabel.insert(tabel, ele), tabel.remove(tabel, ele)
3:js排序 arr.sort lua中 table.sort(table, ...)
---function相关的方法---
1:js函数作为第一对象 lua函数作为第一对象
2:js函数有作用域 var lua函数也有作用域 local
3:js闭包,所谓的闭包就是用域产生的 lua与js的闭包一样
--模拟面向对象(实质一样,都是通过属链来的)
js通过 function和属性链 来模拟
lua通过 {}和元表 来模拟
------js实现----------------------------------------------------
function People() {
Object.defineProperty(this, "name", {
get:function() {
return "honghong"
},
set:function() {
console.log("只读属性")
}
})
}
People.property = {
construct: People
}
let people = new People()
people.name = "hh"
console.log(people.name)
** 其实上面的是语法糖,new function的本质是 创建{},指定属性链,内部直接做掉了。
let people = {}
people.__proto__ = {}
------lua实现---------------------------------------------------
local People = {} --静态对象 People.New = function(t) if (not t) then t = {} end local newT = {}; local mt = { __index = t, __newindex = function() print("别修改我!我是只读的!"); end } setmetatable(newT, mt); return newT; end
---调试---
lua是比js更严谨的语言,不是所有的东西都能参与计算,如果table要参与计算,请借助于元表
用next找不到是会报错的
总结
lua比js更简单。。。,如果你真的理解了js, 那你也就会了lua.
lua就是缩量版的js
>去掉了变量提升
>去掉了操作符的多义性(js的很多符号有两重性+,lua中没有)
>简化了api, lua的api比js少很多很多
>调用方式稍微有所不同 js中
str.slice(start, end), string.sub(str, start, end)
obj1.prototype=obj2, setmetatable(obj1, {__index = obj2})
arr.push(obj) table.insert(arr, obj)
Proxy(obj, handle) setmetatable(obj, {__call = function() print("----") end})