谷歌某大佬通过一行知识量包含极丰富的 js 代码实现了一个魔法小功能:给页面所有元素加一个彩色外边框

[].forEach.call($$("*"), function (a) {
  a.style.outline =
    "1px solid #" + (~~(Math.random() * (1 << 24))).toString(16);
});

单行形式:

[].forEach.call($$("*"), function (a) {
  a.style.outline =
    "1px solid #" + (~~(Math.random() * (1 << 24))).toString(16);
});

将其贴到 chrome 的 console 中即可看到效果

代码解析

$$("*");
document.querySelectorAll("*");
document.all;

以上三种写法是相同效果,都相当于通过选择器的方式获取页面所有元素。第三种是较不规范的方式,不建议使用。$$是现代浏览器API的一部分,比如$$(‘a’)可以获取页面所有的 a 标签元素

接下来,通过上面选择器获取到的是一个 NodeList,是一种类似于数组 Array,但它并未实现很多 Array 的接口,所以不能使用$$(’*’).forEach 来遍历结果,类似的还有 arguments,也是类似于 Array,但并不是数组

这时需要通过 call()或者 apply()可以使得非数组对象来调用数组的方法

[].forEach.call($$("*"), function (e) {});

以上即实现了遍历页面的每一个元素,并可以将获得的非数组元素使用数组的遍历方法来取到每一个元素 e

a.style.outline = "1px solid #" + color;

outline 是 CSS 的一个属性,它是在 CSS 盒模型以外,所以它不会影响元素的 size 以及元素在 larout 中的 position

color = (~~(Math.random() * (1 << 24))).toString(16);
1<<24 == 1左移24位 == 2^24 == 16777216
parseInt("ffffff", 16) == 16777215 = 16777216 - 1 = 2^24 - 1

Math.random()得到的是 0.0~1.0 之间的伪随机数

Math.random() * (1«24)得到 0.0~16777216.0 之间的随机浮点数

~操作符(tlide operator)可将一个变量按位取反,使用~操作符可以得到浮点数的整数部分,此处用~~达到 parseInt 的效果

toString(16)可将变量转换为 16 进制的数

综上:(~~(Math.random()*(1«24)).toString(16))可以获得(000000,ffffff)之间的一种随机颜色

END

附上大佬的博客Addy Osmani并献上双膝

以及本文学习源 http://arqex.com/939/learning-much-javascript-one-line-code