2017面试题2

1、用两个栈实现一个队列

转载:http://www.cnblogs.com/wanghui9072229/archive/2011/11/22/2259391.html

思路

  入队:将元素进栈1;
  出队:判断栈2是否为空,如果为空,则将栈1中所有元素pop,并push进栈2,栈2出栈; 如果不为空,栈2直接出栈。

 

大多数人的思路是:始终维护s1作为存储空间,以s2作为临时缓冲区。

入队时,将元素压入s1。

出队时,将s1的元素逐个“倒入”(弹出并压入)s2,将s2的顶元素弹出作为出队元素,之后再将s2剩下的元素逐个“倒回”s1。

见下面示意图:

2Stacks1Queue

2个栈都为空的时候,出队操作一定会引起异常)

2、javascript中的深拷贝和浅拷贝

链接:https://www.zhihu.com/question/23031215/answer/124017500

1,对于字符串类型,浅复制是对值的复制,
对于对象来说,浅复制是对对象地址的复制,并没 有开辟新的栈,也就是复制的结果是两个对象指向同一个地址,修改其中一个对象的属性,则另一个对象的属性也会改变,
而深复制则是开辟新的栈,两个对象对应两个不同的地址,修改一个对象的属性,不会改变另一个对象的属性。

3、
    var callbacks = []
    for(var i =0;i<3;i++){
        callbacks.push(function(){
            console.log(i)
        })
    }
    callbacks.forEach(cb => cb());

结果 3 3 3.

4、javascript 如何判断变量foo类型是不是

String? typeof foo === "string"

Number? typeof foo === "number"

Date? Object.prototype.toString.call(foo) === '[object Date]'

Array? Object.prototype.toString.call(foo) === '[object Array]'

Object?  Object.prototype.toString.call(foo) === '[object Object]'

5 如下代码

    function doSomething() {
        console.log(this)
    }
    var obj = {
        doSomething2: doSomething
    }
    var doSomething3 = doSomething
    var doSomething4 = obj.doSomething2

    // 请描述this
    doSomething() //Window
    obj.doSomething2() // Object
    doSomething3() // Window
    doSomething4() // Window
    doSomething4.apply("abc",[obj]) // String

6 请填写输出结果

    function print(num) {
        console.log(num);
    }
    print(1)
    setTimeout(function(){print(2)},100)
    print(3)
    setTimeout(function(){print(4)},0)

    // 1 3 4 2

 7、假设一个极大的对象数组(比如100万)主键id ,如果要频繁的查找元素,如何才能最快的查找到

 

8、关于dtd 你知道哪些

9、css选择器有哪些,css3新增伪类举例

10、ajax 请求post 和get区别解释jsonp原理。

  jsonp原理:能利用scrip标签src的属性来实现跨域。通过前端方法,作为参数传递给服务器,服务区注入参数后再返回,就是服务器提供一个回调函数,用来接受

  json数据,再浏览器执行,并处理要过来的数据。

区别:

  get 使用url和cookie传参,post将参数数据放在body中

  GET的URL会有长度上的限制,则POST的数据则可以非常大。

  POST比GET安全,因为数据在地址栏上不可见

  GET请求的参数会保存在浏览器的历史记录中

11、继承几种方式

    // 原型链继承和构造函数继承
    function Parent(age) {
        this.name = ["mike", "jack"];
        this.age = age;
    }

    Parent.prototype.run = function() {
        return this.name = "are both" + this.age;
    }

    function Child(age) {
        Parent.call(this, age);
    }

    Child.prototype = new Parent();
    // 寄生组合继承
    function object(o) {
        function F() {}
        f.prototype = o;
        return new F();
    }

    function inheritPrototype(sub, sup) {
        var prototype = object(sup.prototype);
        prototype.constructor = sub;
        sub.prototype = prototype;
    }
    function extend(sub, sup) {
        // 目的: 实现只继承父类的原型对象
        var F = new Function(); // 1 创建一个空函数    目的:空函数进行中转
        F.prototype = sup.prototype; // 2 实现空函数的原型对象和超类的原型对象转换
        sub.prototype = new F(); // 3 原型继承 
        sub.prototype.constructor = sub; // 4还原子类的构造器
        //保存一下父类的原型对象: 一方面方便解耦  另一方面方便获得父类的原型对象
        sub.superClass = sup.prototype; //自定义一个子类的静态属性 接受父类的原型对象
        //判断父类的原型对象的构造器 (加保险)
        if (sub.prototype.constructor == Object.prototype.constructor) {
            sup.prototype.constructor = sup;
        }
    }

 12、一个页面从输入 URL 到页面加载完的过程中都发生了什么事情

posted @ 2017-07-24 00:34  五艺  阅读(236)  评论(0编辑  收藏  举报