版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
前端程序員面試分類真題12簡答題1.
假設(shè)有兩個變量a和b,它們的值都是數(shù)字,如何在不借用第三個變量的情況下,把兩個變量對調(diào)?正確答案:把兩個變量對調(diào)的方法有很多,這里只介紹其中的3種。如下所示。(江南博哥)
(1)加減法:先把a(bǔ)和b相加得到一個和;然后把和賦給a;接著用和減去b得到a的值,再賦給b;最后用和減去當(dāng)前的b得到原先b的值,并賦給a。這樣就實(shí)現(xiàn)了對調(diào),具體如下所示。
a=a+b;
b=a-b;
a=a-b;
(2)按位異或法:按位異或(^)的運(yùn)算過程是當(dāng)兩個操作數(shù)對應(yīng)的二進(jìn)制位只有一個是1時才返回1,都是0或都是1時返回0。假設(shè)a的值為1,它的二進(jìn)制為0001,b的值為2,它的二進(jìn)制為0010。使用下面的計(jì)算方式來做對調(diào),首先a和b進(jìn)行按位異或運(yùn)算,a的值變?yōu)?011;然后讓b和a再進(jìn)行按位異或運(yùn)算,b的值變?yōu)?001,也就是1;最后讓a和b進(jìn)行按位異或運(yùn)算,a的值變?yōu)?010,也就是2。這樣就巧妙地實(shí)現(xiàn)了對調(diào)。
a^=b;
b^=a;
a^=b;
(3)逗號與數(shù)組的配合:這是最簡單的實(shí)現(xiàn)方法。首先創(chuàng)建一個數(shù)組,第一個元素是b,第二個元素是一個賦值表達(dá)式(b=a),a的值會賦給b;然后把數(shù)組的第一個元素賦給a,也就是b最初的值。這樣就能完成兩個變量之間的對調(diào)操作。
a=[b,(b=a)][0];[考點(diǎn)]基本語法
2.
封裝一個isInteger()函數(shù),用于檢測傳入的值是否為整數(shù)。正確答案:整數(shù)是指沒有小數(shù)的數(shù),包括正整數(shù)、負(fù)整數(shù)和零。在JavaScript中有3個特殊的數(shù)值:NaN,Infinity和-Infinity。isInteger()函數(shù)不僅要能識別出小數(shù),還要能識別出這3個特殊的數(shù)值。下面是一個滿足條件的isInteger()函數(shù)。
functionisInteger(value){
returntypeofvalue==="number"&&isFinite(value)&&value%1===0;
}
其中,typeof運(yùn)算符能夠檢測出變量的數(shù)據(jù)類型;全局函數(shù)isFinite()能夠判斷一個數(shù)字是否是有限數(shù)字;百分號(%)用于取得余數(shù),如果不是整數(shù),那么取得的余數(shù)不會是0。[考點(diǎn)]數(shù)據(jù)類型
3.
請重新封裝一個isNaN2()函數(shù),用來彌補(bǔ)全局函數(shù)isNaN()的不足。正確答案:全局函數(shù)isNaN()能夠判斷一個值是否是NaN,不過它有一個嚴(yán)重的缺陷,就是如果參數(shù)既不是NaN,也不是數(shù)字,例如是字符串,返回的結(jié)果不是false,而是true。因此需要加一個類型判斷,完善后的isNaN()函數(shù)如下所示。
functionisNaN2(value){
returntypeofvalue==="fnumber"&&isNaN(value);
}[考點(diǎn)]數(shù)據(jù)類型
4.
編寫一個函數(shù),讓兩個并不大的小數(shù)正確相乘。正確答案:由于JavaScript中的浮點(diǎn)數(shù)是基于IEEE754標(biāo)準(zhǔn)來實(shí)現(xiàn)的,因此它的計(jì)算精度遠(yuǎn)遠(yuǎn)不如整數(shù),例如33.98會顯示成33.979999999。如果兩個小數(shù)并不大,那么可以先將小數(shù)變成整數(shù),再執(zhí)行乘法運(yùn)算,最后把小數(shù)點(diǎn)往左移動到指定位置,得到想要的結(jié)果,具體如下所示。
functionaccMul(arg1,arg2){
varm=0,
s1=arg1.toString(),
s2=arg2.toString();
m+=s1.split(".")[1].length;
//第一個小數(shù)的位數(shù)
m+=s2.split(",")[1].length;
//第二個小數(shù)的位數(shù)
//兩個整數(shù)相乘
varresult=Number(s1.replace(".",""))*Number(s2.replace(".",""));
result/=Math.pow(10,m);
//小數(shù)點(diǎn)往左移動指定位數(shù)
returnresult;
}[考點(diǎn)]數(shù)據(jù)類型
5.
統(tǒng)計(jì)字符串“xxxxyyydda”中每個字母出現(xiàn)的次數(shù)。正確答案:首先定義一個空對象,然后用循環(huán)語句訪問字符串中的字符,再將字符作為對象的屬性。如果該屬性中已存在數(shù)字,那么就增加1,否則為該屬性定義一個數(shù)字1。最終在這個對象中就能包含每個字符出現(xiàn)的次數(shù),代碼如下所示。
varstr="xxxxyyydda",
length=str.length,
obj={},
current;
for(vari=0;i<length;i++){
current=str[i]fh
if(!obj[current]){
obj[current]=1;
continue;
}
obj[current]++;
}[考點(diǎn)]數(shù)據(jù)類型
6.
編寫一個函數(shù),求字符串的字節(jié)數(shù)。正確答案:目前HTML文檔中的內(nèi)容所用的字符編碼都推薦使用UTF-8,UTF-8是一種可變長度的Unicode編碼格式,使用1~4個字節(jié)為每個字符編碼,其具體的編碼規(guī)則如下所列:
(1)Unicode碼在0x0000~0x007F之間的用1個字節(jié)編碼。
(2)Unicode碼在0x0080~0x07FF之間的用2個字節(jié)編碼。
(3)Unicode碼在0x0800~0xFFFF之間的用3個字節(jié)編碼。
(4)Unicode碼在0x10000~0x10FFFF之間的用4個字節(jié)編碼。
例如1個英文字符對應(yīng)1個字節(jié),而1個中文字符或其他語言的字符對應(yīng)的可能是2個、3個或者是4個字節(jié)。String對象的原型方法charCodeAt()可返回指定位置的字符的Unicode碼,這是一個0~65535之間的整數(shù)。將這個值和上面的4個區(qū)間范圍做比較,就能知道需要使用幾個字節(jié)編碼,具體寫法如下所示。
functionsizeof(str){
varlength=str.length,
total=0,
code;
for(vari=0;i<length;i++){
code=str.charCodeAt(i);
if(code<=0x007f)
//規(guī)則一
total+=1;
elseif(code<=0x07ff)
//規(guī)則二
total+=2;
elseif(code<=0xffff)
//規(guī)則三
total+=3;
else
//規(guī)則四
total+=4;
}
returntotal;
}[考點(diǎn)]數(shù)據(jù)類型
7.
執(zhí)行下面的代碼,返回的結(jié)果是true,那么a的值是什么?
a==1&&a==2&&a==3正確答案:a可以是一個對象。當(dāng)相等運(yùn)算符的左邊是一個對象,右邊是一個數(shù)字時,對象要先做ToPrimitive抽象操作,即先調(diào)用valueOf()方法,如果返回基本類型的值就用該值。下面列舉了一個包含valueOf()方法的對象,方法中的digit屬性每執(zhí)行一次就做遞增操作,用此對象執(zhí)行剛剛的匹配就能返回true。
vara={
digit:1,
valueOf:function(){
returnthis,digit++;
}
};[考點(diǎn)]數(shù)據(jù)類型
8.
封裝一個函數(shù),能將字符串“abcdef”逆序?yàn)椤癴edcba”。正確答案:字符串類似于一個只讀的數(shù)組,它也包含一個length屬性,能夠獲取自身的長度,并且還能通過數(shù)字索引讀取到指定位置的字符。利用這些特點(diǎn),可以反序讀取字符串中的字符,再一個一個的拼接,最終就能獲得逆序的字符串,具體如下所示。
functionreverse(str){
varresult="",
begin=str.length-1;
for(vari=begin;i>=0;i--){
result+=str[i];
}
returnresult;
}[考點(diǎn)]數(shù)據(jù)類型
9.
請說明JavaScript中原生對象(nativeobjects)和宿主對象(hostobjects)的區(qū)別。正確答案:原生對象是由ECMAScript規(guī)范定義的對象,所有內(nèi)置對象都是原生對象,例如Array(數(shù)組)、Date(日期和時間)和RegExp(正則表達(dá)式)等。宿主對象是由宿主環(huán)境(如瀏覽器)定義的對象,用于完善ECMAScript的執(zhí)行環(huán)境,例如Document、Location和Navigator等。[考點(diǎn)]對象
10.
全局函數(shù)eval()有什么作用?正確答案:eval()可以執(zhí)行一段字符串中的腳本,它只有一個參數(shù),如果傳入的參數(shù)是非字符串類型的值,那么就直接返回該值。如果傳入字符串字面量,那么將被作為JavaScript代碼進(jìn)行編譯。當(dāng)編譯失敗時,拋出一個語法錯誤;當(dāng)編譯成功時,則開始執(zhí)行這段代碼,最后返回一個表達(dá)式或語句的值。eval()的具體用法如下所示。
eval(l);
//1
varstr="vartotal=100;console.log(total)";
eval(str);//100
在eval()中創(chuàng)建的變量或函數(shù)具有當(dāng)前執(zhí)行時所處的作用域,并且聲明不能被提升,因此如果在調(diào)用eval()之前使用函數(shù)中創(chuàng)建的變量,將會拋出未定義的異常,如下所示。
functionsum(){
vardigit=1;
console.log(total);
//拋出未定義的異常
eval("vartotal=100;");
//定義變量
console.log(total);
//total和digit的作用域相同
}
在嚴(yán)格模式中,eval()不能改變作用域,因此也就不能定義新的變量或函數(shù),如下所示。
functionsum(){
"usestrict";
eval("vartotal=100;");
//定義變量
console.log(total);
//拋出未定義的異常
}
eval()能夠編譯代碼字符串,它能力非常強(qiáng)大,同時也非常危險。如果傳入的是惡意代碼,那將會威脅站點(diǎn)的安全,造成不可估量的損失。[考點(diǎn)]對象
11.
編寫一個函數(shù),它沒有參數(shù),返回值是一個數(shù)組,數(shù)組內(nèi)是8個隨機(jī)且不重復(fù)的整數(shù),整數(shù)范圍在[5,20]之間。正確答案:根據(jù)要求可知,8個數(shù)字的范圍要在5~20之間(包含5和20)。為了讓這些數(shù)字能隨機(jī)產(chǎn)生,可以使用Math對象的random()方法得到隨機(jī)數(shù)。由于random()方法的返回值是一個在0和1之間的小數(shù),因此需要乘以一個合適的數(shù),再對小數(shù)部分做四舍五入后才能得到要求的整數(shù)。得到整數(shù)后,再判斷在數(shù)組中是否已存在,如果存在,就繼續(xù)執(zhí)行上述的隨機(jī)操作:如果不存在,就將該整數(shù)插入到數(shù)組中。具體寫法如下所示。
functiongetArray(){
vararr=[],
number;
for(vari=0;i<8;1++){
//隨機(jī)生成一個在0~15之間的數(shù),再對小數(shù)部分做四舍五入,
number=Math.round(Math.random()*15);
number+=5;
//與5相加,得到符合范圍的數(shù)
if(arr.indexOf(number)>=0){
1--;
//重復(fù)就將i變量減1
}else{
arr.push(number);
//不重復(fù)就插入到數(shù)組中
}
}
returnarr;
}[考點(diǎn)]對象
12.
為數(shù)字添加兩個方法:add()和minus(),分別表示加法和減法,例如下面的代碼相當(dāng)于表達(dá)式1+2-3。
(1).add(2).minus(3)正確答案:數(shù)字雖然是基本類型,但它卻可以像對象那樣擁有屬性或方法。之所以能這樣,是由于數(shù)字可被隱式封裝成包裝對象Number。如果要像上面代碼那樣進(jìn)行鏈?zhǔn)秸{(diào)用,可以在Number對象的原型上添加兩個方法,具體如下所示。
Ntotype.add=function(num){
returnthis+num;
};
Ntotype.minus=function(num){
returnthis-num;
};[考點(diǎn)]對象
13.
請簡單描述一下你所理解的原型鏈。正確答案:對象之間通過原型關(guān)聯(lián)到一起,就好比用一條鎖鏈將一個個對象連接在一起,在將各個對象掛鉤后,最終形成了一條原型鏈。在讀取對象的一個屬性時,會先在對象中查詢自有屬性,如果不存在,那么再沿著原型鏈向上搜索匹配的繼承屬性,直至找到或到達(dá)原型鏈頂端,才停止搜索。[考點(diǎn)]對象
14.
如何判斷對象中的某個屬性是繼承而來的?正確答案:將in運(yùn)算符和Object對象的hasOwnProperty()方法組合使用,能夠檢測一個屬性是否是繼承屬性,它們的用法如下表所列。檢測方式檢測方式描述in運(yùn)算符在對象的自有屬性或繼承屬性中包含要匹配的屬性時,就返回true,否則返回false使用Object的hasOwnProperty()在對象的自有屬性中包含要匹配的屬性時,就返回true,否則返回false
只要in運(yùn)算符返回true,而hasOwnProperty()方法返回false,就能確定這是個繼承屬性,代碼如下所示。
functionisInheritProperty(obj,name){
returnnameinobj&&!obj.hasOwnProperty(name);
}
varobj1={name:"strick"};
varobj2=Object.create(obj1);
isInheritProperty(obj2,"name");
//true[考點(diǎn)]對象
15.
用new運(yùn)算符創(chuàng)建對象時,例如newFn(),具體的創(chuàng)建過程有哪幾步?正確答案:大致可分為4步,如下所列:
(1)一個新對象被創(chuàng)建,它繼承自構(gòu)造函數(shù)的原型,即Ftotype。
(2)將指定的參數(shù)傳遞給構(gòu)造函數(shù)。
(3)將執(zhí)行上下文(this)綁定到新創(chuàng)建的對象中。
(4)如果構(gòu)造函數(shù)有返回值,那么這個返回值將取代第一步中新創(chuàng)建的對象。[考點(diǎn)]對象
16.
下面是一段用于對象繼承的代碼,請指出其中的不足,并提出改進(jìn)建議。
functionSuper(age){
s=[];
this.age=age;
}
functionSub(age){
}
Stotype=Stotype;正確答案:繼承是面向?qū)ο笳Z言的三大特征之一,JavaScript只支持實(shí)現(xiàn)繼承(而像Java那類語言還支持接口繼承),并且主要依靠原型鏈來實(shí)現(xiàn)。代碼中的繼承有兩個不足的地方,如下所列,每個不足之處都給出了相應(yīng)的改進(jìn)方法。
(1)不能向超類Super的構(gòu)造函數(shù)傳遞參數(shù)(超類中需要接收一個age參數(shù)),也不能使用超類中的自有屬性(如names和age)。改進(jìn)的方法就是在子類Sub的構(gòu)造函數(shù)中,顯式地調(diào)用超類的構(gòu)造函數(shù),如下所示。
functionSub(age){
Super.call(this,age);
}
(2)在子類Sub的原型中添加屬性或方法會影響超類的原型,例如給子類添加一個getShool()方法,其實(shí)就是在超類的原型上定義這個方法。以下代碼所示功能為創(chuàng)建一個超類的實(shí)例,也能成功調(diào)用getShool()方法。
Stotype.getShool=function(){
return"university";
};
varparent=newSuper(30);
parent.getShool();
//"university"
改進(jìn)方法就是用一個空的函數(shù)F()做中介,然后將超類的原型賦給這個空函數(shù)的原型,子類的原型再指向這個空函數(shù)的實(shí)例,這樣就能避免修改超類的原型,如下所示。
functioncreate(object){
functionF(){}
F.prototype=object;
returnnewF();
}
Stotype=create(Stotype);[考點(diǎn)]對象
17.
給定兩個字符串,檢測是否是改變字母順序而得到的字符串,例如“mena”是打亂“name”中的字母得到的。正確答案:檢測兩個字符串是否是改變字母順序而得到的,其實(shí)就是檢測它們包含的字母及其數(shù)量是否相同。因此只要讓兩個字符串中的字母按相同的順序排列,就能判斷出兩者是否相同。具體的實(shí)現(xiàn)思路是先用String對象的split()方法把兩個字符串分割成數(shù)組,然后用Array對象的sort()方法對它們的元素進(jìn)行相同的排序,接著再用join()方法將數(shù)組合并成字符串,最后檢測兩者是否相同,如下所示。
functionisEqual(str1,str2){
str1=str1.split("").sort().join("");
str2=str2.split("").sort().join("");
returnstr1==str2;
}[考點(diǎn)]對象
18.
JSON格式的數(shù)據(jù)與XML格式的數(shù)據(jù)相比,有哪些優(yōu)勢?正確答案:JSON格式的數(shù)據(jù)主要有如下4個優(yōu)勢:
(1)語法格式
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 英語-山東省淄博市2024-2025學(xué)年第一學(xué)期高三期末摸底質(zhì)量檢測試題和答案
- 小學(xué)一年級100以內(nèi)
- 《管飼患者臨床護(hù)理》課件
- 小學(xué)數(shù)學(xué)五年級下分?jǐn)?shù)混合運(yùn)算
- 《施工視頻截圖》課件
- 《管子加工及連接》課件
- 《刑事訴訟法立案》課件
- 廣東省深圳市福田區(qū)2023-2024學(xué)年高三上學(xué)期期末考試英語試題
- 《滴眼藥水的護(hù)理》課件
- 游戲行業(yè)技術(shù)工作概覽
- 水利水電工程安全管理制度例文(三篇)
- 2025四川宜賓市南溪區(qū)屬國企業(yè)招聘融資人員6人管理單位筆試遴選500模擬題附帶答案詳解
- DB45T 2048-2019 微型消防站建設(shè)管理規(guī)范
- 2025年超星爾雅學(xué)習(xí)通《勞動通論》章節(jié)測試題庫及參考答案(培優(yōu))
- SCTP大云云計(jì)算PT2題庫【深信服】認(rèn)證考試題庫及答案
- 外研版(2024新版)七年級上冊英語期末質(zhì)量監(jiān)測試卷 3套(含答案)
- 《測土配方施肥》課件
- 新疆烏魯木齊市(2024年-2025年小學(xué)六年級語文)統(tǒng)編版質(zhì)量測試(上學(xué)期)試卷及答案
- 人教版2024-2025學(xué)年第一學(xué)期八年級物理期末綜合復(fù)習(xí)練習(xí)卷(含答案)
- 職業(yè)健康檢查管理制度
- 電梯維保管理體系手冊
評論
0/150
提交評論