js面試

js的作用域和作用域鏈

  • 作用域就是變量或者函數有權訪問的數據的範圍,每個作用域都關聯一個變量對象,環境中的變量和函數都保存在這個對象中。
  • 每個函數都有自己的作用域,執行一個函數時,函數的作用域就會被進入作用域棧中,函數執行完後,自己的作用域出棧,控制權給之前的函數作用域。
  • 作用域鏈用於保證對作用域可訪問數據的有序訪問。作用域鏈的第一個對象是當前的作用域,然後下一個是包含的作用域,直到全局變量作用域。訪問數據會按照作用域鏈訪問,相同的變量,前面會將後面屏蔽掉。

js的原型和原型鏈

  • 我們創建的每一個函數都有一個prototype屬性,這個屬性是個指針,指向函數的原型函數所有實例共享原型包含的屬性和方法每個原型對象也都有一個constructor屬性指向所對應的函數。

  • 每個構造函數的實例都有一個屬性[[prototype]](谷歌,火狐裏是_proto_)指向構造函數的原型對象。

  • 代碼讀取實例屬性時會先搜索實例本身,在搜索原型對象上的屬性,相同屬性實例會把原型屏蔽掉。無法通過實例更改原型的屬性。


  • 如果我們讓B原型對象等於A構造函數的實例,此時B原型對象作爲A的實例,將獲得指向A原型對象的指針,因此獲得A原型對象上的屬性和方法,B的實例也將獲得A和B原型對象上的方法,如此實現了B繼承A的原型對象。如此往下循環,一個實例與原型構成的鏈條就是原型鏈。(B的原型對象也獲得了A構造函數的屬性和方法)

js的繼承

原型鏈
可以通過原型鏈實現繼承
缺點:1.從A的原型對象繼承的方法,都成爲了B的原型對象的屬性,因而B的實例全部共享這些屬性
2.創建B的實例時,無法向A構造函數傳遞參數(傳了會影響其他實例)
借用構造函數
示例

function A(name){
 this.name = name;
}
function B(){
    A.call(this,"yangyang");
}

借用call和apply可以在B中定義新的A函數中的初始化對象,如此B的實例將會獲得A的構造函數中的對象,且各個實例彼此獨立。
優點:
1.實例中繼承的對象和方法不在共享
2.可以傳參數
缺點:
1.無法實現函數複用,此方法繼承的方法是獨立的
組合繼承
就是將前兩種方法結合起來,繼承對象用借用構造函數,繼承方法依然用原型鏈。
(在原型鏈中存在的問題理論上依然存在,即B的原型對象是A的實例,則B的原型上有A的構造函數中的對象,它們仍然是B實例共享的,但因爲在B的構造函數中,將A的初始化對象有定義了一遍,因而屏蔽掉了B原型對象中的這些屬性)
(思考:是否有必要將B原型的consructur指向B構造函數,爲什麼)

js的dom元素操作

基本dom操作
獲取樣式用getComputedStyle(元素).樣式屬性。

ajax請求詳細怎麼實現,和其中的響應狀態

菜鳥教程
先建一個實例var xml=new xmlrehttpquest()
在設置方法和url xml.open(“GET”,“url”);(最後一個參數表示是否異步,默認爲true)
然後發送請求 xml.send(null);(沒有參數時要寫入null,get方法沒有參數,post請求則填入數據)
如果是post請求 需要設置請求頭
xmlHttp.setRequestHeader(“Content-Type”,“application/x-www-form-urlencoded”);

js的基礎類型和引用類型

w3school教程
生成隨機數

apply,bind和call

添加鏈接描述

js中new和object.creat區別

個人測試
var a = new A()
對象a會獲得函數A的原型對象上的方法和屬性,也會繼承函數A構造函數中的屬性。
var a = Object.create(A.prototype);
對象a只會獲得函數A的原型對象上的方法和屬性。

在mdn文檔裏
通過object.create()的這個用法可以實現繼承

// Shape - 父類(superclass)
function Shape() {
  this.x = 0;
  this.y = 0;
}

// Rectangle - 子類(subclass)
function Rectangle() {
  Shape.call(this); // call super constructor.
}

// 子類續承父類
Rectangle.prototype = Object.create(Shape.prototype);
Rectangle.prototype.constructor = Rectangle;

這樣,子類的原型對象就只獲得了父類的原型方法,而沒有順帶把父類構造函數中的方法拿走。

事件委託、事件冒泡、事件捕獲

僅做參考

js BOM

js中的BOM操作知識整理

瀏覽器如何渲染

好文章

js跨域實現

添加鏈接描述

請求get和post的區別

過於深奧的文章

argument

JavaScript 之arguments、caller 和 callee 介紹

深拷貝與淺拷貝

Object.assign({}, obj);淺複製,因爲 Object.assign()拷貝的是屬性值。假如源對象的屬性值是一個對象的引用,那麼它也只指向那個引用。
深拷貝與淺拷貝

序列化與反序列化

序列化

  • JSON.stringify();能生成js對象的JSON對象,js對象的所有函數及原型都將被忽略,值爲undefined的屬性也將被跳過。
  • 除了要序列化的對象外,還接受兩個參數。
  • 第二參數個可以是函數,也可以是數組,是數組時就只序列化數組中的屬性,是函數時函數有兩個參數,即對象每個屬性的鍵值對,根據返回的值決定序列化後屬性的值,返回undefined就忽略掉屬性。
  • 第三個參數決定結果的縮進,若爲數值則代表每一級別開頭縮進空格數,最大爲10,若爲字符串則代表每一級別開頭的縮進字符,最大長度爲10.
  • 可以給每個對象定義一個toJSON方法,返回自身的JSON格式,序列化時將首先調用這個方法,(Date本身就有一個,會轉換爲日期字符串)
    序列化js對象順序如下:

1.存在toJSON方法,則調用,否則返回本身
2.如果有第二個參數,則根據參數過濾對象屬性。
3.對結果進行序列化。
4.如果有第三個參數,進行格式化。

反序列化

  • JSON.parse可以將JSON對象轉化爲js對象,還接受一個參數,該參數是一個函數,同樣用於過濾屬性,參數爲屬性鍵值對,反序列化的屬性的值將爲返回值,返回undefined將會刪除屬性。

閉包

多看幾遍

cookie session 和localstorage

兩種盒模型

修改元素class

用classlist,add和remove可以添加或者刪除多個類名

http

請求,和請求頭詳解

this指向

獲取元素類型

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