1. 說說你對作用域鏈的理解?
作用域鏈的作用是保證執行環境裡
有權訪問的變數和函式是有序的,
作用域鏈的變數只能向上訪問,
變數訪問到window物件即被終止,
作用域鏈向下訪問變數是不被允許的;
作用域就是變數與函式的可訪問範圍,
即作用域控制著變數與函式的可見性
和生命週期。
2. 請說說JavaScript原型,原型鏈 ?
原型:
當我們訪問一個物件的屬性時,
每個物件都會在其內部初始化一個屬性,
就是prototype(原型);
原型鏈:
如果這個物件內部不存在這個屬性,
那麼他就會去prototype裡找這個屬性,
這個prototype又會有自己的prototype,
於是就這樣一直找下去,
也就是我們平時所說的原型鏈;
兩者關係:
instance.constructor.prototype = instance.__proto__
3. 請解釋什麼是事件代理?
事件代理(Event Delegation),
又稱之為事件委託。
是 JavaScript 中常用繫結事件
的常用技巧。
“事件代理”即是把原本需要繫結
的事件委託給父元素,讓父元素
擔當事件監聽的角色。
事件代理的原理是DOM元素的事件冒泡。
使用事件代理的好處是可以提高效能,
可以大量節省記憶體佔用,減少事件註冊,
比如在ul上代理所有li的click事件;
此外, 還可以實現動態新增子物件時無需
再次對其繫結事件。
4. new操作符具體完成了哪幾個操作?
1) 建立一個空物件, 定義this 變數引用該物件, 同時還繼承了該函式的原型; 2) 屬性和方法被加入到 this 引用的物件中; 3) 新建立的物件由 this 所引用, 並且最後隱式的返回 this
5. 說幾條寫JavaScript的基本規範?
1) 不要在同一行宣告多個變數; 2) 請使用===/!==來比較true/false或者數值; 3) 使用物件字面量替代new Object這種形式; 4) 減少使用全域性函式, 全域性變數; 5) switch語句必須帶有default分支; 6) if語句必須使用大括號; 7) for-in迴圈中的變數; 應該使用var關鍵字明確限定作用域; 從而避免作用域全域性汙染。
6. 如何判斷一個物件是否為陣列?
function isArray(arg) { if (typeof arg === `object`) { return Object.prototype.toString.call(arg) === `[object Array]`; } return false; }
7. 氣泡排序?
思路: 每次比較相鄰的兩個數, 如果後一個比前一個小,換位置; var arr = [2, 0, 1, 9, 8, 7, 3]; function bubbleSort(arr) { for (var i = 0; i < arr.length - 1; i++) { for(var j = 0; j < arr.length - 1; j++) { if(arr[j + 1] < arr[j]) { var temp; temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } return arr; } console.log(bubbleSort(arr));
8. 快速排序?
思路: 採用二分法,取出中間數, 陣列每次和中間數比較, 小的放到左邊,大的放到右邊; var arr = [2, 0, 1, 9, 8, 7, 3]; function quickSort(arr) { if(arr.length == 0) { return []; // 返回空陣列 } var cIndex = Math.floor(arr.length / 2); var c = arr.splice(cIndex, 1); var l = []; var r = []; for (var i = 0; i < arr.length; i++) { if(arr[i] < c) { l.push(arr[i]); } else { r.push(arr[i]); } } return quickSort(l).concat(c, quickSort(r)); } console.log(quickSort(arr));