各大厂前端面试题合集 — javascript(三)

177 阅读3分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

跳到顶部是怎么实现的

  1. 锚点
<body style="height:2000px;">     
    <div id="topAnchor"></div>     
    <a href="#topAnchor" style="position:fixed;right:0;bottom:0">回到顶部</a>
</body>

2.scrollTop()

<body style="height:2000px;">    
    <button id="test" style="position:fixed;right:0;bottom:0">回到顶部</button>
    <script>         
        test.onclick = function(){             
            document.body.scrollTop = document.documentElement.scrollTop = 0;         }     
    </script> 
</body>
  1. scrollTo()
<body style="height:2000px;">     
    <button id="test" style="position:fixed;right:0;bottom:0">回到顶部</button>     
    <script>         
        test.onclick = function(){             
            scrollTo(0,0);         
        }     
    </script> 
</body>
  1. scrollBy()

scrollBy(x,y)方法滚动当前window中显示的文档,x和y指定滚动的相对量

只要把当前页面的滚动长度作为参数,逆向滚动,则可以实现回到顶部的效果

<body style="height:2000px;">     
    <button id="test" style="position:fixed;right:0;bottom:0">回到顶部</button>     
    <script>         
        test.onclick = function(){             
            var top = document.body.scrollTop || document.documentElement.scrollTop;             
            scrollBy(0,-top);         
        }     
    </script> 
</body>
  1. scrollIntoView()

Element.scrollIntoView方法滚动当前元素,进入浏览器的可见区域 

该方法可以接受一个布尔值作为参数。如果为true,表示元素的顶部与当前区域的可见部分的顶部对齐(前提是当前区域可滚动);如果为false,表示元素的底部与当前区域的可见部分的尾部对齐(前提是当前区域可滚动)。如果没有提供该参数,默认为true

使用该方法的原理与使用锚点的原理类似,在页面最上方设置目标元素,当页面滚动时,目标元素被滚动到页面区域以外,点击回到顶部按钮,使目标元素重新回到原来位置,则达到预期效果

<body style="height:2000px;">     
    <div id="target"></div>     
    <button id="test" style="position:fixed;right:0;bottom:0">回到顶部</button>
    <script>        
        test.onclick = function(){             
            target.scrollIntoView();         
        }     
    </script> 
</body>

$().ready 和 window.onload 的区别

//是在dom内容(html和js)加载后执行
$(document).ready(function(){ 
    ... 
}) 

//=== 

$().ready(function(){ 
    ... 
}) 

//=== 

$(function(){ 
    ... 
})
//是在所有页面内容(html,js,图片)加载后执行 
window.onload = function(){ 
    ... 
} 

//=== 

$(window).load(function){ 
    ... 
}

总结:ready 比 load 快

Promise异步

Promise 是异步编程的一种解决方案----解决了回调地狱

Promise的三种状态

  • pending---进行中
  • fulfilled---已成功resolved
  • rejected---已失败

Promise 对象有两个以下两个特点

  1. 对象的状态不受外界影响
  2. 一旦状态改变,就不会再变,任何时候都可以得到这个结果

Promise对象的状态改变,只有两种可能:从pending变为fulfilled和从pending变为rejected。

let promise = new Promise(function(resolve, reject) {  
    console.log('Promise');   
    resolve(); 
}); 

promise.then(function() {   
    console.log('resolved.'); 
}); 

console.log('Hi!'); 

// Promise 
// Hi! 
// resolved

判断是否味json数据

isJSON(str) { 
    if (typeof str == 'string') { 
        try { 
            var obj=JSON.parse(str); 
            if (typeof obj == 'object' && obj ) { 
                console.log('是JSON'); 
                return true; 
            } else {
                return false; 
            } 
        } catch(e) { 
            console.log('error:'+str+'!!!'+e); 
            return false; 
        } 
    }
}

🌟数组去重的方法

一、利用ES6中Set去重

这种方法还是无法去掉“{}”空对象

function unique (arr) {   
    return Array.from(new Set(arr)) 
}

var arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}]; 

console.log(unique(arr)) 
//[1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {}, {}]

二、利用for嵌套for,然后splice去重

function unique(arr){                     
    for(var i=0; i<arr.length; i++){             
        for(var j=i+1; j<arr.length; j++){                 
            if(arr[i]==arr[j]){ //第一个等同于第二个,splice方法删除第二个                 arr.splice(j,1);                     
                j--;                 
            }             
        }         
     } 
     return arr; 
} 

var arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}]; 

console.log(unique(arr)) 
//[1, "true", 15, false, undefined, NaN, NaN, "NaN", "a", {…}, {…}]      
//NaN和{}没有去重,两个null直接消失了

三、利用indexOf去重

function unique(arr) {     
    if (!Array.isArray(arr)) {         
        console.log('type error!');        
        return;     
    }     
    var array = [];     
    for (var i = 0; i < arr.length; i++) {         
        if (array.indexOf(arr[i]) === -1) {             
            array.push(arr[i]);        
        }     
    }     
    return array; 
} 

var arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}]; 

console.log(unique(arr)) 
// [1, "true", true, 15, false, undefined, null, NaN, NaN, "NaN", 0, "a", {…}, {…}]   
//NaN、{}没有去重

四、利用sort()

function unique(arr) {     
    if (!Array.isArray(arr)) {         
        console.log('type error!')         
        return;     
    }     
    arr = arr.sort()     
    var arrry= [arr[0]];     
    for (var i = 1; i < arr.length; i++) {         
        if (arr[i] !== arr[i-1]) {             
            arrry.push(arr[i]);         
        }     
    }     
    return arrry; 
} 

var arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}]; 

console.log(unique(arr)) 
// [0, 1, 15, "NaN", NaN, NaN, {…}, {…}, "a", false, null, true, "true", undefined]       
//NaN、{}没有去重

五、利用includes

function unique(arr) {     
    if (!Array.isArray(arr)) {         
        console.log('type error!')         
        return     
    }     
    var array =[];     
    for(var i = 0; i < arr.length; i++) {             
        if( !array.includes( arr[i]) ) {//includes 检测数组是否有某个值         
            array.push(arr[i]);               
        }     
    }     
    return array 
} 

var arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}]; 

console.log(unique(arr)) 
//[1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {…}, {…}]      
//{}没有去重

六、利用hasOwnProperty

function unique(arr) {     
    var obj = {};     
    return arr.filter(function(item, index, arr){         
        return obj.hasOwnProperty(typeof item + item) ? false : (obj[typeof item + item] = true)     
    }) 
} 

var arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}]; 

console.log(unique(arr)) 
//[1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {…}]    
//所有的都去重了

七、利用filter

function unique(arr) {   
    return arr.filter(function(item, index, arr) {     
        //当前元素,在原始数组中的第一个索引==当前索引值,否则返回当前元素     
        return arr.indexOf(item, 0) === index;   
    }); 
}     

var arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}]; 

console.log(unique(arr)) 
//[1, "true", true, 15, false, undefined, null, "NaN", 0, "a", {…}, {…}]

八、利用递归去重

function unique(arr) {         
    var array= arr;         
    var len = array.length;     
    array.sort(function(a,b){   
        //排序后更加方便去重         
        return a - b;     
    })     
    function loop(index){         
        if(index >= 1){             
            if(array[index] === array[index-1]){                 array.splice(index,1);             
            }             
            loop(index - 1);    //递归loop,然后数组去重         
        }     
    }     
    loop(len-1);     
    return array; 
} 

var arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}]; 

console.log(unique(arr)) 
//[1, "a", "true", true, 15, false, 1, {…}, null, NaN, NaN, "NaN", 0, "a", {…}, undefined]

九、利用Map数据结构去重

function arrayNonRepeatfy(arr) {   
    let map = new Map();   
    let array = new Array();  // 数组用于返回结果   
    for (let i = 0; i < arr.length; i++) {     
        if(map .has(arr[i])) {  // 如果有该key值       
            map .set(arr[i], true);     
        } else {       
            map .set(arr[i], false);   // 如果没有该key值       
            array .push(arr[i]);     
        }   
    }   
return array ; 
} 

var arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}];     

console.log(unique(arr)) 
//[1, "a", "true", true, 15, false, 1, {…}, null, NaN, NaN, "NaN", 0, "a", {…}, undefined]

十、利用reduce + includes

function unique(arr){     
    return arr.reduce((prev,cur) => prev.includes(cur) ? prev : [...prev,cur],[]); 
} 

var arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}]; 

console.log(unique(arr)); 
// [1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {…}, {…}]

十一、[...new Set(arr)]

[...new Set(arr)] 
//代码就是这么少----(其实,严格来说并不算是一种,相对于第一种方法来说只是简化了代码)