小米web前端開發(fā)實習(xí)生面試

一面

盒模型

  • 標(biāo)準(zhǔn)盒模型
  • IE盒模型
  • box-sizing以及其屬性

position:relative和absolute

position:absolute 是相對于static定位以外的第一個父元素進(jìn)行定位。

實現(xiàn)水平垂直居中的方法

我回答了3種

  • flex布局
display: flex;
align-items:center;
justify-content:center;

如何清除浮動

我回答了兩種方法

rem和em

  • 當(dāng)使用 rem 單位,他們轉(zhuǎn)化為像素大小取決于頁根元素的字體大小,即 html 元素的字體大小。 根元素字體大小乘以你 rem 值。 例如,根元素的字體大小 16px,10rem 將等同于 160px,即 10 x 16 = 160。
  • 當(dāng)使用em單位時,像素值將是em值乘以使用em單位的元素的字體大小。 例如,如果一個 div 有 18px 字體大小,10em 將等同于 180px,即 10 × 18 = 180。
    http://caibaojian.com/rem-vs-em.html

閉包

就問了一下概念,問我平時有沒有用到過閉包(我說幾乎沒有)

執(zhí)行上下文 this

箭頭函數(shù)的this執(zhí)行問題

var obj = {
       say(){
                console.log(this);
       },
      say2:()=>{
                console.log(this);
       }   
}
var a = obj.say;
a();              //window
obj.say();     //obj
obj.say2();   //window
obj.say2.bind(obj);   //window

箭頭函數(shù)的 this
箭頭函數(shù)的 this是不進(jìn)行綁定的,即就是 通過call、apply、bind是不能改變其 this指向的

箭頭函數(shù)的 this是由定義時外圍最接近一層的非箭頭函數(shù)的 this來決定的,也就是平常所說的箭頭函數(shù)的this是從上層作用域中去找的,一直找不到的話即為window.

var name = 'window';

var person1 = {
  name: 'person1',
  foo1: function () {
    console.log(this.name)
  },
  foo2: () => console.log(this.name),
  foo3: function () {

    return function () {
      console.log(this.name)
    }
  },
  foo4: function () {

    return () => {
      console.log(this.name)
    }
  }
}

var person2 = { name: 'person2' }

person1.foo1();  //1
person1.foo1.call(person2);  //2

person1.foo2();   //window
person1.foo2.call(person2);   //window

function test(){ console.log(this.name);}
test()
test.call()
person1.foo3()  ();  //  window
person1.foo3.call(person2)();  //  window
person1.foo3().call(person2);   //  2
 
person1.foo4()();    //1 
person1.foo4.call(person2)   ();  //  2
person1.foo4().call(person2);  //1

手寫原型鏈,實現(xiàn)在obj上找到protoName的方法

hasOwnProperty() 方法會返回一個布爾值,指示對象自身屬性中是否具有指定的屬性(也就是,是否有指定的鍵)。

function findProp(obj, propName) {
        
    while (1) {
        if (obj === null) {
            return undefined;
        }
        if (obj.hasOwnProperty(propName)) {
            return propName;
        }
        obj = obj.__proto__;

    }
}


function Person() {}
Person.prototype.name = '111';
var person1 = new Person();
const result = findProp(person1, 'name');

手寫promise.all()

 Promise.property.all = function (iterators) {
        const promises = Array.from(iterators);
        const len = promises.length;
        let count = 0;
        let resultList = [];
        return new Promise((resolve,reject)=>{
            promises.forEach((p,index) =>{
                Promise.resolve(p)
            .then((result)=>{
                count++;
                resultList[index] = result;
                if(count === len){
                    resolve(resultList);
                }
        })
        .catch(e=>{
            reject(e);
        })
        })
        })
    }

簡單說一下你理解的react

react 是一個用于構(gòu)建用戶界面的 js 庫,它的特點是聲明式編程、組件化開發(fā)和多平臺適配。
其中聲明式編程就是我們只需要維護(hù)自己的狀態(tài),當(dāng)狀態(tài)發(fā)生改變時,react就會根據(jù)最新的狀態(tài)去渲染UI 界面
有虛擬dome
虛擬dom其當(dāng)于是在 js 和 真實dom之間的一個緩存。然后利用 diff算法避免沒有必要的dom操作。具體來說就是在第一次渲染真實dom之前,react在內(nèi)存中生成一個與真實 dom一樣的虛擬dom;當(dāng)state或props發(fā)生變化時,會再次生成一個新的虛擬dom樹,然后通過對比找出新舊虛擬dom樹的差異,然后對這些差異做一次批處理,也就是將差異更新到真實的dom上。
這樣做的好處就是提高了渲染速度,因為每次更新的話,是只更新有差異的部分,而不是全部更新。但是這樣也會導(dǎo)致一個問題就是初次加載頁面會很慢,因為會多一次虛擬dom的計算
這時候,面試官就說其實這個初次加載頁面時間還是在s內(nèi)的,可以忽略不計,但是真正影響初次加載react項目時間很長的原因是什么呢?
react首屏頁面加載性能優(yōu)化記錄

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容