* __proto__和prototype
每個(gè)對(duì)象都有__proto__焦蘑,但只有函數(shù)有prototype。當(dāng)你創(chuàng)建函數(shù)時(shí),JS會(huì)為這個(gè)函數(shù)自動(dòng)添加prototype屬性您机,函數(shù)的prototype中是一個(gè)構(gòu)造函數(shù)constructor,constructor指向函數(shù)的申明
function test() {}
var t = test;
則t.prototype中有constructor構(gòu)造方法年局,且constructor = function test()
對(duì)象的__proto__指向自己構(gòu)造函數(shù)的prototype际看。obj.__proto__.__proto__...的原型鏈由此產(chǎn)生,包括我們的操作符instanceof正是通過探測(cè)obj.__proto__.__proto__... === Constructor.prototype來(lái)驗(yàn)證obj是否是Constructor的實(shí)例矢否。
參考:從__proto__和prototype來(lái)深入理解JS對(duì)象和原型鏈
* typeof運(yùn)算符和instanceof運(yùn)算符以及isPrototypeOf()方法的區(qū)別
* call()和apply()的區(qū)別
apply()的妙用:
Array.prototype.push(arr1, arr2):數(shù)組arr1和arr2合并
Math.max.apply(null,array):找出數(shù)組array中的最大值
* 描述以下變量的區(qū)別:null仲闽,undefined或undeclared
* ==和===有什么區(qū)別?
規(guī)定:
1僵朗、null ==??undefined 為true
2赖欣、==操作符任意一邊有NaN,則返回false
3验庙、!=操作符任意一邊有NaN顶吮,則返回true
比較時(shí)類型轉(zhuǎn)換的先后順序圖示:
JS布爾值(Boolean)轉(zhuǎn)換規(guī)則
* 什么是事件冒泡闸餐?什么是事件捕獲玛瘸?
* 如何從瀏覽器的URL中獲取查詢字符串參數(shù)序矩?
function?getUrlParam(name){
? ??var reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)');
????var result = window.location.search.substr(1).match(reg);
????return result ? decodeURIComponent(result[2]) : null;
}
* 請(qǐng)解釋一下JavaScript的同源策略
瀏覽器同源策略(SOP)的同源是指兩個(gè) URL 的協(xié)議/主機(jī)名/端口一致掉奄。例如蒂萎,https://www.taobao.com/pages/...草则,它的協(xié)議是?https屁桑,主機(jī)名是?www.taobao.com庙洼,端口是?443陨界。
同源策略作為瀏覽器的安全基石巡揍,其「同源」判斷是比較嚴(yán)格的,相對(duì)而言菌瘪,Cookie中的「同站」判斷就比較寬松:只要兩個(gè) URL 的 eTLD+1 相同即可腮敌,不需要考慮協(xié)議和端口阱当。其中,eTLD 表示有效頂級(jí)域名糜工,注冊(cè)于 Mozilla 維護(hù)的公共后綴列表(Public Suffix List)中弊添,例如,.com捌木、.co.uk油坝、.github.io 等。eTLD+1 則表示刨裆,有效頂級(jí)域名+二級(jí)域名澈圈,例如 taobao.com 等。
舉幾個(gè)例子帆啃,www.taobao.com 和?www.baidu.com?是跨站瞬女,www.a.taobao.com 和?www.b.taobao.com?是同站,a.github.io 和 b.github.io 是跨站(注意是跨站)努潘。
參考:瀏覽器系列之 Cookie 和 SameSite 屬性
* 通過new創(chuàng)建一個(gè)對(duì)象的時(shí)候诽偷,構(gòu)造函數(shù)內(nèi)部有哪些改變?
新建了一個(gè)對(duì)象A慈俯,將對(duì)象A的__propo__指向了構(gòu)造函數(shù)的prototype渤刃,并且將構(gòu)造函數(shù)的this指向了對(duì)象A
// 第一版代碼
function objectFactory() {
????var obj = new Object(),
????Constructor = [].shift.call(arguments); //取出第一個(gè)參數(shù),就是我們要傳入的構(gòu)造函數(shù)贴膘。此外因?yàn)?shift 會(huì)修改原數(shù)組,所以 arguments 會(huì)被去除第一個(gè)參數(shù)
????obj.__proto__ = Constructor.prototype; //將 obj 的原型指向構(gòu)造函數(shù)略号,這樣 obj 就可以訪問到構(gòu)造函數(shù)原型中的屬性
????Constructor.apply(obj, arguments);?//使用 apply刑峡,改變構(gòu)造函數(shù) this 的指向到新建的對(duì)象,這樣 obj 就可以訪問到構(gòu)造函數(shù)中的屬性
????return obj;
};
參考:JavaScript深入之new的模擬實(shí)現(xiàn)
* 請(qǐng)解釋JSONP的工作原理玄柠,以及它為什么不是真正的AJAX突梦。
* 繼承
function object(o) {
????function F() {}
????F.prototype = o;
????return new F();
}
function prototype(child, parent) {
????var prototype = object(parent.prototype); //將父類的原型賦值給一個(gè)空構(gòu)造函數(shù)的原型,并返回構(gòu)造函數(shù)創(chuàng)建的對(duì)象
????prototype.constructor = child; //將空對(duì)象的構(gòu)造函數(shù)指向子類
????child.prototype = prototype; //子類的原型指向空對(duì)象
}
JavaScript深入之繼承的多種方式和優(yōu)缺點(diǎn)
* 簡(jiǎn)述javascript中this的指向
簡(jiǎn)單總結(jié)就是羽利,如果對(duì)應(yīng)的Reference是對(duì)象宫患,this就是指向這個(gè)對(duì)象,否則this都是指向undefined
1.計(jì)算 MemberExpression(簡(jiǎn)單理解就是()左邊部分)的結(jié)果賦值給 ref
2.判斷 ref 是不是一個(gè) Reference 類型:
????2.1 如果 ref 是 Reference(包括undefined, an Object, a Boolean, a String, a Number, or an environment record)这弧,并且 IsPropertyReference(ref) 是 true(也就是base value是對(duì)象娃闲,base value就是指屬性所在的對(duì)象或者就是 EnvironmentRecord), 那么 this 的值為 GetBase(ref) (也就是base value的值)
????2.2 如果 ref 是 Reference,并且 base value 值是 Environment Record, 那么this的值為 ImplicitThisValue(ref)(規(guī)范規(guī)定匾浪,該函數(shù)始終返回 undefined)
????2.3 如果 ref 不是 Reference皇帮,那么 this 的值為 undefined
參考:JavaScript深入之從ECMAScript規(guī)范解讀this
*?a.x?=?a?=?{x:?2};
var?a?=?{n:?1};
var?b?=?a;
a.x?=?a?=?{x:?2};
console.log(a.x)? // 2
console.log(b.x) // { x: 2 }
參考:Javascript 面試題連等賦值 a.x = a = {n: 2}?
* let、const蛋辈、var 區(qū)別:
function retA() {
????var arr = [];
????for(var i = 0; i < 10; i++) {
????????arr[i] = function() {
????????????console.log(i);
????????}
????}
????return arr;
}
var testArr = retA();
for(var j = 0; j < testArr.length; j++) {
????testArr[j]();
}
MDN中l(wèi)et介紹?(與通過 ?var?聲明的有初始化值?undefined的變量不同,通過?let?聲明的變量直到它們的定義被執(zhí)行時(shí)才初始化)
JavaScript深入之變量對(duì)象?(通過活動(dòng)變量AO理解變量的幾個(gè)階段:「創(chuàng)建create、初始化initialize 和賦值assign」)
MDN中的var?(聲明和未聲明變量之間的差異)
* Promise相關(guān)面試題
const first = () => (new Promise((resolve,reject)=>{
? ? console.log(3);
? ? let p = new Promise((resolve, reject)=>{
? ? ? ? console.log(7);
? ? ? ? setTimeout(()=>{
? ? ? ? ? console.log(5);
? ? ? ? ? resolve(6);
? ? ? ? },0)
? ? ? ? resolve(1);
? ? });
? ? resolve(2);
? ? p.then((arg)=>{
? ? ? ? console.log(arg);
? ? });
}));
first().then((arg)=>{
? ? console.log(arg);
});
console.log(4);
參考:深入理解Promise運(yùn)行原理?(手動(dòng)實(shí)現(xiàn)Promise)
這一次渐白,徹底弄懂 JavaScript 執(zhí)行機(jī)制?(setTimeout尊浓、setInterval、Promise纯衍、宏任務(wù)栋齿、微任務(wù))
*?請(qǐng)?jiān)斒瞿銓?duì)vue生命周期的理解,包括每個(gè)階段數(shù)據(jù)對(duì)象和DOM的特點(diǎn)
created之前不能訪問data托酸,method等屬性褒颈、方法,mounted之前不能操作DOM節(jié)點(diǎn)励堡,update是有雙向綁定的數(shù)據(jù)變化時(shí)調(diào)用
參考:vue 生命周期深入?(父子組件的生命周期)
vue生命周期解析?(手動(dòng)實(shí)現(xiàn)生命周期方法)
* Vue原理深入理解
參考:【前端發(fā)動(dòng)機(jī)】深入 Vue 響應(yīng)式原理,從源碼分析
30 道 Vue 面試題应结,內(nèi)含詳細(xì)講解(涵蓋入門到精通刨疼,自測(cè) Vue 掌握程度)
深入剖析:Vue核心之虛擬DOM?(key的作用)
剖析Vue實(shí)現(xiàn)原理 - 如何實(shí)現(xiàn)雙向綁定mvvm(簡(jiǎn)化版)
*?Javascript中普通 for 循環(huán)和 forEach 的性能哪個(gè)好?為什么鹅龄?
參考:JavaScript 數(shù)組遍歷方法的對(duì)比
* Vuex工作原理
參考:vuex工作原理詳解
* Vue-Router原理
理解vue-router中(router-link router-view $router $route)實(shí)現(xiàn)原理(手動(dòng)實(shí)現(xiàn))
*?隱式類型轉(zhuǎn)換
* flex布局
*?Generator
* webpack基礎(chǔ)
[webpack] devtool里的7種SourceMap模式是什么鬼揩慕?