1. 程式人生 > >[轉載]阿里前端筆試總結

[轉載]阿里前端筆試總結

a.length === 0 ? a.push(1) : a.shift();
2.下面程式碼會輸出什麼:
1. var test = (function(a) {
2.     this.a = a;
3.     return function(b) {
4.         return this.a + b;
5.     }
6. } (function(a, b) {
7.     return a;
8. }(1, 2))); 
9.
10. console.log(test(4)); //輸出什麼????
首先, 這裡麵包括了自執行函式還有閉包的概念, 因為第1行到第5行的匿名函式中涉及到了閉包, 所以在第3行return的匿名函式是可以使用外部變數a的, 因此第2行的this.a和第4行的this.a裡面儲存的值是一樣的. 

接著從第6行開始又有一個自執行的匿名函式, 也就是說宣告的同時(即使不呼叫)也會立即執行, 而這個函式返回的是第8行傳入引數中的第一個引數1. 這裡返回的1將會作為引數傳入到第一個匿名函式, 因此執行完第二行後this.a = a後this.a的值就變成1了. 然後返回一個匿名函式

function(b){return this.a + b;}

接著通過第1行程式碼將變數test指向這個匿名函式. 因此在第10行執行test(4)時, 就是執行返回的匿名函式, 4也就是對應函式中的引數b, 最終this.a為1, b位4, this.a+b得到的結果就是5了.

3.請把<ul><li>第1行</li><li>第2行</li>...</ul>(ul之間有10個li元素)插入body裡面,注意:需要考慮到效能問題 分析:這題主要考察了dom操作。插入節點操作的可以使用insertBefore和appendChild方法,隨便用一個都行。但是,題目要求要考慮效能問題,這才是關鍵,因為,JavaScript操作dom的開銷是很大的!提高效能就要減少dom操作。因此,我當時使用了下面的方法,只操作一次dom就夠的了:
複製程式碼
var lis = "",
ul = document.createElement("ul");
 
//把li以字串形式生成
for(var i = 1; i <= 10; i++) {
    lis += "<li>第" + i + "行</li>";
}
 
// 最後通過innerHTML插入ul裡面
ul.innerHTML = lis;
 
//這裡才操作dom,把ul插入到body
document.body.appendChild(ul);
複製程式碼 除了上面程式碼中的方式 ( 稱為字串累加方式 ) 外, 我還使用了另外兩種方式, 包括最傳統的for迴圈還有使用documentFragment(文件片段)來實現, 使用documentFragment實現的程式碼如下: