1. 程式人生 > 實用技巧 >前端題目(2)(有坑)

前端題目(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

如若有誤,請務必指正