一行能装逼的JavaScript代码的延伸
前段就是坑,入坑水真深。 先看看一个黑科技, 纳尼,这是什么东西。
(!(~+[])+{})[--[~+""][+[]]*[~+[]] + ~~!+[]]+({}+[])[[~!+[]]*~+[]]
贴入浏览器执行一看,你个XX,你给老子等着。。。。。。。
然并卵。
作为一般的青年就此笑过, 可是我不是一般的青年,我是二到无穷的青年。你给老子讲清楚你这sb怎么出来的.
在一行能装逼的JavaScript代码讲得灰常清晰和明白,但是个人觉得还可以补充和扩展,于是就有了这篇文章。
解析出这个SB还是先懂几个东西:
- 运算符的优先级
一行能装逼的JavaScript代码里面有解释,
这段装逼代码里面用的只有 ! () ~ + [] -- *
优先级别 [] () -- ~ ! * + - JS类型转换
一行能装逼的JavaScript代码里面有解释
减号-,乘号*,肯定是进行数学运算,所以操作数需转化为number类型
加号+,可能是字符串拼接,也可能是数学运算,所以可能会转化为number或string
一元运算,如+[],只有一个操作数的,转化为number类型
关于转换顺序
尝试使用ToPrimitive,转换为原始类型,
转换成功,返回值。
否则调用valueOf,如果返回是原始类型,返回
否则调用toString(),如果返回原型类型,返回
否则,抛出异常 - 一些特殊情况的加法
[] + [] // '' [] + {} // '[object Object]' {} + [] // 0 ({} + []) // '[object Object]' {} + {} // NaN ({} + {}) // '[object Object][object Object]'
{} + []中的第一个{}会被识别为代码块,被忽略掉,
+[]转换过程
[] 不是原始类型,调用valueOf
[].valueOf() 返回的依旧不是原始类型
[].toString() 返回"",
+""结果为0
({}+[])这里面 {} + [] 是作为表达式执行的,
{}最终转换为 "[object object]"
[]最终转换为 ""
相加为 "[object object]"
好,准备好这些只是之后,我们就可以来解读装逼,为了方便解读,
我写出每一步的解读, 来,一起装逼,一起飞。
const results = [ '(!(~+[])+{})[--[~+""][+[]]*[~+[]] + ~~!+[]]+({}+[])[[~!+[]]*~+[]]', // +[] ==> 0 '(!(~0)+{})[--[~+""][+[]]*[~+[]] + ~~!+[]]+({}+[])[[~!+[]]*~+[]]', // ~0 ==> -1 取反减1 '(!(-1)+{})[--[~+""][+[]]*[~+[]] + ~~!+[]]+({}+[])[[~!+[]]*~+[]]', // !(-1) ==> false '(false+{})[--[~+""][+[]]*[~+[]] + ~~!+[]]+({}+[])[[~!+[]]*~+[]]', // false+{} ==> "false[object object]" '"false[object object]"[--[~+""][+[]]*[~+[]] + ~~!+[]]+({}+[])[[~!+[]]*~+[]]', // +"" ==> 0 '"false[object object]"[--[~0][+[]]*[~+[]] + ~~!+[]]+({}+[])[[~!+[]]*~+[]]', // ~0 ==> -1 '"false[object object]"[--[-1][+[]]*[~+[]] + ~~!+[]]+({}+[])[[~!+[]]*~+[]]', // +[] ==> 0 '"false[object object]"[--[-1][0]*[~+[]] + ~~!+[]]+({}+[])[[~!+[]]*~+[]]', // +[] ==> 0 '"false[object object]"[--[-1][0]*[~0] + ~~!+[]]+({}+[])[[~!+[]]*~+[]]', // ~0 ==> -1 '"false[object object]"[--[-1][0]*[-1] + ~~!+[]]+({}+[])[[~!+[]]*~+[]]', // --[-1][0] ==> -2 '"false[object object]"[-2*[-1] + ~~!+[]]+({}+[])[[~!+[]]*~+[]]', // [-1] ==> "-1" '"false[object object]"[-2*"-1" + ~~!+[]]+({}+[])[[~!+[]]*~+[]]', // "-1" ==> 1 '"false[object object]"[-2*-1 + ~~!+[]]+({}+[])[[~!+[]]*~+[]]', // -2*-1 ==> 2 '"false[object object]"[2 + ~~!+[]]+({}+[])[[~!+[]]*~+[]]', // +[] ==> 0 '"false[object object]"[2 + ~~!0]+({}+[])[[~!+[]]*~+[]]', // !0 ==> true '"false[object object]"[2 + ~~true]+({}+[])[[~!+[]]*~+[]]', // ~true ==> -2 '"false[object object]"[2 + ~-2]+({}+[])[[~!+[]]*~+[]]', // ~-2 ==> 2 '"false[object object]"[2 + 1]+({}+[])[[~!+[]]*~+[]]', // 2+1 ==> 3 '"false[object object]"[3]+({}+[])[[~!+[]]*~+[]]', // "false[object object]"[3] ==> s '"s"+({}+[])[[~!+[]]*~+[]]', // {} ==> "[object object]" '"s"+("[object object]"+[])[[~!+[]]*~+[]]', // [] ==> "" [].toString() '"s"+("[object object]"+"")[[~!+[]]*~+[]]', // "[object object]"+"" ==> "[object object]" '"s"+"[object object]"[[~!+[]]*~+[]]', // +[] ==> 0 '"s"+"[object object]"[[~!0]*~+[]]', // !0 => true '"s"+"[object object]"[[~true]*~+[]]', // ~true ==> -2 '"s"+"[object object]"[[-2]*~+[]]', // +[] ==> 0 '"s"+"[object object]"[[-2]*~0]', // ~0 ==> -1 '"s"+"[object object]"[[-2]*-1]', // [-2] ==> "-2" '"s"+"[object object]"["-2"*-1]', // "-2" ==> 2 '"s"+"[object object]"[-2*-1]', // -2*-1 ==> 2 '"s"+"[object object]"[2]', // "[object object]"[2] ==> b '"s"+"b"', // "s" + "b" ==> "sb" '"sb"', ]; results.forEach( (v,i)=>{ (function(delay){ setTimeout(function(){ console.log(Date.now(), eval(v)) },delay*5) })(i) })
你会发现好多sb,哟, 你还真看到这里啊,说的就是你哦。 哈哈。
这些JavaScript编程黑科技,装逼指南,高逼格代码,让你惊叹不已
一行能装逼的JavaScript代码
JS中{}+[]和[]+{}的返回值情况是怎样的
What is {} + {} in JavaScript?
JavaScript中圆括号() 和 方括号[] 的特殊用法疑问?
javascript运算符——条件、逗号、赋值、()和void运算符
JavaScript values: not everything is an object
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Python程序设计思维练习---体育竞技分析
体育竞技分析:模拟N场比赛 计算思维:抽象 + 自动化 模拟:抽象比赛过程,自动模拟N场比赛,当N越大时,比赛结果分析越科学。 本次比赛规则:回合制,15分一局,先由一方发球,如胜利,则得1分并继续发球,如失败,则双方分数不改变并交换球权。球员AB的能力为0-1之间的一个数值 思维方式:自顶向下即将一个复杂问题分解成几个问题,再细分成一个个具体的小问题,从而来解决复杂问题。自底向上为自顶向下的逆过程,即解决复杂问题的方法,逐步解决一个个小问题,来达成目的。 1.将体育竞技分析分解为以下几个小步骤 1.1打印程序的介绍性信息式 1.2获得程序运行参数:probA(A的能力值),probB(B的能力值),n(比赛场次) 1.3利用球员AB的能力值,模拟n场比赛 1.4输出球员AB获胜的场次及概率 2.将各个步骤定义成函数来实现 分解 定义函数 3.完整代码 from random import random def printInfo(): # 打印程序介绍信息 print('这个程序模拟两个选手A和B的某种竞技比赛') print('程序运行需要A和B的能力值(以0到1之间的小数表示)'...
- 下一篇
Java实现把图片上传到图片服务器(nginx+vsftp)
前言: 在我另一篇笔记中已经记载了如何用nginx + vsftp搭建图片服务器(请参考nginx + vsftp搭建图片服务器),并且用vsftp的客户端工具filezilla测试过已经可用。但是在开发中应该是把用户在前端页面提交的图片保存到图片服务器中,接下来就来实现这个功能。点我下载源码。 需求: 用户在页面中上传一张图片,把图片保存到图片服务器,把图片的url保存到user表中,复制user表中的图片url在浏览器中可访问到用户上传的图片。 功能实现: 一、数据库设计: 图片发自简书App 二、项目设计: 为了快速开发,本案例使用springboot + mybatis实现。项目结构如下: 图片发自简书App 1、添加依赖: pom.xml: <!-- 文件上传 --> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.2</...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- CentOS7设置SWAP分区,小内存服务器的救世主
- 设置Eclipse缩进为4个空格,增强代码规范
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS6,CentOS7官方镜像安装Oracle11G
- Hadoop3单机部署,实现最简伪集群
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS7安装Docker,走上虚拟化容器引擎之路