前端常見面試題(十)@郝晨光


new操作符干了什么?

我們可以一起通過代碼實現(xiàn)來看看new關(guān)鍵字到底做了一些什么事情

function Book(name) {
    this.name = name;
}
Book.prototype.say = function() {
    console.log(this.name);
};
let book = new Book('javascript高級程序設(shè)計');
console.log(book);
book.say();

輸出結(jié)果如下圖:


new操作符實例化構(gòu)造函數(shù)

上例中挺据,new關(guān)鍵字調(diào)用的構(gòu)造函數(shù)并沒有任何返回值绘盟,最終我們實例創(chuàng)建了一個對象,那如果構(gòu)造函數(shù)擁有返回值呢谦去?new關(guān)鍵字會如何處理

function Test(name) {
    this.conname = name;
    return 1
}
Test.prototype.say = function() {
    console.log(this.conname);
};
let test = new Test('測試');
console.log(test);
test.say();
new操作符對于擁有返回值的構(gòu)造函數(shù)

上例中憎蛤,構(gòu)造函數(shù)返回了一個基本數(shù)據(jù)類型的值外傅,而最終我們依舊拿到了想要的實例對象。那如果構(gòu)造函數(shù)返回一個引用類型的值呢蹂午?

function Test(name) {
    this.conname = name;
    return {
        name
    }
}
Test.prototype.say = function() {
    console.log(this.conname);
};
let test = new Test('測試');
console.log(test);
test.say();

上例中栏豺,構(gòu)造函數(shù)最終返回了一個對象,這個對象上有name屬性豆胸,然后在構(gòu)造函數(shù)的prototype上奥洼,還擁有say方法,我們看看這次new得到的值是什么晚胡,是否擁有構(gòu)造函數(shù)prototype上的方法


new操作符對于擁有返回值的構(gòu)造函數(shù)

可以看到的是灵奖,我們拿到的對象是最終構(gòu)造函數(shù)return出來的那個對象,而這個對象頁沒有構(gòu)造函數(shù)prototype上的say方法

經(jīng)過測試估盘,我們發(fā)現(xiàn)

  1. new關(guān)鍵字 通過構(gòu)造函數(shù)創(chuàng)建出來的實例可以訪問到構(gòu)造函數(shù)中的屬性
  2. new關(guān)鍵字 通過構(gòu)造函數(shù)創(chuàng)建出來的實例可以訪問到構(gòu)造函數(shù)原型鏈中的屬性瓷患,也就是說通過 new 操作符,實例與構(gòu)造函數(shù)通過原型鏈連接了起來
  3. new關(guān)鍵字 操作的構(gòu)造函數(shù)如果返回基本類型遣妥,那么這個返回值毫無意義
  4. new關(guān)鍵字 操作的構(gòu)造函數(shù)如果返回引用類型擅编,那么這個返回值會被正常使用

通過上述的一些測試,我們可以自己試著實現(xiàn)一下new關(guān)鍵字;

自己實現(xiàn)new關(guān)鍵字

function Book(name) {
    this.name = name;
}
Book.prototype.say = function() {
    console.log(this.name);
};
function myNew(Constructor, ...args) {
    let obj = {};
    obj.__proto__ = Constructor.prototype;
    let result = Constructor.call(obj, ...args);
    return result instanceof Object ? result : obj;
}
let book = myNew(Book, 'javascript高級程序設(shè)計');
console.log(book);
book.say();
// 本文由郝晨光整理并總結(jié)爱态,未經(jīng)授權(quán)禁止轉(zhuǎn)載
自己實現(xiàn)new關(guān)鍵字

總結(jié) new關(guān)鍵字到底做了些什么

  1. 先創(chuàng)建了一個新的空對象
  2. 然后讓這個空對象的proto指向函數(shù)的原型prototype
  3. 將對象作為函數(shù)的this傳進去谭贪,如果return 出來東西是對象的話就直接返回 return 的內(nèi)容,沒有的話就返回創(chuàng)建的這個對象



null和undefined的區(qū)別锦担?

在javascript中俭识,null和undefined都用來表示一個空的值,

null

null類型洞渔,代表“空值”套媚,代表一個空對象指針,使用typeof運算得到 “object”磁椒,所以你可以認為它是一個特殊的對象值堤瘤。
使用場景

  1. 作為函數(shù)的參數(shù),表示該函數(shù)的參數(shù)不是對象浆熔;
  2. 作為對象原型鏈的終點宙橱。

undefined

undefined類型,代表“未定義”蘸拔,代表一個變量已經(jīng)聲明但是還未賦值,就是此處應(yīng)該有一個值环葵,但是還沒有定義调窍。
使用場景

  1. 變量被聲明了,但沒有賦值時张遭,就等于undefined邓萨。
  2. 調(diào)用函數(shù)時,應(yīng)該提供的參數(shù)沒有提供菊卷,該參數(shù)等于undefined缔恳。
  3. 對象沒有賦值的屬性,該屬性的值為undefined洁闰。
  4. 函數(shù)沒有返回值時歉甚,默認返回undefined。



eval是做什么的扑眉?

eval用來將字符串解析為javascript代碼并執(zhí)行

// 聲明變量
const str = "var a = 5,b = 10;"
eval(str);
console.log(a); // 5
console.log(b); // 10
// 返回運算值
const str2 = "5+10";
console.log(eval(str2)); // 15
// 本文由郝晨光整理并總結(jié)纸泄,未經(jīng)授權(quán)禁止轉(zhuǎn)載

eval還可以將JSON字符串轉(zhuǎn)換為JSON對象,例如:

const JSONStr = '[{name: "張三",age: 25},{name: "李四", age: 30}]';
let JSONObj = eval(JSONStr);
console.log(JSONObj); // [{name: "張三",age: 25},{name: "李四", age: 30}]

需要注意的是:我們應(yīng)該避免使用eval腰素,它并不安全聘裁,而且非常耗性能(需要先將字符串轉(zhuǎn)換為javascript代碼,然后再執(zhí)行)弓千。



iframe的優(yōu)缺點

什么是iframe衡便?

iframe就是框架網(wǎng)頁就是在同一個頁面里有多個網(wǎng)頁,使用框架的好處就是你在請求一個網(wǎng)頁的下一個頁面的時候,還有 一個網(wǎng)頁是一直顯示著的,這樣瀏覽者就不會就的等待的存在了;
iframe也稱作嵌入式框架,嵌入式框架和框架網(wǎng)頁類似,它可以把一個網(wǎng)頁的框架和內(nèi)容嵌入在現(xiàn)有的網(wǎng)頁中镣陕。

iframe的使用方法

iframe使用很簡單谴餐,使用src屬性指向另一個你需要包含的另一個文件即可,也可以設(shè)置元素的寬茁彭,高等总寒。比如:

<iframe 
    name="list-frame"   // 規(guī)定 iframe 的名稱。
    marginwidth="0"     // 定義 iframe 的左側(cè)和右側(cè)的邊距理肺。
    marginheight="0"    // 定義 iframe 的頂部和底部的邊距摄闸。
    width="100%"        // 定義 iframe 的寬度。
    height="300px"      // 規(guī)定 iframe 的高度妹萨。
    src="list.html"     // 規(guī)定在 iframe 中顯示的文檔的 URL年枕。
    frameborder="0"     // 規(guī)定是否顯示框架周圍的邊框。取值:0/1
    scrolling="auto"    // 規(guī)定是否在 iframe 中顯示滾動條乎完。取值:yes/no/auto
></iframe>

iframe的優(yōu)缺點

優(yōu)點
  1. iframe能夠原封不動的把嵌入的網(wǎng)頁展現(xiàn)出來熏兄。
  2. 如果有多個網(wǎng)頁引用iframe,那么你只需要修改iframe的內(nèi)容树姨,就可以實現(xiàn)調(diào)用的每一個頁面內(nèi)容的更改摩桶,方便快捷。
  3. 網(wǎng)頁如果為了統(tǒng)一風(fēng)格帽揪,頭部和版本都是一樣的硝清,就可以寫成一個頁面,用iframe來嵌套转晰,可以增加代碼的可重用芦拿。
  4. 如果遇到加載緩慢的第三方內(nèi)容如圖標和廣告,這些問題可以由iframe來解決查邢。
缺點
  1. 頁面樣式調(diào)試麻煩蔗崎,出現(xiàn)多個滾動條;
  2. 瀏覽器的后退按鈕失效扰藕;
  3. 過多會增加服務(wù)器的HTTP請求缓苛;
  4. 小型的移動設(shè)備無法完全顯示框架;
  5. 產(chǎn)生多個頁面实胸,不易管理他嫡;
  6. 不容易打印庐完;
  7. iframe會阻塞主頁面的Onload事件
  8. 占用資源钢属。每增加一個 iframe,相當于多增加一個獨立的窗口门躯,每個 iframe 中都需要占用獨立的資源淆党。
  9. 代碼復(fù)雜,無法被一些搜索引擎解讀。


如果本文對您有幫助染乌,可以看看本人的其他文章:
前端常見面試題(九)@郝晨光
前端常見面試題(八)@郝晨光
前端常見面試題(七)@郝晨光

友情鏈接:純原生實現(xiàn)彈出層 @程程程

結(jié)言
感謝您的查閱山孔,本文由郝晨光整理并總結(jié),代碼冗余或者有錯誤的地方望不吝賜教荷憋;菜鳥一枚台颠,請多關(guān)照
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市勒庄,隨后出現(xiàn)的幾起案子串前,更是在濱河造成了極大的恐慌,老刑警劉巖实蔽,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件荡碾,死亡現(xiàn)場離奇詭異,居然都是意外死亡局装,警方通過查閱死者的電腦和手機坛吁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來铐尚,“玉大人拨脉,你說我怎么就攤上這事⌒觯” “怎么了女坑?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長统舀。 經(jīng)常有香客問我,道長劳景,這世上最難降的妖魔是什么誉简? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮盟广,結(jié)果婚禮上闷串,老公的妹妹穿的比我還像新娘。我一直安慰自己筋量,他們只是感情好烹吵,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著桨武,像睡著了一般肋拔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上呀酸,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天凉蜂,我揣著相機與錄音,去河邊找鬼。 笑死窿吩,一個胖子當著我的面吹牛茎杂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播纫雁,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼煌往,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了轧邪?” 一聲冷哼從身側(cè)響起刽脖,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎闲勺,沒想到半個月后曾棕,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡菜循,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年翘地,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片癌幕。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡衙耕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出勺远,到底是詐尸還是另有隱情橙喘,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布胶逢,位于F島的核電站厅瞎,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏初坠。R本人自食惡果不足惜和簸,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望碟刺。 院中可真熱鬧锁保,春花似錦、人聲如沸半沽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽者填。三九已至浩村,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間占哟,已是汗流浹背穴亏。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工蜂挪, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人嗓化。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓棠涮,卻偏偏與公主長得像,于是被迫代替她去往敵國和親刺覆。 傳聞我的和親對象是個殘疾皇子严肪,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355