汇总了一些在用JavaScript开发过程中遇到的各种奇技淫巧,分享给大家,避免在遇到这些问题的时候一脸懵不知所措。
使用await和promise延时
const delay = ms => new Promise(resolve => setTimeout(resolve, ms));
await delay(500)
使用一元运算符立即执行函数
一般的立即执行函数是这样子的
(function(){console.log("氦")})()
现在你可以这样做
!function(){console.log("氦")}()
效果一致,还省去了括号包裹的烦恼!
原理:
立即执行函数依靠将匿名函数anonymous function
变为表达式实现,
那么可以使得后面的语句变成表达式的运算符都可以做到,在+-*/!~!!
中任选一款,总有一款适合你~
区别是语句执行后的运算结果,可以自己试试看!
快速取整
不会吧不会吧不会真的还有人不知道这个技巧吧?
使用两次位取反:
const a = 8.12345
console.log(~~8.12345)
console.log(~~a)
输出:
这个也可以作为转换为整数使用,效果等同于Math.floor()
(吧)
务必仅在对输入无比自信时使用……
使用arguments.callee
实现匿名函数递归
例如想做一个递归的求阶乘:
function foo(i){
if(i) i = i * foo(i-1)
return !i? 1: i
}
foo(4) //24
我非要做成匿名的,那我可以这么做:
+function(i){
if(i) i = i * arguments.callee(i-1)
return !i? 1: i
}(4) //24
记得要用一元正负号哦~
使用Javascript的特性实现加密编码
关于这个技巧,我 创建了一个将js代码转换的编译器的项目,地址:Javascript Brainfuck
如以下代码:
(!(~+[])+{})[--[~+""][+[]]*[~+[]] + ~~!+[]]+({}+[])[[~!+[]]*~+[]]
将得到以下结果:
这是利用了Javascript的特性实现的,也许你见过以下这张关于js的梗图:
不会吧不会真的有人没看过吧
其中,如[]+{}
的表达式输出[object Object]
的规则,则是实现加密编码的关键。
使用数组下标的形式,可以当作普通的字符使用,如([]+{}+[])[1]
则可以访问到字符o
。灵活使用表达式,可以将数字消除,如使用+[]
或者~+[]+~~!+[]
代替数字0
,使用~~!+[]
代替数字1
,使用位取反产生负数(~~0
为-1
)
这样,就可以将正常的代码转换为下面这种类型:
左边为转换前的代码
甚至,还可以插入到正常的代码中,成为核心工程师:
感兴趣可以去看看项目!
使用constructor()
实现执行string类型的js代码
这个技巧适合配合上面的食用,如图……
效果如eval(),但不同的是constructor会返回一个匿名函数,eval则是创建完匿名函数后直接执行。
这个特性对于Array
Object
Number
都是适用的
你啊,迟早畀人**
太强了太强了OωO
JavaScript brain fuck
看完之后我也说出了一句fuck
太强了