js面試題,代碼實現,持續更新中

怎麼判斷兩個對象相等?

JSON.stringify(obj) === JSON.stringify(obj)

實現數組去重?

let arr = [1,1,'true','true',true,true,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}];
  • 使用ES6的Set方法

    console.log(Array.from(new Set(arr)) console.log([...new Set(arr)])

    不能去重對象

 

  • 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)
        })
    }
    console.log(unique(arr))

綜合考慮是最好的方法

 

  • 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;
    }
    console.log(unique(arr))

 

  • 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
    }
    console.log(unique(arr))

 

  • 雙層for循環

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]){      
                arr.splice(j,1);
                j--;
            }
        }
    }
return arr;
}

實現深拷貝的方法?

let obj = {a: undefined, b: 1.7976931348623157E+10308, c: -1.7976931348623157E+10308, d: new Date(), e: new RegExp('\\w+'), f: function() {console.log(1)}}
  • 第一種:JSON.parse(JSON.stringify())

    弊端如下

    • 如果obj裏面有時間對象,時間將只是字符串的形式。而不是時間對象;
    • 如果obj裏有RegExp、Error對象,則序列化的結果將只得到空對象
    • 如果obj裏有函數,undefined,則序列化的結果會把函數或 undefined丟失;
    • 如果obj裏有NaN、Infinity(正無窮大)和-Infinity(負無窮大),則序列化的結果會變成null
    • 如果obj中的對象是有構造函數生成的,會丟棄對象的constructor;
  • 第二種:手寫迭代

    function deepClone(obj){
        let newObj = Array.isArray(obj)?[]:{}
        if(obj && typeof obj === 'object'){
            for(let key in obj){
                if(obj.hasOwnProperty){
                    newObj[key] = (obj && typeof obj[key] === 'object') ? deepClone(obj[key]) : obj[key]
                }
            }
        }
        return newObj
    }
    console.log(deepClone(obj))

實現冒泡排序算法?

let array = [5, 4, 3, 2, 1];
let temp = 0;
for (let i = 0; i <array.length; i++){
  for (let j = 0; j <array.length - i; j++){
    if (array[j] > array[j + 1]){
      temp = array[j + 1];
      array[j + 1] = array[j];
      array[j] = temp;
    }
  }
}

實現降維數組?

let arr = [[1,2],[3,4]]
function Jw(arr){
  return Array.prototype.concat.apply([], obj)  
}
console.log(Jw(arr)) // [1,2,3,4]

實現取數組的最大值

  • Math.max.apply(null, [213, 4, 43, 141])
  • Math.max(...[213, 4, 43, 141])

 

如何阻止冒泡事件

function stopBubble(e){
    if(e && e.stopPropagation){
        // 非IE瀏覽器
        e.stopPropagation();
    }else{ 
        //IE瀏覽器
        window.event.cancelBubble=true;
    }
}

如何阻止瀏覽器默認事件

function stopDefault(e){ 
    //標準瀏覽器
    if(e && e.preventDefault){ 
        e.preventDefault(); 
    } 
    //個別IE
    else{ 
        window.event.returnValue=fale;
        return false;
    } 
}

獲取非行間樣式

function getCss(curEle,attr){
    var val = null;
    try{
            val = window.getComputedStyle(curEle,null)[attr];
    }catch(e){
            val = curEle.currentStyle[attr];
    }
    return val;
}
getCss(div,'width')

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章