你不知道的javascript(上券)

第一部分

第2章

  • 什么是詞法作用域?動(dòng)態(tài)作用域?js所采用的作用域模型是哪種?
    首先什么是作用域译荞,簡(jiǎn)單來(lái)說(shuō)就是限定一段代碼的作用范圍滑进,詞法作用域就是作用域是由你在寫(xiě)代碼聲明時(shí)決定的,動(dòng)態(tài)作用域則是由調(diào)用時(shí)決定的.js采用的是詞法作用域
  • 欺騙詞法方式有?
    eval,with

第3章

  • 什么是函數(shù)作用域?塊級(jí)作用域?
    在js的es6之前,大多數(shù)情況下只有兩種作用域,函數(shù)作用域和全局作用域,就是在一個(gè)函數(shù)function里面會(huì)產(chǎn)生一個(gè)作用域.塊級(jí)作用域則是在{...},在es6出現(xiàn)了塊級(jí)作用域.
  • 函數(shù)中作用域有什么用?
    函數(shù)中的作用域可以使內(nèi)容私有化,規(guī)避沖突,外部無(wú)法訪問(wèn)
  • 匿名函數(shù)和具名函數(shù)有啥區(qū)別?
    匿名函數(shù)可讀性差,調(diào)試?yán)щy,引用自身比較麻煩(類(lèi)似在遞歸里)
  • 只有函數(shù)作用域會(huì)帶來(lái)一些什么問(wèn)題?
    比較明顯的類(lèi)似if語(yǔ)句,在if語(yǔ)句里面申明一個(gè)變量,會(huì)導(dǎo)致變量聲明的提示,污染全局
if(false){
    var a = 2;
}
console.log(a); //undefined 不是a is not defined,
//不管if是否執(zhí)行,var a都會(huì)提升到作用域的最頂端,一不小心很容易出問(wèn)題

for (var i = 0; i < 5; i++) {}
    console.log(i);//5 這種也會(huì)造成一定程度的內(nèi)存泄漏和全局污染
  • let,const作用?
    提供塊級(jí)作用域,聲明變量不會(huì)提示,同一個(gè)作用域內(nèi)不能多次聲明
  • 在es6前如何制造塊級(jí)作用域?
    可以利用try catch
try{
    throw undefined
}catch (a){
    a = 2;
    console.log(a); //2
}
console.log(a);//a is not defined
  • 什么是變量聲明的提升?
    在es5里函數(shù)聲明和變量聲明都會(huì)提升到當(dāng)前作用域的頂端,其中函數(shù)聲明的優(yōu)先級(jí)會(huì)高于變量聲明,如果函數(shù)聲明的名字和變量一樣,不管順序如何,函數(shù)的聲明會(huì)覆蓋變量的聲明
  • 什么是閉包?
    好像到今天,我才真正懂什么是閉包,閉包不是什么特別牛逼的東西,大致來(lái)說(shuō)就是一個(gè)函數(shù)里面的子函數(shù)能訪問(wèn)父函數(shù)里面的變量,本質(zhì)上就是外部函數(shù)和內(nèi)部函數(shù)連接的橋梁.
function a() {
    var num = 1;
    function b() {
        console.log(num);//這種現(xiàn)象就是閉包
    }
}
function a() {
    var num = 1;
    function b() {
        console.log(num);//這就是閉包
    }
    return b
}

var b = a();
b(); //2,這里就是利用閉包的特性獲取到里面
console.log(num);//num is not defined
  • IIFE自執(zhí)行函數(shù)是什么?
    (function(){})(),其實(shí)和聲明一個(gè)變量賦值要執(zhí)行的函數(shù)再執(zhí)行是一樣的
(function () {
        var a = 1;
    })();
    
    function foo() {
        var a= 1;
    }
    foo();

就是利用函數(shù)會(huì)生成函數(shù)作用域的特性,自執(zhí)行函數(shù)可以寫(xiě)匿名函數(shù),比較方便,也少一個(gè)污染

第二部分

  • this是什么時(shí)候確定下來(lái)的?
    this是調(diào)用時(shí)確定的,根據(jù)調(diào)用時(shí)的綜合情況確定下來(lái)的
  • this的綁定方式有多少種?優(yōu)先級(jí)是?
    默認(rèn)綁定: 非嚴(yán)格模式下是window,嚴(yán)格模式下是undefined
    隱式綁定: 大概的說(shuō)是誰(shuí)調(diào)用指向誰(shuí),有時(shí)候會(huì)有多層引用的情況
const obj0 = {
        a: 0,
        foo: function () {
            console.log(this.a);
        }
    };
    const obj1 = {
        a:1,
        obj0:obj0
    };
    const obj2 = {
        a:2,
        obj1:obj1
    };
    obj2.obj1.obj0.foo();//0

這個(gè)時(shí)候就是最近的那層,像上面的例子就是obj0最近的一層調(diào)用的,還有一點(diǎn)要注意的就是函數(shù)的賦值會(huì)導(dǎo)致this的變化或者丟失

const obj0 = {
        a:0,
        foo:function () {
            console.log(this.a);
        }
    };
    const obj1 = {
        a:1,
        foo:obj0.foo
    };
    const obj2 = obj0.foo;
    obj1.foo();////1 這里和上面有所不同的地方是obj0.foo這個(gè)函數(shù)直接賦值給obj1.foo和obj2
    obj2();// undefined

顯式綁定:apply,call,bind,this指向傳入的參數(shù)
new綁定:this指向new新建的對(duì)象

  • apply,call,bind區(qū)別是?
    首先apply和call作用是一樣的,傳參方式不一樣apply(obj,[arg0,arg1,arg2]),call(obj,arg0,arg1,arg2),apply和call和bind的區(qū)別就是,apply和call是綁定了立即執(zhí)行返回且undefined,bind是綁定了不執(zhí)行返回綁定后的函數(shù)
  • new在函數(shù)里發(fā)生了什么?
    1,創(chuàng)建一個(gè)新的對(duì)象
    2.把這個(gè)對(duì)象的proto連接到構(gòu)造函數(shù)的prototype上
    3.把this指向這個(gè)對(duì)象
    4.若無(wú)renturn就返回這個(gè)對(duì)象
  • 箭頭函數(shù)this?前面4種方式?
    箭頭函數(shù)的this做過(guò)處理,在進(jìn)入函數(shù)前this指向哪里,進(jìn)入函數(shù)后就指向哪里,前面四種綁定this的方式在箭頭函數(shù)里面是無(wú)效的
  • null是否是Object類(lèi)型?
    嚴(yán)格上來(lái)說(shuō)null不是object類(lèi)型,typeof null為object只是js的一個(gè)bug,原因是因?yàn)閖s的變量存儲(chǔ)為2進(jìn)制.typeof會(huì)根據(jù)前面三位是否都為0判斷是否是object,而null前三位剛好為0
  • 為什么簡(jiǎn)單基本類(lèi)型能調(diào)用一些方法或者屬性?
    類(lèi)似str,num,boolean基本類(lèi)型本來(lái)是沒(méi)有屬性和方法的,但是在調(diào)用屬性和方法的時(shí)候,就是會(huì)自動(dòng)包裝成對(duì)應(yīng)的對(duì)象,然后引用后會(huì)銷(xiāo)毀
  • 對(duì)象的key是什么類(lèi)型的,不是會(huì)怎么樣?
    對(duì)象的key都是字符串類(lèi)型的,如果穿的不是字符串類(lèi)型也會(huì)轉(zhuǎn)化成字符串類(lèi)型,之前還想過(guò)利用對(duì)象key的唯一性去去重,但是key只能是字符串也就是'1',1,true,'true'這種類(lèi)型就會(huì)區(qū)分不了了
  • 數(shù)組下標(biāo)是什么類(lèi)型,若不是會(huì)怎么樣
    數(shù)組的下標(biāo)是數(shù)字類(lèi)型的,若傳的不是數(shù)字類(lèi)型,但是正整數(shù)的字符串形式,會(huì)轉(zhuǎn)化成對(duì)應(yīng)的數(shù)字
  • 深拷貝和淺拷貝有啥區(qū)別
    淺拷貝基本只是第一層斷開(kāi)聯(lián)羹唠,如果對(duì)象里面還有類(lèi)似對(duì)象數(shù)組之類(lèi)的引用類(lèi)型就會(huì)失效,深拷貝是完全的斷開(kāi)聯(lián)系,無(wú)論多少層
  • JSON.parse(JSON.stringify())的方式深拷貝對(duì)象有啥問(wèn)題?
    這樣確實(shí)在一定程度上能實(shí)現(xiàn)深層的深拷貝,但是會(huì)有一些問(wèn)題,例如如果有函數(shù)會(huì)消失,new Date對(duì)象會(huì)變成單純的字符串之類(lèi)的問(wèn)題
  • 淺拷貝的方式
    可以用for in循環(huán),object.assign,es6里面的{...}
  • 如何獲取屬性描述符?有什么屬性?有什么用?
    用getOwnPropertyDescriptor獲取
    const obj1 = {a:[1],b:2};
    console.log(Object.getOwnPropertyDescriptor(obj1, 'a'));
    //configurable: true enumerable: true value: [1] writable: true

有writable,value,enumerable,configurable,還可以設(shè)置set和get
value顯而易見(jiàn)就是值了,writable就是限制能否修改值也就是value的權(quán)限,enumerable就是可枚舉,如果設(shè)置為false,for in循環(huán)是拿不到的,es6的for of循環(huán)也一樣,但是hasOwnProperty判斷還是返回true的,in判斷也是返回true的.configurable就是能否配置,為false的時(shí)候,就不能修改屬性描述符了,而且是不可逆的,并且也不能刪掉這個(gè)屬性

  • 如何設(shè)置上述的特性
    用defineProperty設(shè)置
const obj1 = {a:[1],b:2};
    Object.defineProperty(obj1,'a',{
        value: 2,
        writable:false
    });
    console.log(Object.getOwnPropertyDescriptor(obj1, 'a'));
    //configurable: true enumerable: true value: 2 writable: false
  • get,set是什么?怎么設(shè)置?
const obj1 = {
        get a(){
            return 2
        }
    };
    Object.defineProperty(obj1,'b',{
        get(){
            return this.a*2
        }
    });
    console.log(obj1.a); //2
    console.log(obj1.b); //4

兩種方法設(shè)置,get和set最好成對(duì)出現(xiàn),否則會(huì)吃出現(xiàn)一些意料之外的問(wèn)題.這里附上嘗試?yán)胓et和set實(shí)現(xiàn)雙向數(shù)據(jù)綁定鏈接

  • 如何判斷屬性是不存在還是設(shè)置值為undefined
    利用hasOwnProperty判斷一下就可以了
  • 原型對(duì)象是什么
    新建一個(gè)對(duì)象的時(shí)候會(huì)創(chuàng)建一個(gè)新的空對(duì)象并和新建的對(duì)象產(chǎn)生關(guān)聯(lián),那個(gè)就是原型對(duì)象
  • 原型對(duì)象作用是什么
    構(gòu)造函數(shù)的原型對(duì)象的屬性和方法都可以被這個(gè)構(gòu)造函數(shù)創(chuàng)建的實(shí)例調(diào)用
  • 原型鏈?zhǔn)鞘裁?br> 每一個(gè)對(duì)象都有自己的原型對(duì)象,obj.proto會(huì)指向他構(gòu)造函數(shù)Obj.prototype,Obj.prototype也是一個(gè)對(duì)象,所以也有自己的原型對(duì)象,所以它指向Object.prototype,最后Object.prototype會(huì)指向null,也就是原型鏈的盡頭
  • for in循環(huán)會(huì)檢查原型鏈上面的屬性嗎?那我只要自身的怎么辦?
    for in會(huì)遍歷自身和整條原型鏈上面enumerable為true的所有屬性,如果只想要自身的屬性可以用hasOwnProperty判斷一下
  • 分析myObject.foo = 'bar'的幾種情況
    1.自身如果有這個(gè)屬性的,會(huì)去判斷writable是否為true,如果為true則直接替換,如果不為true則修改失敗,嚴(yán)格模式下會(huì)報(bào)錯(cuò),普通模式下會(huì)忽略
    2.自身沒(méi)有這個(gè)屬性的,會(huì)去原型鏈上面找,如果找到這個(gè)屬性的,判斷writeable,true則發(fā)送屏蔽屬性,就是在自身新建一個(gè)這個(gè)屬性,原型鏈上面那個(gè)就拿不到了.如果為false同樣會(huì)修改失敗
    3.如果自身和原型鏈上面都找不到這個(gè)屬性,則就直接添加到自身上
  • 如果writable阻止了我添加屬性,但是我又想添加怎么辦?
    只讀只是限制了=的方式修改屬性,我們可以用Object.defineProperty
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市猜敢,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖缩擂,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鼠冕,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡撇叁,警方通過(guò)查閱死者的電腦和手機(jī)供鸠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門(mén)畦贸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)陨闹,“玉大人,你說(shuō)我怎么就攤上這事薄坏∏骼鳎” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵胶坠,是天一觀的道長(zhǎng)君账。 經(jīng)常有香客問(wèn)我,道長(zhǎng)沈善,這世上最難降的妖魔是什么乡数? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮闻牡,結(jié)果婚禮上净赴,老公的妹妹穿的比我還像新娘。我一直安慰自己罩润,他們只是感情好玖翅,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著割以,像睡著了一般金度。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上严沥,一...
    開(kāi)封第一講書(shū)人閱讀 51,763評(píng)論 1 307
  • 那天猜极,我揣著相機(jī)與錄音,去河邊找鬼消玄。 笑死跟伏,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的莱找。 我是一名探鬼主播酬姆,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼奥溺!你這毒婦竟也來(lái)了辞色?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤浮定,失蹤者是張志新(化名)和其女友劉穎相满,沒(méi)想到半個(gè)月后层亿,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡立美,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年匿又,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片建蹄。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡碌更,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出洞慎,到底是詐尸還是另有隱情痛单,我是刑警寧澤,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布劲腿,位于F島的核電站旭绒,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏焦人。R本人自食惡果不足惜挥吵,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望花椭。 院中可真熱鬧忽匈,春花似錦、人聲如沸个从。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)嗦锐。三九已至嫌松,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間奕污,已是汗流浹背萎羔。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留碳默,地道東北人贾陷。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像嘱根,于是被迫代替她去往敵國(guó)和親髓废。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容