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是所有对象的基类
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中基础数据类型有哪几种?了解包装对象么?
- String
- Number
- Boolean
- Undefined
- Null
- Symbol
- Bigint 包装对象是指用new创建的对象,string boolean number有包装对象,包装对象看上去和原值一模一样,但是是object类型