前端題目(2)(有坑)
1.
sass和scss的區別
scss是sass的新語法,是相容css3的
與sass的語法基本相同,只是sass是利用縮排和換行。但是scss是利用 {} 和 ;
View Code
2.
選擇第奇數個為p的子標籤
p:th-child(2n -1)
這裡n是從1開始的,任何規則n都是從1開始的
View Code
3.
css如何禁止使用者選擇網頁文字
{ user-select: none; }View Code
為滑鼠選中的文字設定背景和字型樣式
div::selection{ color:red; background-color:#333; }View Code
4.
事件流的三個階段
1.事件捕獲階段 先是父元素觸發事件,目標元素也會被觸發
2.目標階段 目標元素事件執行階段
3.事件冒泡階段 目標元素觸發事件冒泡到父元素
box.addEventListener('click',function(event){},false)
接收的第三個引數,傳遞布林型別,如果是false的話,是冒泡(預設就是false),如果是true就是捕獲
不是所有的事件都可以冒泡
阻止冒泡的方式 event.stopPropagation()
View Code
5.
var a = 0.3 a- 0.1 == 0.2 // false parseFloat('0' + a , 8) !== 0.3 // false !!~(a-a) // false
因為js的計數標準採用的是IEEE754的方式,採用64位來儲存浮點數
在這裡0.1轉化成二進位制是無限迴圈的,儲存時,一定會超出範圍,一定會捨去一部分,然後在計算過程中可能也會存在超出範圍,導致舍入的情況
在parseInt()中接收兩個引數,第一個引數就是傳值,第二個引數是告訴我們,前面這個數是以幾進位制的形式傳遞的
但是在這裡parseFloat()中,傳遞的第二個引數是沒有意義的。
最後是按位取反(坑)
6.
1 var a = 0 2; (function () { 3 var a = { a: 1 } 4 var b = function () { 5 setTimeout(() => { 6 console.log(this.a) 7 },0) 8 } 9 b() 10 b.call(a) 11 a = { a: 3 } 12 a.a = 2 13 })() 14
setTimeout中this指向的問題,因為setTimeout的執行環境與所在環境是分離的,在非嚴格模式下this指向window。
所以第一個b執行this指向window, 所以列印的是0
第二個的執行是修改了b函式中的this指向了a,通過這個方式,是可以修改setTimeout的this指向的。
如果是setTimeout.call()這種方式來修改的this,是沒有效果的
但是要注意的是setTimeout是一個非同步的函式,這個非同步函式被放到了非同步事件佇列中,等到執行棧中的程式碼執行完了之後才執行。
特別注意:此時a物件已經被傳入到setTimeout中了。
11行對a的修改時修改了a的地址,所以是不會對傳入的a物件有影響的。這兩個a都是不同的地址。
但是如果把11行和12行的程式碼換一下位置,a.a = 2對a的修改是會作用到setTimeout中的a物件上的,因為此時兩個a是指向同一個物件上的。
所以此時列印的是1,如果11行和12行交換位置,列印的就是2
7.
1 function foo(){ 2 } 3 foo.name = 'kk' 4 console.log(foo.name) 5 console.log(foo.age) 6 foo.age = 123 7 console.log(foo.age)
可以通過 . (點)來給函式新增屬性,之前foo上沒有age這一屬性,所以第5行列印:undefined。第六行又設定了之後,就可以獲取了。第七行列印:123
但是name屬性是函式上不能更改的,所以即使第3行修改了name屬性值,但是第4行還是列印foo
如若有誤,請務必指正