吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 8802|回复: 35
收起左侧

[其他转载] JS高端奇淫技巧(持续更新)

  [复制链接]
重生sama 发表于 2019-6-13 19:46
本帖最后由 重生sama 于 2019-6-15 16:24 编辑

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



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


[JavaScript] 纯文本查看 复制代码
~~3.14

> 3

~~Math.PI

> 3

~~Math.E

> 2

~~12.98

> 12




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


[JavaScript] 纯文本查看 复制代码
+ new Date()

> 1559785422952

+'123'

> 123

+ {}

> NaN



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


[JavaScript] 纯文本查看 复制代码
[mw_shl_code=javascript,true]+Math.E.toFixed(0)

> 3

+Math.E.toFixed(1)

> 2.7

+Math.E.toFixed(2)

> 2.72
[/mw_shl_code]


3. ===比==快
[JavaScript] 纯文本查看 复制代码
==和!=操作符会在需要的情况下自动转换数据类型。但===和!==不会,它们会同时比较值和数据类型, 避免了多余的计算,这也使得它们要比==和!=快。
现在人很少利用==来做类型转换了, JS也有往强类型发展的趋势.



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


[JavaScript] 纯文本查看 复制代码
let a = 12;

let b = 123;

a = a ^ b;

b = a ^ b;

a = a ^ b;

a;[/font]
[font=微软雅黑]
> 123[/font]
[font=微软雅黑]
b;

> 12



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


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


[JavaScript] 纯文本查看 复制代码
[a, b] = [b, a];

// 这样就无需注释了



5. 获取指定范围内均匀分布的随机数
[JavaScript] 纯文本查看 复制代码
let x = Math.random() * (max - min) + min;



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


6. 最快生成[1,2,3, .... ,n] 的列表
利用列表的下标index来生成数是非常快的.


[JavaScript] 纯文本查看 复制代码
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方法快速排序的时候引入一个随机量..嘿嘿


[JavaScript] 纯文本查看 复制代码
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是一个对列表进行摘要的算法(输入多个元素, 输出一个值), 比如数值列表求和:


[JavaScript] 纯文本查看 复制代码
list.reduce((sum, curr)=>sum+curr,0)



9. 列表遍历取代循环语句
函数式编程中可以利用Array的forEach, map, filter, some, every, find来取代传统的for循环, while循环, 不仅更优雅, 而且提升了一定效率。


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


[JavaScript] 纯文本查看 复制代码
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语句也是函数式编程的理念之一.


[JavaScript] 纯文本查看 复制代码
const day = 'Monday';

({

  'Monday':()=>{},

  'Wednesday':()=>{},

  'Friday':()=>{},[/font]
[font=微软雅黑]
  'default':()=>{},

})[ day || 'default' ];



超级实用的健康提示!


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


13. JS自以为是的Truthy和Falsy
Truthy (真值)指的是在 布尔值 上下文中转换后的值为真的值。所有值都是真值,除非它们被定义为 falsy (即除了 false,0,"",null,undefined 和 NaN 外)。


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


[JavaScript] 纯文本查看 复制代码
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(https://developer.mozilla.org/en-US/docs/Glossary/Boolean 上下文中已认定可转换为‘假‘的值.


在需要用到布尔类型值的上下文中使用强制类型转换(Type Conversion https://developer.mozilla.org/en-US/docs/Glossary/Type_Conversion)将值转换为布尔值,比如:在条件语句或者循环语句中


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


[JavaScript] 纯文本查看 复制代码
if (false)

if (null)

if (undefined)

if (0)

if (NaN)

if ('')

if ("")

if (document.all)



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


14. 利用Set对列表去重
[JavaScript] 纯文本查看 复制代码
[...new Set([42, 'foo', 42, 'foo', true, true])]

> (3) [42, "foo", true]



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


[JavaScript] 纯文本查看 复制代码
Date.prototype.toJSON = function () {

  return this.getTime();[/font]
[font=微软雅黑]
}

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(https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Functions/get, setter(https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Functions/set


17. 使用模板字符串实现html和css的模板引擎
[JavaScript] 纯文本查看 复制代码
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和其他类型的标记语言, 都可以通过这种方式而不需要依赖于第三方包.


免费评分

参与人数 23吾爱币 +26 热心值 +20 收起 理由
kittylang + 1 用心讨论,共获提升!
三木零 + 1 + 1 用心讨论,共获提升!
xiao_tk + 1 + 1 谢谢@Thanks!
Culaccino + 1 我很赞同!
太史子义慈 + 1 + 1 很有用,很牛逼
quanjianhao00 + 1 + 1 用心讨论,共获提升!
不知明 + 1 + 1 我很赞同!
yukuncc + 1 我很赞同!
kkkkk55 + 1 支持下大牛
落叶无殇 + 1 + 1 我很赞同!
hateyou030 + 1 我很赞同!
hhxlrm + 1 + 1 谢谢@Thanks!
kk1212 + 3 + 1 谢谢@Thanks!
jonasr + 1 + 1 谢谢@Thanks!
苏紫方璇 + 3 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
hwq + 1 + 1 谢谢@Thanks!
无辰 + 1 + 1 牛逼啊老铁。
zchld + 2 + 1 高端
qiuxiaojun + 1 + 1 谢谢@Thanks!
悍匪戾 + 1 + 1 热心回复!
erh + 1 + 1 谢谢@Thanks!
www415 + 1 + 1 谢谢@Thanks!
hudongliang + 1 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

无辰 发表于 2019-6-14 10:16
本帖最后由 无辰 于 2019-6-14 10:21 编辑
Niuer 发表于 2019-6-13 23:13
function Driver()
{
var NumberA =0;var NumberB =0;

说下需求好吗,直接贴代码不知道你要干嘛。。。。。。
B在循环外面++??????
不知道你要干嘛。。。
NumberA在外面定义了就可以了,
for循环里面不用再次赋值
建议:
let B = 0;
for (let A =0; A < 2; A++){
  B++;
}
alert (“ABS-” + A + B + A);
os51 发表于 2019-6-13 21:44
0.
1.11 | 0 // 1
// Number 类型位运算缺点:不支持32位以上数字
// 4294967295.1 | 0 // -1
// ~~4294967295.1 // -1
//parseInt(4294967295.1) // 4294967295

6.
更快的方法:for 循环 (取决于js引擎优化)
更简洁的方法:Array.from({length: 23}, (_,i) => i + 1)
hudongliang 发表于 2019-6-13 19:57
songleyan 发表于 2019-6-13 19:57
看了标题才进来的
byvip231 发表于 2019-6-13 20:05
我去  开拓我的的思路
psx1lin 发表于 2019-6-13 20:21
有機會用看看
感谢楼主
www415 发表于 2019-6-13 20:35
先收藏了
澜海鱼 发表于 2019-6-13 21:36
感谢感谢!好用
澜海鱼 发表于 2019-6-13 21:40
希望快点更新
无辰 发表于 2019-6-13 21:54
要不开个群一起研究?
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-4-26 14:41

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表