欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

撩课-Web大前端每天5道面试题-Day8

程序员文章站 2023-03-31 16:16:52
1. 说说你对作用域链的理解? 2. 请说说JavaScript原型,原型链 ? 3. 请解释什么是事件代理? 4. new操作符具体完成了哪几个操作? 5. 说几条写JavaScript的基本规范? 6. 如何判断一个对象是否为数组? 7. 冒泡排序? 8. 快速排序? ......

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));