每天一點小提升,人人都是工程師

不願意透露姓名的聶先生發表於2018-07-20

實現fn(2)(4)的列印結果為8

function (a) {
    return function (b) {
        console.log(a*b)
    }
}
fn(2)(4)
複製程式碼

什麼是原型鏈

每個物件都會在其內部初始化一個屬性,就是prototype(原型),當我們訪問一個物件的屬性時,如果這個物件內部不存在這個屬性,那麼他就會去prototype裡找這個屬性,這個prototype又會有自己的prototype,於是就這樣一直找下去,也就是我們平時所說的原型鏈的概念。

關係:instance.constructor.prototype = instance.proto

定位

論position的屬性都有哪些

static:預設的屬性值,按照標準流(包括浮動方式)進行佈局。

relative:稱為相對定位,使用相對的盒子的位置常以標準量的排版方式為基礎,然後使盒子相對於它在原本的標準位置偏移指定的距離.相對定位仍在標準流中,它對父塊和兄弟塊盒子沒有任何影響。

absolute:絕對定位,盒子的位置以它的包含框為基準進行偏移。絕對定位從標準流中脫離,並且以它最近的一個已經定位的祖先元素為基準進行定位。沒有已經定位的祖先元素,則以瀏覽器視窗為基準進行定位 。 inherit:規定從父元素繼承 position 屬性的值。

fixed:固定定位,與絕對定位類似,以瀏覽器視窗為基準進行定位,拖動瀏覽器視窗的滾動條時,位置保持不變。

sticky: 粘性定位是相對定位和固定定位的混合。元素在跨越特定閾值前為相對定位,之後為固定定位。

vue都有哪些生命週期

beforeCreate  元件例項剛被建立

created 元件例項建立完,屬性已被繫結,但是dom還未生成

beforeMount 模板編譯掛載前

mounted 模板編譯掛載後

beforeUpdate 元件更新之前

updated 元件更新之後

activated keep-alive啟用時呼叫

deactivated  keep-alive移除時呼叫

beforeDestroy 元件銷燬前呼叫

destroyed 元件銷燬後呼叫

errorCapture 錯誤時被呼叫
複製程式碼

瀏覽器標準模式和怪異模式之間的區別是什麼

在HTML與CSS的標準化未完成之前,各個瀏覽器對於HTML和CSS的解析有各自不同的實現,而有很多舊的網頁都是按照這些非標準的實現去設計的。在HTML與CSS標準確定之後,瀏覽器一方面要按照標準去實現對HTML與CSS的支援,另一方面又要保證對非標準的舊網頁設計的後向相容性。因此,現代的瀏覽器一般都有兩種渲染模式:標準模式和怪異模式。在標準模式下,瀏覽器按照HTML與CSS標準對文件進行解析和渲染;而在怪異模式下,瀏覽器則按照舊有的非標準的實現方式對文件進行解析和渲染。這樣的話,對於舊有的網頁,瀏覽器啟動怪異模式,就能夠使得舊網頁正常顯示;對於新的網頁,則可以啟動標準模式,使得新網頁能夠使用HTML與CSS的標準特性。

在標準模式下,一個塊的總寬度= width + margin(左右) + padding(左右) + border(左右)

alt

在怪異模式下,一個塊的總寬度= width + margin(左右)(即width已經包含了padding和border值)

alt

宣告式函式和表示式函式的區別

function a () {
        return '函式宣告';
    }
var b = function () {
    return '函式表示式';
}
複製程式碼

Javascript 中函式宣告和函式表示式是存在區別的,函式宣告在JS解析時進行函式提升,因此在同一個作用域內,不管函式宣告在哪裡定義,該函式都可以進行呼叫。而函式表示式的值是在JS執行時確定,並且在表示式賦值完成後,該函式才能呼叫。

js哪些操作會實行隱式轉換

數值自動轉換為字串

var a = 123;
alert(a+'4'); // 輸出 1234 “+”號為連線符
複製程式碼

字串自動轉換為數字

var b = 1;
alert(b-'1'); // 減法 輸出 0
alert(b*'2'); // 乘法 輸出 2
alert(b/'1'); // 除法 輸出 1
alert(b%'1') // 求餘 輸出0
複製程式碼

“++”和“–”的型別轉換

var c = '10';
c++;
alert(c); // 輸出 11
 
var d = '10';
d--;
alert(d); // 輸出 9
複製程式碼

比較運算子的型別轉換

alert('10' > 1) // 輸出 true
alert('10' > '20') // 輸出 false
複製程式碼

等號運算子的轉換

alert('10' == 10) // 輸出 true
alert('10' === 10) // 輸出 false
複製程式碼

“!” 運算子的轉換

alert(!true); // 輸出false
alert(!false); // 輸出 true
alert(!100); // 輸出false
alert(!'哈哈哈哈哈'); // 輸出 false
複製程式碼

運算子其他之間的轉換返回NaN

alert('哈哈哈'-10) // 輸出NaN
複製程式碼

用javascipt寫一個方法,模擬實現bind方法

//bind() 方法會建立一個新函式。
//當這個新函式被呼叫時,bind() 的第一個引數將作為它執行時的 this
//之後的一序列引數將會在傳遞的實參前傳入作為它的引數。(來自於 MDN )

Function.prototype.fakeBind = function(context) {
  if (typeof this !== "function") {
    throw new Error("Bind must be called on a function");
  }
  let self = this;
  // 獲得第一個引數以外的其他引數
  let args = Array.prototype.slice.call(arguments, 1);

  let inner = function() {
    // 獲得返回函式執行時被傳入的引數
    let innerArgs = Array.prototype.slice.call(arguments);
    // 1 new 情況下,this 指向例項。此時 bind 時指定的 this 值應予以失效;
    // 2 例項 instanceof 建構函式 返回值 truefalse,確定是否為 new 呼叫;
    // 3 匿名函式直接呼叫 this 指向全域性物件。此時應予以修改 this 的繫結
    return self.apply(
      this instanceof inner ? 
      this : 
      context, args.concat(innerArgs)
    );
  };
  // inner.prototype = this.prototype 
  // 按上面這麼寫的話,修改 返回函式原型物件(inner.prototype)的同時把 繫結函式的原型物件(this.prototype)也同時修改了。
  // 用匿名函式做中轉,this.protptype 就安全了。畫個原型鏈的圖就清楚了。
  //注②
  let fNOP = function() {};
  fNOP.prototype = this.prototype;
  inner.prototype = new fNOP();
  return inner;
};
複製程式碼

相關文章