JavaScript(五)

1、如何优化前端页面加载速度?

  1. 将小的图片合并成一张Sprite图,可以减少HTTP请求。
  2. 使用缓存。
  3. css文件放在头部head,脚本文件放在body的底部。
  4. 使用懒加载
  5. 使用内容分发网络(CDN)
  6. 压缩css和js文件
  7. 减少重定向,因为重定向会导致HTTP请求增加。

 

2、对该数组进行去重

let arr = [NaN, 1, 1, "2", "2", "hello", "hello", NaN]

该题有一个坑,就是NaN的存在,如果使用indexOf方法的话,结果不会是你想要的。如:

let arr = [NaN, 1, 1, "2", "2", "hello", "hello", NaN]
let arr2 = arr.filter((item, index, arr) => {
    return arr.indexOf(item) == index;
})
console.log(arr2)    // [1, "2", "hello"]

                           ◀️◀️◀️◀️◀️      NaN不见了

原因是NaN有一个特性,它不等于任何值,包括它自身。所以,即使arr数组中有NaN这个元素,indexOf在进行查找的时候也无法匹配,没有办法,这个是NaN的特性!

 

填坑:推荐两个方法:

  1. ES6的new Set
    let arr = [NaN, 1, 1, "2", "2", "hello world", NaN];
    let arr2 = new Set(arr);
    console.log(arr3)

     

  2. 增加类型判断

    let ar = [NaN, 1, 1, "2", "2", "hello world", NaN];
    let obj = {};
    let arr2 = [];
    arr.forEach(function(item){
        let key = typeof item + item;
        if (!obj[key]) {
            arr2.push(item);
            obj[key] = true;
        }
    })
    
    console.log(arr2);

     

3、让一个div(不确定宽高),在页面上水平垂直居中的方法

  1. 使用弹性布局
    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title></title>
        <style>
            * {
                margin: 0;
                padding: 0;
            }
    
            body {
                width: 100vw;
                height: 100vh;
                
                display: flex;
                justify-content: center;
                align-items: center;
            }
    
            div {
                width: 100px;
                height: 100px;
                background: yellow;
            }
        
        </style>
    </head>
    <body>
        <div></div>
    </body>
    </html>

     

  2. 使用绝对定位 + transform
    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title></title>
        <style>
            * {
                margin: 0;
                padding: 0;
            }
    
            body {
                width: 100vw;
                height: 100vh;
            }
    
            div {
                width: 100px;
                height: 100px;
                background: yellow;
    
                position: absolute;
                top: 50%;
                left: 50%;
                transform: translate(-50%, -50%);
            }
        
        </style>
    </head>
    <body>
        <div></div>
    </body>
    </html>

     

4、生成10个10-100的随机数存到一个数组中,然后进行升序排序

let arr = [];
let length = 10
for(let i = 1; i <= length; i++) {
    let n = Math.floor(Math.random() * 100);
    if(n >= 10) {
        arr.push(n);
    }else {
        length ++
    }
}

arr.sort((a, b) => {
    return a - b
})

console.log(arr)

 

5、写一个sum方法,当使用下面的语法调用时它将正常工作

console.log(sum(2,3));       // Outputs 5
console.log(sum(2)(3));      // Outputs 5
function sum() {
    let arg = [...arguments];
    if(arg.length > 1) {
        return arg.reduce((a, b) => a + b)
    }else {
        return function f() {
            return [...arguments][0] + arg[0]
        }
    }
}

 

6、考虑下面的代码片段

for (var i = 0; i < 5; i++) {
  var btn = document.createElement('button');
  btn.appendChild(document.createTextNode('Button ' + i));
  btn.addEventListener('click', function(){ console.log(i); }); 
  document.body.appendChild(btn);
}

当用户点击“按钮4”时,什么被记录到控制台?为什么?

答:输出5,因为给button绑定事件的时候,函数是没有被运行的,当循环结束的时候,i 值为5,而函数里的 i 同样是5,实际上这个例子中,每个i的值都是5;

如果要让5个button分别输出0,1,2,3,4的话,有两种方法

1、for循环中的var改为let,这是最简单的方法,改为let之后for循环的i就是属于块级作用域的变量了,不会污染到后面的函数。

2、为绑定的函数定义一个立即执行函数,如下:

for (var i = 0; i < 5; i++) {
    var btn = document.createElement('button');
    btn.appendChild(document.createTextNode('Button ' + i));
  
    (function(x) {
        btn.addEventListener('click', function(){ console.log(x) })
    })(i)
   
    document.body.appendChild(btn);
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值