训练营每日面试题

173 阅读2分钟

3.29

编写一个方法,该方法接收两个参数,分别为 k 和 一个无序的纯数字数组。该方法在执行后,会返回数组中第 k 大的数字。特别注意,如果数组中,有两位数值一样的数字,同数值数字排名并列。如 [3,1,3,2,5,4,5] 中,第 1 大的数字为 5,第2大的数字为 4,第5大的数字为 1?

function getNum(k, arr) {
    // 排列数组及反转
    let res = arr.sort((a,b)=>b-a);
    // 将数组转化成set去重
    let set = new Set(res);
    // 将类数组转回数组
    let newArr = Array.from(set);
    if (typeof newArr[k-1] !== "undefined") {
        // 返回查找到的数据
        return newArr[k-1];
    } else {
        // 未找到数据排除错误
        throw Error("未找到对应数据");
    }
}
let arr = [3, 1, 3, 2, 5, 4, 5];
let res = getNum(1, arr);
console.log(res);

proto 和 prototype 之前有什么关系?

大部分函数(重点是构造函数),都内置一个prototype的属性,属性值是一个对象,对象中所存储的属性和方法,是供当前类所属实例调用的公共属性和方法 在prototype上还有一个内置属性constructor,属性值就是当前函数本身 每一个对象都内置一个__proto__属性,属性值指向自己的所属类的prototype Object.prototype的__proto__值是null,因为Object是所有对象的基类 image.png

3.30

call(), .apply() .bind() 的区别和作用?bind 方法如何来实现?

call,apply,bind都是用来改变函数this指向的 call,apply会立即执行,但是bind不会 call可以接受一个或者多个参数,第一个参数永远是用来改变this指向的,第一个参数如果是null或者undefined,this会指向window apply和call基本相同,但是最多只能接受2个参数,第二个参数为数组 bind是直接改变这个函数的this指向并且返回一个新的函数,再次调用的时候this会指向bind绑定的第一个参数

Function.prototype.call = function call(context, ...params) {
    let key = Symbol("key");
    context[key] = this;
    let result = context[key](...params);
    delete context[key];
    return result;
};
Function.prototype.bind = function _bind(context, ...params) {
    let that = this;
    return function proxy(...args) {
        params = params.concat(args);
        return that.call(context, ...params);
    };
};

js中基础数据类型有哪几种?了解包装对象么?

  1. String
  2. Number
  3. Boolean
  4. Undefined
  5. Null
  6. Symbol
  7. Bigint 包装对象是指用new创建的对象,string boolean number有包装对象,包装对象看上去和原值一模一样,但是是object类型