原因:
local
的變量會(huì)在作用域結(jié)束時(shí)釋放其內(nèi)存local
的變量會(huì)比全局變量的存取更快
-- 不推薦
if obj ~= nil and willBreak == false then
????-- ...
end
-- 推薦
if obj and not willBreak then
????-- ...
end
原因:Lua在邏輯判斷時(shí)將所有非false
和nil
的邏輯判斷視為真,反之視為假,不需要再與布爾值和nil
進(jìn)行比對。
但是,在需要對false
和nil
進(jìn)行區(qū)分時(shí),需要寫明==
:obj == nil
和obj == false
。
范式:param = param or defaultValue
function setName(name)
????name = name or 'noName'
????-- ...
end
原因:or
會(huì)在第一次為true
的時(shí)候斷路,返回其判斷的最后一個(gè)值。所以當(dāng)name
為空時(shí),name or 'noName'
返回為'noName'
,這會(huì)將name
的值自動(dòng)設(shè)置為noName
。
u = {unpack(t)}
用#t == 0
并不能判斷表是否為空,因?yàn)?code>#預(yù)算符會(huì)忽略所有不連續(xù)的數(shù)字下標(biāo)和非數(shù)字下標(biāo)。
正確做法是:
if next(t) == nil then
????-- 表為空
????-- ...
end
因?yàn)楸淼逆I可能為false
,所以必須與nil
比較,而不直接使用~next(t)
來判斷表是否空。
-- 更慢,不推薦
table.insert(t, value)
-- 更快,推薦
t[#t+1] = value
原因:[]和#
避免了高層的函數(shù)調(diào)用開銷。
更多建議: