原文出處:伯樂在線
[].forEach.call($$(""),function(a){ a.style.outline="1px solid #"+(~~(Math.random()*(1<<24))).toString(16); })
這行代碼獲取了頁面中所有元素,然后給它們加上1px,顏色隨機的邊框
1. 選取一個頁面上所有的元素
$$ 函數是現代瀏覽器命令行的API的一部分,它等同於使用 document.querySelectorAll 方法。可以將一個CSS選擇器作為參數傳入 document.querySelectorAll 去選取當前頁面的元素。所以如果想在瀏覽器的控制台以外使用那個單行代碼,可以用 document.querySelectorAll('*') 來替代 $$('*')
單行代碼用 [].forEach.call 來替代 Array.prototype.forEach.call 。通過Array對象 [] 去調用Array的函數這樣的方式,節省了一些字節。這相當於在 $$('*').forEach 中,把 $$('*')
當成一個Array來使用。
2. 給元素上色
為了使這些元素都有漂亮的邊框,代碼使用了CSS的 outline 屬性。顯示的邊框是在CSS區塊模型外的,它並不對元素本身在布局中的大小和位置產生任何影響,因此該屬性非常適合用來實現當前的需求。 它的語法就像border的一樣:
a.style.outline="1px solid #" + color
3. 定義顏色的方式
~~(Math.random()*(1<<24))).toString(16)
因為 Math.random 返回的值是浮點數,而顏色只需要整數部分。這里使用了波浪符號( ~)去實現。波浪符號用於對一個變量按位取反(作用可以記為把數字取負然后減一)。代碼重點不在於按位取反,而在於利用位操作符會丟棄浮點數中的小數部分的特性,因此連續兩次按位取反是一個替代 parseInt 的便捷方法:
var a = 12.34, // ~~a = 12 b = -1231.8754, // ~~b = -1231 c = 3213.000001; // ~~c = 3213 ~~a == parseInt(a, 10); // true ~~b == parseInt(b, 10); // true ~~c == parseInt(c, 10); // true