Lua uses keyword...end blocks instead of {}.
Functions
JS
   function sayHello(name) {
    return name
}
sayHello("gan")   Lua
   function sayHello(name)
    return name
end
return sayHello("gus")   do .. while
JS
   do {
    // some code
} while (condition)   Lua
   repeat
    -- some code
until not condition   Variable
All local variables in lua use local instead of var, let, or const.
JS
   var a = 1 let b = 2 const c = 3 d = 4 // global
Lua
   local a = 1 local b = 2 local c = 3 d = 4 -- global
Equality
JS
   let bool1 = "0" === 0 // false let bool2 = "0" == 0 // true
Lua
   local bool1 = "0" == 0 -- false local bool2 = "0" == tostring(0) -- true
Negation Operator
JS
   let isNotFrance = country != "france"
Lua
   local isNotFrance = country ~= "france"
Ternary
JS
   let name = condition ? "A" : "B"
Lua
   local name = condition and "A" or "B"
-- safer
if condition then
    name = "A"
else
    name = "B"
end   Null-Coalescing Operator
JS
   let message = error.message ?? 'An unknown error occurred.'; let message = error.message ? error.message : 'An unknown error occurred.';
Lua
   local message = error.message or 'An unknown error occurred.';
Multiple Expressions
JS
   const variable = (someExpression1, someExpression2, ..., someExpressionN)
Lua
   local variable = (function()
    someExpression1
    someExpression2
    ...
    return someExpressionN
end)()   Unicode
Lua only supports up to UTF-8
JS has String.fromCharCode()
JS
   let a1 = "a"
let a2 = "\u{061}"
let a3 = "\u0061"
let a4 = String.fromCharCode(0x61) // hex
let a5 = String.fromCharCode(97)   // dec   Lua
   local a1 = "a"
local a2 = "\u{061}"
local a3 = "\097"
local a4 = string.char(0x61) -- hex
local a5 = string.char(97)   -- dec
local a6 = utf8.char(0x61)   -- hex
local a7 = utf8.char(97)     -- dec   
Comments
// single line comment /* multiline comment */-- single line comment --[[ multiline comment --]]