从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}) 

 

posted @ 2020-11-13 20:27  wanhong  阅读(930)  评论(0编辑  收藏  举报