[].forEach.call($$("*"),function(a){a.style.outline="1px solid #"+(~~(Math.random()*(1<<24))).toString(16)})
首先咱们把代码格式化一下:git
[].forEach.call($$("*"), function(a){ a.style.outline="1px solid #"+(~~(Math.random()*(1<<24))).toString(16) } )
一、选取页面全部DOM
元素$$()
至关于document.querySelectorAll()
,返回的是一个NodeList
对象数组,现代浏览器几乎都支持
二、循环遍历DOM
元素$$("*")`将全部的`DOM`元素转化为`NodeList`对象,但这并非一个JS数组,因此不能直接使用`$$("*").forEach()
方法来进行迭代,可是咱们能够经过call
或apply
方法来使用forEach
[].forEach.call
等价于Array.prototype.forEach.call
,不过前者字节数更少
三、给元素添加outline
为何不使用border
而是使用outline
的缘由在于:border
在CSS盒子模型
以内,会影响页面的总体布局,而outline
在CSS盒子模型
以外,不会影响到页面的布局
四、生成随机颜色函数github
(~~(Math.random()*(1<<24))).toString(16)
随机颜色区间:数组
最小:
000000
,转为十进制为0
最大:ffffff
,转为十进制为256*256*256 = 16777216 = (1<<24)
浏览器
Math.random()
返回0~1的浮点数,Math.random()*(1<<24)
返回的的便是(0,16777216)
之间的浮点数,使用~~
去除浮点数的小数部分,再经过toString(16)
就转化为十六进制的颜色值了app
原文连接:https://gist.github.com/addyo...dom
(!(~+[])+{})[--[~+""][+[]]*[~+[]]+~~!+[]]+({}+[])[[~!+[]]*~+[]]
上面一行神奇的代码,执行效果却出人意料,请看下图:函数
主要涉及到的知识点是JS运算的优先级
以及JS的类型转换
补充知识:布局
`~~`位运算符,进行类型转换,转换成数字,等同于`Math.floor()`,将浮点数变成整数 首先咱们看`(!(~+[])+{})` `+[]` => `+""` => `0` `~+[]` => `-1` `!(~+[])` => `false` `(!(~+[])+{})` => `"false[object Object]"` 接着看`[--[~+""][+[]]*[~+[]]+~~!+[]]` `[+[]]` => `[0]` `[~+""]` => `[~0]` => `[-1]` `[~+""][+[]]` => `[-1][0]=>-1` `--[~+""][+[]]` => `-2` `[~+[]]` => `[-1]` `--[~+""][+[]]*[~+[]]` => `-2*[-1]` => `2` `~~!+[]` => `~~!0` => `~~true` => `1` `[--[~+""][+[]]*[~+[]]+~~!+[]]` => `[2+1]` => `[3]` 这样左侧`(!(~+[])+{})[--[~+""][+[]]*[~+[]]+~~!+[]]` => `"false[object Object]"[3]` => `"s"` 再看右侧`({}+[])[[~!+[]]*~+[]]` `({}+[])` => `"[object Object]"` `[~!+[]]` => `[~!0]` => `[~true]` => `[-2]` `~+[]` => `-1` `[[~!+[]]*~+[]]` => `[[-2]*-1]` => `[2]` `({}+[])[[~!+[]]*~+[]]` => `"[object Object]"[2]` => `"b"`