众所周知, JavaScript是一门很骚的语言, 写一句话有很多种表达方式, 语法怪异而风骚, 自由而散漫, 或许这就是JS成为最流行语言的原因吧. 本文收集了JS开发中常用的各种奇淫技巧, 一句话代码, 函数式的, out of the box的, 短小而精悍的代码片段, 供大家欣赏, 感受一下JS的美好.


0. 向下取整最快方式

向下取整有很多方法, Math.floor, parseInt都可以, 不过两个非(~)运算符来取整是最方便的, 而且逻辑运算很快.

还可以用~~再加1来向上取整.

~~3.14
> 3
~~Math.PI
> 3
~~Math.E
> 2
~~12.98
> 12

1. 转数值类型最快方式

字符串转数字类型也有很多方式, parseFloat, Number(), 但官方推荐直接用一个加号(+)运算符, 是最快最简洁的.

+ new Date()
> 1559785422952
+'123'
> 123
+ {}
> NaN

2. 四舍五入

这个不算奇淫技巧了, 因为本身就与Math.round和toFixed(), 以及toPrecision来实现.

+Math.E.toFixed(0)
> 3
+Math.E.toFixed(1)
> 2.7
+Math.E.toFixed(2)
> 2.72

3. ===比==快

==和!=操作符会在需要的情况下自动转换数据类型。但===和!==不会,它们会同时比较值和数据类型, 避免了多余的计算,这也使得它们要比==和!=快。

现在人很少利用==来做类型转换了, JS也有往强类型发展的趋势.

4. 最安全的交换变量

如何不借助第三个变量(容器)交换2个变量a和b的内容呢? 最安全且最快的办法是利用异或门(^)来进行:

let a = 12;

let b = 123;

a = a ^ b;
b = a ^ b;
a = a ^ b;

a;

> 123

b;

> 12

可能有老师教用加法(+)来取代异或, 加法不仅慢而且容易产生溢出, 不安全, 所以不提倡加法交换. 异或或者同或才能实现在2个容器的情况下保证数据不丢失.

如果借助第三方存储空间老交换变量, 虽然性能不是最优, 看上去会比较直观一些, 最直观的写法是通过数组解构:

[a, b] = [b, a];

// 这样就无需注释了

5. 获取指定范围内均匀分布的随机数

let x = Math.random() * (max - min) + min;

如果需要正态分布, 可以在此基础改造...

6. 最快生成[1,2,3, .... ,n] 的列表

利用列表的下标index来生成数是非常快的.

Array(10).fill(true).map((x,i)=>i+1);
> (10) [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

还可以看出, 快速构建一个长度为n的列表可以使用Array(n).fill(1);

同理, 构造奇数偶数序列也可以通过这种方式, 还有很多基于自然数的有规律序列都可以这样生成.

7. 打乱列表

利用sort方法快速排序的时候引入一个随机量..嘿嘿

const list = [5, 458 , 120 , -215 , 228 , 400 , 122205, -85411];

list.sort(()=>Math.random()-0.5)
> (8) [120, 122205, 458, 400, 5, -215, -85411, 228]

8. 列表聚合

Array.prototype.reduce是一个对列表进行摘要的算法(输入多个元素, 输出一个值), 比如数值列表求和:

list.reduce((sum, curr)=>sum+curr,0)

9. 列表遍历取代循环语句

函数式编程中可以利用Array的forEach, map, filter, some, every, find来取代传统的for循环, while循环, 不仅更优雅, 而且提升了一定效率, 具体方式可以参考我之前的文章.

10. 最快构造一个循环链表

每次执行一下list.push(list.shift());然后访问list[0], 无需额外代码, 最直接实现循环链表, 帅!

const list = [5, 458 , 120 , -215 , 228 , 400 , 122205, -85411];

list.push(list.shift());
list[0];
> 458
list.push(list.shift());
list[0];
> 120
list.push(list.shift());
list[0];
> -215

重此以后再也不用判断index到头然后改成0了...

11. 字典的键值对取代switch语句

使用字典取代switch和if else语句也是函数式编程的理念之一.

const day = 'Monday';

({

'Monday':()=>{},

'Wednesday':()=>{},

'Friday':()=>{},

'default':()=>{},

})[ day || 'default' ];

超级实用的健康提示!

12. ES6,7,8,9,10,11一吨的语法糖

不说了, ecmascript有太多够骚的语法糖, 也许这就是前端社区钟爱JS的原因, 自己去MDN上寻找吧.

13. JS自以为是的Truthy和Falsy

Truthy (真值)指的是在 布尔值 上下文中转换后的值为真的值。所有值都是真值,除非它们被定义为 falsy (即除了 false0""nullundefined 和 NaN 外)。

JS 中的真值示例如下(将被转换为 true,if 后的代码段将被执行):

if (true)
if ({})
if ([])
if (42)
if ("foo")
if (new Date())
if (-42)
if (3.14)
if (-3.14)
if (Infinity)
if (-Infinity)

falsy(虚值)是在 Boolean 上下文中已认定可转换为‘假‘的值.

在需要用到布尔类型值的上下文中使用强制类型转换(Type Conversion )将值转换为布尔值,比如:在条件语句或者循环语句中

JavaScript中falsy值的例子 (通过 if 代码段将falsy值转换为false):

if (false)
if (null)
if (undefined)
if (0)
if (NaN)
if ('')
if ("")
if (document.all)

然而我不推荐在生产环境下利用逻辑或和逻辑与来判断truthy和falsy, 因为有时候人认为0是有意义的, 而[]是无意义的, 然而在JS里面, 对0和[]的真值判断是相反的.

14. 利用Set对列表去重

[...new Set([42, 'foo', 42, 'foo', true, true])]
> (3) [42, "foo", true]

15. 自定义toJSON方法(fuck原型)

将标准库的一些构造函数给他们赋予toJSON方法, 这样在JSON.stringify的时候就可以生成定制的json,而不是空的了, 这在http传输的时候会非常有用.

Date.prototype.toJSON = function () {

return this.getTime();

}

Function.prototype.toJSON = function () {

return this.toString();

}

RegExp.prototype.toJSON = function () {

return this.toString();

}

JSON.stringify([new Date(),Array, /.*/]);
> "[1559795757062,"function Array() { [native code] }","/.*/"]"

16. 使用getter和setter实现dom数据绑定

传送门: getter, setter

17. 使用模板字符串实现html和css的模板引擎

const unfold = list => list.map(li => `

<li>${li.name}</li>`).join('');

// 导出模块

module.exports = data => `

<html lang="en">

<head>

<title>${data.title}</title>

</head>

<body>

<h1>${data.h1}</h1>

<ul>${unfold(data.list)}</ul>

</body>

</html> `;

上面的node模块就是HTML的模板引擎, 可以完美的替代市面上的各种产品包括ejs,php,jsp以及Vue脚手架等, 最开心的是不用去学习他们的语法, 利用ES6的模板字符串就可以定制自己喜欢的语法.

同理, CSS和其他类型的标记语言, 都可以通过这种方式而不需要依赖于第三方包.

18. 串行执行动态promise集

并行执行promise很简单,只要使用Promise.all方法就行了,但有没有Promise.sequential呢,也就是串行执行,其实是可以的,要利用Array.prototype.reduce方法来构造一个promise链:

taskList.reduce(async (chain, next) => {

await chain;

return next();

}, Promise.resolve());


最后更新: 2019年09月01日12:49:59

JS高端奇淫技巧(持续更新)相关推荐

  1. 【JavaScript】转载:JS高端奇淫技巧

    转自 : https://blog.csdn.net/github_38885296/article/details/91038735 感谢作者(流浪的狗和一坨屎)分享 众所周知, JavaScrip ...

  2. HTML, CSS. JS的各种奇淫技巧

    1. js 中为了省字节,性能, 防止被重写等发明了各种写法,记录下 1 //取整 2 parseInt(a,10); //Before 3 Math.floor(a); //Before 4 a&g ...

  3. 漏洞挖掘中的各种奇淫技巧(持续更新...)

    漏洞 URL跳转漏洞 挖洞技巧:如何绕过URL限制 URL跳转漏洞学习 URL重定向漏洞解析 支付漏洞 挖洞技巧:支付漏洞之总结 SRC众测挖洞之支付逻辑漏洞的奇淫技巧 验证码类 挖洞技巧:绕过短信& ...

  4. JavaScript奇淫技巧:把JS编译成exe

    JavaScript奇淫技巧:把JS编译成exe 本文,介绍一种一般人不知道的技术:把JS代码编译成exe,而且不使用第三方工具,仅用系统工具完成. 第一:工具准备 编译JS代码,使用一个名为jsc. ...

  5. JS奇淫技巧:挑战前端黑科技,数值的七种写法,能全看懂的一定是高手

    JS奇淫技巧:数值的七种写法 JS奇淫技巧:挑战前端黑科技,数值的七种写法,能全看懂的一定是高手 你知道吗?在JS编程中,数值可以有很多种写法. 第一种写法: 一般情况而言,数值就是数值. 比如: v ...

  6. 前端js奇淫技巧(一)

    很多前端只会谢谢页面,一让他们接触js,就非常害怕. 我想有的东西,你越害怕,就越要了解它,读懂它,就会发现它还有你不知道的那一面美好. 好的,直入主题,直接说说js相关的一些奇淫技巧. 一.运算相关 ...

  7. 50个Pandas的奇淫技巧:向量化字符串,玩转文本处理

    大家好,我是小伍哥. 数据处理,也是风控非常重要的一个环节,甚至说是模型成败的关键环节.因此,娴熟简洁的数据处理技巧,是提高建模效率和建模质量的必要能力.这里开个专题,总结下Pandas的使用方法,方 ...

  8. SRC众测挖洞之支付逻辑漏洞的奇淫技巧

    文章目录 前言 巧用支付页面 低价签约漏洞 低价会员升级 循环利用优惠券 并发请求测试 并发领取奖品 并发多次签到 并发转账提现 其他支付漏洞 异常支付金额 金额数量溢出 更多支付漏洞 总结 前言 最 ...

  9. JavaScript奇淫技巧:压缩并加密图片

    本文将用JavaScript实现两个颇有技术含量的功能:压缩图片.加密图片. 直入正题: 一.压缩图片 压缩原理: 将图片读入canvas,并使用canvas的toDataURL方法将图片base64 ...

最新文章

  1. 计算机网络知识点4——计算机网络性能
  2. 【网络安全】红蓝攻防:shellcode的分析
  3. core dump 崩溃分析
  4. 【Programming Clip】06、07年清华计算机考研上机试题解答(个别测试用例无法通过)...
  5. 删除Windows 7自动创建的隐藏分区
  6. python seo百度_Python与seo,百度关键词相关搜索关键词采集源码
  7. javaScript入门
  8. java代码c3p0连接池配置,c3p0连接池acquireincrement属性配置详解
  9. 打砖块游戏源文件_大家无聊的话不如来玩玩这些小游戏
  10. CodeIgniter框架源码学习之安全类--Security.php
  11. Axure chrome插件安装
  12. RISC-V MCU低功耗场景的应用分析
  13. 教你怎么使用python批量下载图片
  14. 2023最新淘宝天猫商品销量,宝贝详情,店铺列表信息分析
  15. 很牛的几篇圈内爆料——影视圈
  16. html中repeat的作用,html中hover和no-repeat
  17. python实现动态壁纸_70 行 python 代码实现壁纸批量下载
  18. python程序填空_python练习题-基础巩固-第一周
  19. 周志朋java_java中堆和垃圾回收机制的介绍
  20. linux修改二进制文件

热门文章

  1. 前端怎么把px单位换成rem单位解决项目页面适配问题
  2. 微信小程序,大多数人都搞错的八个问题
  3. Vscode+Latex 添加引用文献及自动刷新
  4. 一个软件实施人员的自我评价(一)
  5. 苹果应用商店登陆服务器出现问题,这几天苹果应用商店登录不上,请问怎么回事?...
  6. python交互界面制作_Python 如何编写交互界面?_后端开发
  7. mongodb评论功能实现
  8. mysql线上教程_线上环境mysql主从同步的搭建过程
  9. c++整蛊小程序(让他的鼠标不听使唤)医院wifi很快!
  10. MySQL总结(四)——MySQL中sql语句的执行过程