学习前端面试知识(1)

2024-7-27  打卡第一天  学习视频链接

unshift 在数组首端添加一个或者多个数据

  • 任务:实现自定义unshift方法
  • splice(0,0,el) 第一个0表示从索引0开始,第二个0表示删除的数量,为0就是不删除任何一个数值的意思,最后一个el表示要添加的元素,不加默认不添加
  • Array.prototype.myUnshift = function(){...}向 Array 对象的原型(prototype)上添加了一个自定义的方法 myUnshift。这意味着一旦这个代码被执行,所有的数组对象(即所有通过 Array 构造函数或其字面量语法创建的数组)都将能够调用这个新添加的 myUnshift 方法,就好像它是 JavaScript 数组对象内置的一部分一样
<!--arguments 是一个类数组对象,它包含了传给函数的所有参数-->
Array.prototype.myUnshift = function(){
    let len = arguments.length-1;
    for(let i = len; i >= 0; i--){
        var el = arguments[i];
        this.splice(0,0,el);
    }
    return this.length;
}

var arr = [3,4,5];
console.log(arr.myUnshift(1,2,3),arr);

数组去重的两种写法

  • 用filter先循环打印出数组的值和对应的索引,indexOf(value,0)表示从索引0开始查找value的位置,有多个以上会返回找到的第一个,如果和当前索引是一样的表示第一次遍历到,结果是true保存,false就去除
  • 比如[2,6,5,6],遍历到第一个6的时候会返回索引1和当前遍历到的一致,结果是true所以保存,遍历到第二个6的时候返回的结果还是索引1,但是这个时候的指针指向了3,不一致,所以不保存
Array.prototype.myUnique = function(){
<!--    value是循环遍历出来的数组的值,index是对应的索引-->
    return this.filter((value,index) => {
<!-- this.indexOf(value,0) 从数组的开头(索引 0)开始查找指定的 value,并返回第一个索引-->
       return this.indexOf(value,0) === index;
    });
}

var arr = [2,6,5,6];

console.log(arr.myUnique());
  • 使用Set集合不重复的特性
Array.prototype.myUnique = function(){
    return Array.from(new Set(this));
}

var arr = [2,6,5,6];

console.log(arr.myUnique());

获取指定范围的随机数

Math.round(num) 四舍五入

Math.floor(num) 向下取整

Math.cell(num) 向上取整

  • Math.random()的范围在 [0, 1) 之间,将这个值乘以 len 时,范围就变成了 [0 * len, 1 * len),即 [0, len)
  • 下面第一个最大最小均不涉及的情况中。首先乘以(max - min - 2),此时random的范围就是[0*(max - min - 2),1*(max - min - 2)]即[0,max - min - 2],这个时候想要最大最小均不涉及,添加min+1即可,此时的范围就变成了[0+min+1,max - min - 2+min+1]即[min+1,max-1]
  • 其他三种情况中都是乘以长度再加min,首先乘以长度就是让变化范围在这个长度之间,而加min就是让这个范围从min开始
function fn(min,max){
    // (min.max) 最大最小均不涉及
<!--    return Math.round(Math.random() * (max - min - 2) + min + 1);-->
    // [min,max] 最大最小均涉及
<!--    retrun Math.round(Math.random() * (max - min) + min);-->
    // (min,max] 最小不涉及,最大涉及
<!--    return Math.cell(Math.random() * (max - min) + min);-->
    // [min,max) 最小涉及,最大不涉及
    return Math.floor(Math.random() * (max - min) + min);
}

console.log(fn(1,10));

打印100以内的质数

  • let count 必须设置为0,如果不进行设置,初始值为NaN,最开始的2打印不出来
let count = 0 ;
for(var i = 2 ; i <= 100; i++){
    for(var j = 1; j <= i; j++){
        if( i % j === 0){
            count++;
        }
    }
    if(count == 2){
        console.log(i);
    }
    count = 0;
}

获取URL中的参数

  •  split("?") 以 ? 为分隔符来分割传入的URL字符串。这个方法会返回一个数组,其中第一个元素是URL的主部分(不包括查询参数和锚点),第二个元素是查询参数部分,从分隔符?开始到字符串的结尾
  • [1]:通过索引 1 访问这个数组,从而获取到查询参数部分。如果URL中没有 ?,则这个数组只有一个元素(即整个URL),此时 split("?")[1] 会是 undefined
  • new URLSearchParams(url):根据查询参数字符串 url 来创建一个 URLSearchParams 对象。这个对象提供了一系列的方法来解析和操作URL的查询参数。
  • urlParams.entries()URLSearchParams 对象的 entries 方法返回一个迭代器,迭代器中的每个元素都是一个 [key, value] 数组,表示查询参数的一个键值对。
  • Object.fromEntries(...)Object.fromEntries() 方法将键值对列表转换为一个对象。这里,它接收 urlParams.entries() 返回的迭代器,并将其转换为一个普通对象,对象的属性名就是查询参数的键,属性值就是对应的值。
let url = "https://alibaba.com?a=1&b=2&c=3";

function queryURLParams(URL){
    let url = URL.split("?")[1];
    let URLParams = new URLSearchParams(url);
    let params = Object.fromEntries(URLParams.entries());
    return params;
}

console.log(queryURLParams(url));

数组的随机排列的两种写法

  • Math.random()的范围在 [0, 1) 之间,将这个值乘以 len 时,范围就变成了 [0 * len, 1 * len),即 [0, len),前面具体描述过相应的过程,这个步骤中没有+min的原因就是最开始定义的边界就是0,i从0开始,所以不需要添加最小值这一步
  • Math.random() 生成一个 [0, 1) 范围内的随机浮点数,所以用parseInt来进行取整
function result(arr){
    for(var i = 0; i < arr.length; i++){
        let randomIndex = parseInt(Math.random()*arr.length);
        let curr = arr[i];
        arr[i] = arr[randomIndex];
        arr[randomIndex] = curr;
    }
    return arr;
}

var arr = [1,2,3,4,5];

console.log(result(arr));
  • () => Math.random() - 0.5 是一个箭头函数,它返回一个介于 -0.5 和 0.5 之间的随机数。这个随机数可以是负数、零或正数
  • 在 sort() 方法中,如果比较函数返回一个小于 0 的值,则第一个参数会被视为“较小”并排在前面;如果返回大于 0 的值,则第二个参数会被视为“较大”并排在前面;如果返回 0,则两个参数的顺序不会改变
var arr = [1,2,3,4,5];

Array.prototype.mySort = function(){
    return arr.sort(() => Math.random() - 0.5);
}

console.log(arr.mySort());

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值