第一個問題:什麼是作用域? 第二個問題:作用域在上面情況下形成? 第三個問題:什麼是變數提升,作用域鏈? 第四個問題:“=”賦值運算 第五個問題:生成對象的有幾種方式? 第六個問題:面向對象的三大特點 第七個問題:原型鏈 第八個問題:prototype和__proto__的區別? 第九個問題:jso ...
第一個問題:什麼是作用域?
第二個問題:作用域在上面情況下形成?
第三個問題:什麼是變數提升,作用域鏈?
第四個問題:“=”賦值運算
第五個問題:生成對象的有幾種方式?
第六個問題:面向對象的三大特點
第七個問題:原型鏈
第八個問題:prototype和__proto__的區別?
第九個問題:json和Object的區別?
第十個問題:類和實例的關係?
第十一個問題:工廠模式和構造函數生成實例對象的指向?
第十二個問題:類的原型指定或不指定一個對象?
第十三個問題:this的指向問題和方法中this的指向問題?改變this的幾種方法?
第十四個問題:鏈式寫法的實現原理?
第十五個問題:原型的批量添加和對象添加的區別?
第十六個問題:怎麼給內置對象添加方法?
第十七個問題:什麼是深拷貝和淺拷貝?
第一個問題:什麼是作用域?
首先我們要知道什麼是作用域?瀏覽器給(js)的生存環境就叫作用域,也叫棧記憶體。
當然還有一個堆記憶體,什麼是堆記憶體就是存放代碼塊的空間。
第二個問題:作用域在上面情況下形成?
(1)瀏覽器天生有一個全局叫window
(2)函數執行時會形成一個私有作用域
第三個問題:什麼是變數提升,作用域鏈?
這是變數提升它也叫預解釋,js代碼執行前,瀏覽器會給js一個全局環境也叫全局作用域(也叫window),window分兩個模塊,存儲模塊和執行模塊,存儲模塊找到所有待var 和 function 的關鍵字,給這些遍歷添加記憶體地址,執行模塊代碼從上到下執行,遇到變數就去存儲模塊查找,看有沒有,有就看賦值沒有賦值就是後面的值,沒賦值就是undefined,沒有就是 is not defined。
函數內部的變數被使用時,首先會在自己的私有作用域下查找是否有這個變數,有就使用,沒有就向它的父級查找,父級有就使用,沒有就繼續向上查找,直到查找到window,window有就使用沒有就是is not defined。這種查找機制我們叫作用域鏈。
第四個問題:“=”賦值運算
=賦值運算,就是把等號後面的值賦給等號前面的變數。
後面的數據分兩種
基本數據類型:基本數據類型就是簡單的賦值。
引用數據類型(複合數據類型)就是把記憶體地址賦值給變數。
第五個問題:生成對象的有幾種方式?
第一種:單例模式
第二種:工廠模式
第三種:構造函數
第四種:類的實例
其中構造函數扮演三種角色,普通對象,普通函數,和類
第六個問題:面向對象的三大特點
封裝:減少代碼冗餘,提高代碼重覆利用率
繼承:子類繼承父類。
多態:以後在說
第七個問題:原型鏈
duixiang.shuxing 的時候,首先看這個屬性是私有的還是公有的,私有有就直接使用,如果私有屬性沒有那就找公有的,公有有就使用,公有屬性沒有那就通過__proto__找它類上有沒有,直到找到基類Object,如果Object沒有那就是undefined。
第八個問題:prototype和__proto__的區別?
他倆都是原型,prototype是函數屬性,__proto__是對象屬性,prototype是給程式員用的,__proto__用於給瀏覽器查找原型的。
第九個問題:json和Object的區別?
二者長得一樣,都是以鍵值對形式存放,Object可以不帶引號,json必須帶引號,Object是前端數據類型,json是資料庫存放數據的數據格式。
第十個問題:類和實例的關係?
每個類(函數)都有一個prototype屬性,屬性是個對象,裡面有一個constructor屬性,指向當前類本身。
每個實例(對象)都天生有一個__proto__的屬性,屬性也是個對象,它指向當前類的原型。
第十一個問題:工廠模式和構造函數生成實例對象的指向?
工廠模式生成的實例對象的__proto__直接指向基類Object的原型。
構造函數生成的實例對象的__proto__指向它父類的原型,父類的原型的__proto__再指向基類Obcect的原型。
第十二個問題:類的原型指定或不指定一個對象?
如果不給這個類的原型指定一個對象,這個實例對象的__proto__上有一個constructor的屬性。
如果給這個類的原型指定一個對象,這個實例對象的__proto__就沒有constructor屬性。
第十三個問題:this的指向問題和方法中this的指向問題?改變this的幾種方法?
1.this是一個對象,函數外的this指向window
2.函數內的this,給函數在哪定義沒關係,給函數在哪調用有關,看函數前面有沒有 . 有點this就指向點前面的對象,沒有就指向window。
3.定時器里的this永遠指向window,自執行里的this也指向window。
4.構造函數和原型上的this指向它的實例對象
5.方法中this,在調用方法時,看方法點前面是誰,this就指向誰。
改變this有幾種方法?
提前聲明一個變數,var _this=this
apply()call() bind()
apply()和call()執行是一樣的,都是將函數的this改成第一個參數,並將函數執行,不同的是從第二個參數開始apply()是有關數組,
bind() 只改變函數內this,不執行函數,如果執行就要人為定義,在後面加有關()
第十四個問題:鏈式寫法的實現原理
每個方法使用完畢之後,不僅可以得到想要的結果,還需要把實例對象給調用,才可以實現鏈式寫法。
第十五個問題:原型的批量添加和對象添加的區別?
如果是批量添加:不會改變原型上的記憶體地址(瀏覽器開闢的)
如果是對象添加:會改變原型上的記憶體地址(瀏覽器開闢的就會被銷毀)
第十六個問題:怎麼給內置對象添加方法?
有兩種,用對象形式添加,會不起作用,Array.prototype={sun:function}錯的,瀏覽器會保護內置對象的原型地址
批量添加:是可以的 Array.prototype.age=45;
第十七個問題:什麼是深拷貝和淺拷貝?
淺拷貝:就是將一個對象的屬性一個一個的複製到另一個對象,主要針對第一層的。
深拷貝:如果對象中的屬性值又有一個引用數據類型,淺拷貝還會把後面的引用數據類型地址賦給空對象的屬性,深拷貝會把屬性值一個一個的遍歷賦值。
作者:晉飛翔
QQ(微信同步)318080891