前端面试4

2017-09-11  本文已影响22人  卡农me

1.箭头函数使用需要注意的地方
this、new、arguments

var arr = Array.prototype.slice.apply(arguments);

可以理解为arguments.slice()(当然arguments里面没有slice方法)

var arr = [...arguments];

3.rest参数
用于获取函数的多余参数,它是一个数组

add(...values){ } //values获取的是add的全部参数
add(arr, ...values){ }//values获取的是剩余的参数

注意:rest参数只能是最后一个参数,否则报错;
rest参数可替代arguments

//arguments变量的写法
const sortNum = () => Array.prototype.slice.call(arguments).sort();
//rest参数的写法
const sortNum = (...numbers) => numbers.sort();

4.扩展运算符...
作用:将数组转换为一个参数序列

//ES5的写法
var arr1 = [0,1,2];
var arr2 = [3,4,5];
Array.prototype.push.apply(arr1,arr2);
console.log(arr1);

打印: [0, 1, 2, 3, 4, 5]

//使用ES6
var arr1 = [0,1,2];
var arr2 = [3,4,5];
arr1.push(...arr2);
//ES5的写法
var arr1 = [0,1,2];
var arr2 = [3,4,5];

console.log(arr1.concat(arr2));

打印: [0, 1, 2, 3, 4, 5]

var arr1 = [0,1,2];
var arr2 = [3,4,5];
[arr1,...arr2];

应用:

const [first, ...rest] = [1,2,3,4,5];
first //1
rest //[2,3,4,5]

*将字符串转换成真正的数组

[...'hello']
//['h','e','l','l','o']

注意:扩展运算符也只能放在最后一位,否则报错
5.当new Foo()时发生了什么

 function show(sex){  
            console.log("普通函数"+sex);  
        }  
        var person={  
            name:"aa",  
            age:14  
        };  
        show.call(person,"男");  
        show.apply(person,["女"]);  
        //对于bind来说,用法更加的灵活  
        var ss=show.bind(person,"不明");  
        ss();  

通过观察上面的代码,很明显的就可以得出它们三者的区别,仅仅是函数传递的不同以及bind方法可以更加的方便的使用

9.闭包的应用
闭包+函数重写

function foo() {  
     var context=1;
     console.log(context);
     context=2;
      foo = function() {
        console.log(context);
     }
}

foo();

第一次打印1,之后都打印2

// 判断element是否匹配选择器selector
function matchSelector(element, selector) {
    var match = 
        document.documentElement.webkitMatchesSelector || 
        document.documentElement.mozMatchesSelector || 
        document.documentElement.msMatchesSelector ||
        // 兼容IE8及以下浏览器
        function(selector, element) {
            // 这是一个好方法,可惜IE8连indexOf都不支持
            // return Array.prototype.indexOf.call(document.querySelectorAll(selector), this) !== -1;

            if (element.tagName === selector.toUpperCase()) return true;

            var elements = document.querySelectorAll(selector),
            length = elements.length;

            while (length--) {
            if (elements[length] === this) return true;
            }

            return false;
        };

    // 重写函数自身,使用闭包keep住match函数,不用每次都判断兼容
    matchSelector = function(element, selector) {
        return match.call(element, selector);
    };

    return matchSelector(element, selector);
}
上一篇 下一篇

猜你喜欢

热点阅读