前端面試題學習和總結

1、js的數據類型有哪些和區別

(1)兩種數據類型:
基本數據類型:null, undefined, number, string, Boolean
引用數據類型:Array, Object, Function, Date
(2)區別:
基本數據類型存儲在棧中,直接存值,賦值的時候是相對獨立的。css

例:`var a = 10;
     var b = a;
     b = 20;
     console.log(a); // 10 `

引用數據類型存儲在堆中,存的是內存地址,賦值的時候至關因而賦值內存地址html

例:`var obj1 = new Object();
     var obj2 = obj1;
     obj2.name = "danny";
     console.log(obj1.name); // danny`

2、 js的原型和原型鏈

(參考文章:https://www.jianshu.com/p/dee...
A. 每一個對象都有 proto 屬性,但只有函數對象纔有 prototype 屬性,指向他的原型對象Person.prototype,原型對象(Person.prototype)是構造函數(Person)的一個實例。
Person.prototype.constructor == Personvue


B.經過new建立實例person1,實例有constructor屬性,指向他的構造函數Person。
person1.constructor == Person跨域


C. 全部的原型對象都會自動得到一個 constructor(構造函數)屬性,這個屬性(是一個指針)指向 prototype 屬性所在的函數(Person)
Person.prototype.constructor == Person數組


D. 原型鏈:JS 在建立對象(不管是普通對象仍是函數對象)的時候,都有一個叫作__proto__ 的內置屬性,用於指向建立它的構造函數的原型對象dom

3、判斷一個字符串中出現次數最多的字符和出現的次數

let [str,arr] = ["assda1221asjdklasdjkln12klnasld",{}]
    for(let i in str){
        if(!arr[str.charAt(i)]){
            arr[str.charAt(i)] = 1
        } else {
            arr[str.charAt(i)]++
        }
    }
    let [key,number] = [null,0]
    for(let i in arr) {
        if(arr[i]>number) {
            key = i;
            number=arr[i]
        }
    }
    console.log(`出現次數最多的字符是${key},次數爲${number}`) //出現次數最多的字符是a,次數爲5

4、add (1)(2)(3)(4)實現無限累加,最終打印出結果

function add(x){
        function addFake(y) {
            x = x + y;
            return addFake;
        };
        addFake.toString = function () {
            return x;
        };
        return addFake;
    }
    console.log(add(1)(2)(3)(4).toString()) //10

備註:
A. 在對函數進行console.log或者alert會自動調用toString函數,故需重寫該函數
B. 第一次調用add返回了addFake函數,後續一直調用addFake函數,故該代碼執行過程,add調用了一次,addFake調用了3次函數

5、對象的深度拷貝

使用遞歸的方法:prototype

function clone(obj) {
        var o = obj instanceof Array ? [] : {};
        for (var k in obj)
            o[k] = typeof obj[k] === Object ? clone(obj[k]) : obj[k];
        return o;
    }
    let obj = {name: 'danny'}
    const objCopy = clone(obj)
    obj.age = '18'
    console.log(obj) // {name: "danny", age: "18"}
    console.log(objCopy) // {name: "danny"}

備註:
一、使用JSON.parse(JSON.stringify(obj))能夠實現一些部分狀況下的深拷貝,可是若是對象中有undefined、function、symbol 會在轉換過程當中被忽略,則沒法使用
二、Object.assign只能實現淺拷貝(源對象的屬性值發現改變,則跟着變)雙向綁定


6、js的做用域鏈

(我的部分理解)好比在函數內定義一個變量A,而後去調用這個變量A。這個時候首先在函數代碼塊裏面找是否有A,若是有就有,沒有的話繼續往外層找,直到找到window對象下面,若是還沒,那就是not defined指針

7、vue雙向綁定

是經過Object.defineProperty()中的set()和get()函數實現的,取值的時候調用get(),賦值的時候調用get()

let keyValue = 1;
    let obj2 = {};
    Object.defineProperty(obj2,'key', {
        get: function(){
            return keyValue;
        },
        set: function(newValue){
            keyValue = newValue;
        }
    });
    obj2.key; // 1
    obj2.key = '2';

8、數組隨機排序

let arrData = [1,2,3,4,5,6,7,8]
    function randSort(arr) {
        for (let i = 0, len = arr.length; i < len; i++) {
            let rand = parseInt(Math.random()*len)
            let temp = arr[rand]
            arr[rand] = arr[i]
            arr[i] = temp
        }
        return arr
    }
    console.log(randSort(arrData))

9、JS的跨域有那些解決方案

參考文章:https://www.cnblogs.com/2050/...
補充:服務端處理 header("Access-Control-Allow-Origin: *");

10、css垂直居中有哪些方式

=================持續更新中====================

相關文章
相關標籤/搜索