面向?qū)ο?/h3>
js原型鏈的繼承
靜態(tài)屬性怎么繼承
js原型鏈以及特點(diǎn)
面向?qū)ο笥心膸讉€(gè)特點(diǎn)
封裝,繼承,多態(tài)
對(duì)象的繼承
創(chuàng)建對(duì)象的幾種方式
繼承的兩種方法。
原型鏈繼承和類繼承。然后類繼承只繼承了實(shí)例屬性,沒有原型屬性。
原型鏈繼承可以繼承所有。然后用apply和call怎么繼承原型鏈上的共享屬性?通過空函數(shù)傳值。新建一個(gè)空函數(shù)C。C實(shí)例化后C的實(shí)例屬性就是空,然后用B的apply/call去繼承C,相當(dāng)于繼承了C的實(shí)例屬性
JS怎么實(shí)現(xiàn)繼承
將父對(duì)象的一個(gè)實(shí)例賦值給子對(duì)象的原型
js實(shí)現(xiàn)繼承的5種方式
new操作符時(shí)具體是干了些什么
New:
1、創(chuàng)建一個(gè)空對(duì)象,并且 this 變量引用該對(duì)象,同時(shí)還繼承了該函數(shù)的原型。
2、屬性和方法被加入到 this 引用的對(duì)象中。
3、新創(chuàng)建的對(duì)象由 this 所引用,并且最后隱式的返回 this 。
怎么判斷屬性來自對(duì)象自身還是原型鏈
hasOwnProperty
一個(gè)對(duì)象的實(shí)例,如何統(tǒng)計(jì)被幾次調(diào)用過,分別具體被哪些函數(shù)調(diào)用過,可以有哪些方法
寫個(gè)Animal類
有個(gè)Cat類繼承它,要求新建一個(gè)Cat的實(shí)例,可以調(diào)用catch方法輸出自己的名字“大白的貓”;
實(shí)現(xiàn)私有變量
(這里當(dāng)時(shí)還沒看到相關(guān)部分,只能想到用屬性的setter、getter來做。。。??面試官各種啟發(fā)呀。。);
手寫一個(gè)類的繼承,并解釋一下
手寫JS實(shí)現(xiàn)類繼承,講原型鏈原理
數(shù)組
Array對(duì)象自帶的方法,一一列舉
var arr = [0,1,2];
1.pop():刪除數(shù)組的最后一個(gè)元素,減少數(shù)組的長(zhǎng)度,返回刪除的值。
這里是2.
2.push(3):將參數(shù)加載到數(shù)組的最后,返回新數(shù)組的長(zhǎng)度。
現(xiàn)在arr中是:0,1,2,3
3.shift():刪除數(shù)組的第一個(gè)元素,返回刪除的值,同時(shí)數(shù)組長(zhǎng)度減一。
這里是0
4.unshift(3,4):把參數(shù)加載數(shù)組的前面,返回新數(shù)組的長(zhǎng)度。
現(xiàn)在arr:中是3,4,0,1,2
5.sort():按指定的參數(shù)對(duì)數(shù)組進(jìn)行排序 ,返回的值是經(jīng)過排序之后的數(shù)組
var a = [0,1,5,10,15];
var b = a.sort(); // a:[1,2,3,4,5] b:[0,1,10,15,5]
正確的排序:
function compare(val1, val2) {
return val1 - val2;
}
arr = [3,7,6];
arr.sort(compare); // 3,6,7
6.reverse():反轉(zhuǎn)數(shù)組項(xiàng)的順序,返回的值是經(jīng)過排序之后的數(shù)組
7.concat(3,4):把兩個(gè)數(shù)組拼接起來。 返回的值是一個(gè)副本
8.slice(start,end):返回從原數(shù)組中指定開始下標(biāo)到結(jié)束下標(biāo)之間的項(xiàng)組成的新數(shù)組
var colors = ["red", "green", "blue", "yellow", "purple"];
// 一個(gè)參數(shù):[ ,+∞)
var color1 = colors.slice(1);
alert(color1); // green,blue,yellow,purple
// 兩個(gè)參數(shù):[,)
var color2 = colors.slice(1,4);
alert(color2); // green,blue,yellow
6splice():
刪除: 2個(gè)參數(shù),起始位置,刪除的項(xiàng)數(shù)
插入: 3個(gè)參數(shù),起始位置,刪除的項(xiàng)數(shù),插入的項(xiàng)
替換:任意參數(shù),起始位置,刪除的項(xiàng)數(shù),插入的任意數(shù)量的項(xiàng)
var colors = ["red", "green", "blue"];
var removed = colors.splice(0,1); // 刪除第一項(xiàng)
alert(colors); // green,blue
alert(removed); // red,返回?cái)?shù)組中只包含一項(xiàng)
removed = colors.splice(1, 0, "yellow", "orange"); // 從位置1開始插入兩項(xiàng)
alert(colors); // green,yellow,orange,blue
alert(removed); // 返回的數(shù)組是一個(gè)空數(shù)組
removed = colors.splice(1, 1, "red", "purple"); // 從位置I開始插入兩項(xiàng)
alert(colors); // green,red,yellow,orange,blue
alert(removed); // yellow,返回的數(shù)組中只包含一項(xiàng)
indexOf()和lastIndexOf():接受兩個(gè)參數(shù),要查找的項(xiàng)(可選)和查找起點(diǎn)位置的索引
indexOf():從數(shù)組開頭向后查找
lastIndexOf():從數(shù)組末尾開始向前查找
every():對(duì)數(shù)組中的每一項(xiàng)運(yùn)行給定函數(shù),如果該函數(shù)對(duì)每一項(xiàng)都返回true,則返回true。
filter():對(duì)數(shù)組中的每一項(xiàng)運(yùn)行給定函數(shù),返回該函數(shù)會(huì)返回true的項(xiàng)組成數(shù)組。
forEach():對(duì)數(shù)組的每一項(xiàng)運(yùn)行給定函數(shù),這個(gè)方法沒有返回值。
map():對(duì)數(shù)組的每一項(xiàng)運(yùn)行給定函數(shù),返回每次函數(shù)調(diào)用的結(jié)果組成的數(shù)組。
some():對(duì)數(shù)組的每一項(xiàng)運(yùn)行給定參數(shù),如果該函數(shù)對(duì)任一項(xiàng)返回true,則返回true。以上方法都不會(huì)修改數(shù)組中的包含的值。
reduce()和reduceRight():縮小數(shù)組的方法,這兩個(gè)方法都會(huì)迭代數(shù)組的所有項(xiàng),然后構(gòu)建一個(gè)最終返回的值。
join(separator):將數(shù)組的元素組起一個(gè)字符串,以separator為分隔符,省略的話則用默認(rèn)用逗號(hào)為分隔符
var a = [1,2,3,4,5];
var b = a.join("|"); //a:[1,2,3,4,5] b:"1|2|3|4|5"
Array對(duì)象自帶的排序函數(shù)底層是怎么實(shí)現(xiàn)的
數(shù)組去重
思路:
1.創(chuàng)建一個(gè)新的數(shù)組存放結(jié)果
2.創(chuàng)建一個(gè)空對(duì)象
3.for循環(huán)時(shí),每次取出一個(gè)元素與對(duì)象進(jìn)行對(duì)比,如果這個(gè)元素不重復(fù),則把它存放到結(jié)果數(shù)組中,同時(shí)把這個(gè)元素的內(nèi)容作為對(duì)象的一個(gè)屬性,并賦值為1,存入到第2步建立的對(duì)象中。
說明:至于如何對(duì)比,就是每次從原數(shù)組中取出一個(gè)元素,然后到對(duì)象中去訪問這個(gè)屬性,如果能訪問到值,則說明重復(fù)。
Array.prototype.unique3 = function(){
var res = []; // 創(chuàng)建一個(gè)新的數(shù)組存放結(jié)果
var json = {}; // 創(chuàng)建一個(gè)空對(duì)象
for(var i = 0; i < this.length; i++){
if(!json[this[i]]){ // json不為空的時(shí)候
res.push(this[i]); // 把元素依次放入到res中
json[this[i]] = 1; //?
}
}
return res; // 返回res
}
var arr = [112,112,34,'你好',112,112,34,'你好','str','str1'];
alert(arr.unique3()); // 調(diào)用unique3函數(shù)
數(shù)組去除一個(gè)函數(shù)。
用arr.splice。又問splice返回了什么?應(yīng)該返回的是去除的元素。
你知道偽數(shù)組嗎
這里把符合以下條件的對(duì)象稱為偽數(shù)組:
1,具有l(wèi)ength屬性
2,按索引方式存儲(chǔ)數(shù)據(jù)
3,不具有數(shù)組的push,pop等方法
如
1,function內(nèi)的arguments 。
2,通過document.forms,F(xiàn)orm.elements,Select.options,document.getElementsByName() ,document.getElementsByTagName() ,childNodes/children 等方式獲取的集合(HTMLCollection,NodeList)等。
3,特殊寫法的對(duì)象 ,如
var obj={};
obj[0] = "一";
obj[1] = "二";
obj[2] = "三";
obj.length = 3;
那你重新設(shè)計(jì)一下這個(gè)函數(shù),讓它直接擁有數(shù)組的方法吧
// 方法一、 聲明一個(gè)空數(shù)組,通過遍歷偽數(shù)組把它們重新添加到新的數(shù)組中,大家都會(huì),這不是面試官要的
var aLi = document.querySelectorAll('li');
var arr = [];
for (var i = 0; i < aLi.length; i++) {
arr[arr.length] = aLi[i]
}
// 方法二、使用數(shù)組的slice()方法 它返回的是數(shù)組,使用call或者apply指向偽數(shù)組
var arr = Array.prototype.slice.call(aLi);
實(shí)現(xiàn)sum(2,3);sum(2,3,4);sum(2,3,4,5);
(我用了比較原始的方法,if來判斷)
那如果sum里面的參數(shù)不確定呢
(提取arguments的長(zhǎng)度,用for循環(huán))
手寫一個(gè)遞歸函數(shù)(考察arguments.callee,以及arguments的解釋)
// arguments.callee 是一個(gè)指向正在執(zhí)行函數(shù)的指針
function factorial(num) {
if (num <= 1) {
return 1;
}
else {
return num * arguments.callee(num - 1);
}
}