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));
复制代码