codecamp

惯用法(精巧用法)

惯用法(精巧用法)

尽可能使用local修饰变量(重要的事情要说三遍!)

原因:

  • 使用local的变量会在作用域结束时释放其内存
  • 使用local的变量会比全局变量的存取更快
  • 全局变量会污染全局的命名空间,可能会导致诡异的bug出现

直接判断真假值


-- 不推荐

if  obj  ~=  nil  and  willBreak  ==  false  then

    -- ...

end

-- 推荐

if  obj and  not  willBreak then

    -- ...

end

原因:Lua在逻辑判断时将所有非falsenil的逻辑判断视为真,反之视为假,不需要再与布尔值和nil进行比对。

但是,在需要对falsenil进行区分时,需要写明==obj == nilobj == false

默认参数的实现

范式:param = param or defaultValue

function  setName(name)

    name  =  name or  'noName'

    -- ...

end

原因:or会在第一次为true的时候断路,返回其判断的最后一个值。所以当name为空时,name or 'noName'返回为'noName',这会将name的值自动设置为noName

一行代码实现表的拷贝

u  =  {unpack(t)}

一行代码判断表是否为空

#t == 0并不能判断表是否为空,因为#预算符会忽略所有不连续的数字下标和非数字下标。

正确做法是:


if  next(t)  ==  nil  then

    -- 表为空

    -- ...

end

因为表的键可能为false,所以必须与nil比较,而不直接使用~next(t)来判断表是否空。

更快的插入代码

-- 更慢,不推荐

table.insert(t,  value)

-- 更快,推荐

t[#t+1]  =  value

原因:[]和#避免了高层的函数调用开销。

注释
参考资料
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }