面试题

150 阅读2分钟
  1. position的默认值是什么?relative和absolute有什么区别?

    • position的默认值是static。
    • relative相对定位,相对于标准文档流位置进行定位;
    • absolute绝对定位,脱离标准文档流,相对于static定位以外的第一个父元素进行定位;
    • fixed固定定位,相对于浏览器窗口进行定位;
  2. JS判断变量为数组你能写出哪些方法?JS有哪些创建对象的方式?

      1. typeof检测(这个办法并不能实时的检测出是否是数组,只能判断其类型,所以说typeof判断基本类型数据还是挺好的,但是不能准确测试出是否是数组)
      • typeof 一般被用于判断一个变量的类型,我们可以利用 typeof 来判断number, string, object, boolean, function, undefined, symbol 这七种类型
    let ary = [12,25,24];
    console.log(typeof(ary)); // 输出"object"
    
      1. instanceof 判断(从输出的效果来看,还是挺令人满意的,能准确的检测出数据类型是否是数组,但是有缺点,比如判断一个数组,他可以被 instanceof 判断为 Object。)
    • instanceof 主要的实现原理就是只要右边变量的 prototype 在左边变量的原型链上即可。
    let arr = [12,23,14,24];
    console.log(arr instanceof Array); // 输出true
    console.log(arr instanceof Object); // 输出true
    
      1. 原型链方法
    • 这个是有兼容的哦,在IE早期版本里面__proto__是没有定义的哦~而且,这个仍然有局限性
    let ary = [1,23,4];
    console.log(ary.__proto__.constructor==Array);//true
    console.log(ary.constructor==Array)//true 这两段代码是一样的
    
    • 总结一下第2种方法和第3种方法局限性

    instanceof 和constructor判断的变量,必须在当前页面声明的,比如,,一个页面(父页面)有一个框架,框架中引用了一个页面(子页面),在子页面中声明了一个ary,并将其赋值给父页面的一个变量,这时判断该变量,Array == object.constructor;会返回false;

    • 原因
      1. Array属于引用型数据,在传递过程中,仅仅是引用地址的传递。
      2. 每个页面的Array原生对象所引用的地址是不一样的,在子页面声明的array,所对应的构造函数,是子页面的Array对象;父页面来进行判断,使用的Array并不等于子页面的Array;切记,不然很难跟踪问题!

    作用域面试题

    // 第一题
    var number = 50;
        var obj = {
            number: 60,
            getNum: function () {
                var number = 70;
                return this.number;
            }
        }
    
        console.log(obj.getNum());  // 输出60
        console.log(obj.getNum.call()); // 输出50
        console.log(obj.getNum.call({ number: 20 }));  // 输出20
    // 第二题
    for (var i = 0; i < 5; i++) {
            (function() {
                setTimeout(function() {
                    console.log(i); // 输出 5个5
                }, i * 1000);
            })(i);
        }
    // 第三题
        var y = 10;
        if(!(x in window)) {
            var x = 10;
        } else {
            ++ y;
        }
        console.log(x); // undefined
        console.log(y); // 11