自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

30個你 “ 不可能全部會做 ” 的javascript題目及答案

開發(fā) 前端 開發(fā)工具
本文章包含了三十道javascript題目以及答案的詳細解析。

[[132842]]

1,以下表達式的運行結(jié)果是:

["1","2","3"].map(parseInt)

  A.["1","2","3"]

  B.[1,2,3]

  C.[0,1,2]

  D.其他 

2,以下表達式的運行結(jié)果是:

[typeof null, null instanceof Object]

  A.["object",false]

  B.[null,false]

  C.["object",true]

  D.其他

3,以下表達式的運行結(jié)果是:

[[3,2,1].reduce(Math.pow),[].reduce(Math.pow)]

  A.報錯

  B.[9,0]

  C.[9,NaN]

  D.[9,undefined]

4,以下表達式的運行結(jié)果是:

var val = 'value';
console.info('Value id '+(val === 'value')?'Something':'Nothing');

  A.Something

  B.Nothing

  C.NaN

  D.其他

5,以下表達式的運行結(jié)果是:

var name = 'World';
(function(){
if(typeof name === 'undefined'){
var name = "Jack";
console.info('Goodbye '+ name);
}else{
console.info('Hello ' + name);
}
})();

  A.Goodbye Jack

  B.Hello Jack

  C.Goodbye undefined

  D.Hello undefined

6,以下表達式的運行結(jié)果是:

var START = END -100;
var count = 0;

for(var i = START ; i <= END ;i++){
count ++;
}
console.info(count);

  A.0

  B.100

  C.101

  D.其他

7,以下表達式的運行結(jié)果是:

var arr = [0,1,2];
arr[10] = 10;
arr.filter(function(x){return x === undefined});

  A.[undefined x 7]

  B.[0,1,2,10]

  C.[]

  D.[undefined]

8,以下表達式的運行結(jié)果是:

var two = 0.2;
var one = 0.1;
var eight = 0.8;
var six = 0.6;
[two -one == one,eight- six == two];

  A.[true,true]

  B.[false,false]

  C.[true,false]

  D.其他

9,以下表達式的運行結(jié)果是:

function showCase(value){

  switch(value){
case 'A':
console.info('Case A');
break;
case 'B':
console.info('Case B');
break;
case undefined :
console.info('undefined');
break;
default:
console.info('Do not know!');
}
}
showCase(new String('A'));

  A.Case A

  B.Case B

  C.Do not know

  D.undefined

10,以下表達式的運行結(jié)果是:

function showCase(value){

  switch(value){
case 'A':
console.info('Case A');
break;
case 'B':
console.info('Case B');
break;
case undefined :
console.info('undefined');
break;
default:
console.info('Do not know!');
}
}
showCase(String('A'));

  A.Case A

  B.Case B

  C.Do not know

  D.undefined

11,以下表達式的運行結(jié)果是:

function isOdd(num){
return num % 2 == 1;
}
function isEven(num){
return num % 2 == 0;
}
function isSane(num){
return isEven(num)||isOdd(num);
}
var values = [7,4,'13',-9,Infinity];
values.map(isSane);

  A.[true, true, true, true, true]

  B.[true, true, true, true, false]

  C.[true, true, true, false, false]

  D.[true, true, false, false, false]

12,以下表達式的運行結(jié)果是:

[parseInt(3,8),parseInt(3,2),parseInt(3,0)]

  A.[3,3,3]

  B.[3,3,NaN]

  C.[3,NaN,NaN]

  D.其他

13,以下表達式的運行結(jié)果是:

 Array.isArray(Array.prototype)

  A.true

  B.false

  C.報錯

  D.其他

14,以下表達式的運行結(jié)果是:

var a = [0];
if([0]){
console.info(a == true);
}else{
console.info("else");
}

  A.true

  B.false

  C."else"

  D.其他 

15,以下表達式的運行結(jié)果是:

[]==[]

  A.true

  B.false

  C.報錯

  D.其他

#p#

16,以下表達式的運行結(jié)果是:

[('5'+3),('5'-3)]

  A.["53",2]

  B.[8,2]

  C.報錯

  D.其他

17,以下表達式的運行結(jié)果是:

1+-+++-+1

  A.true

  B.false

  C.報錯

  D.其他 

18,以下表達式的運行結(jié)果是:

var arr = Array(3);
arr[0] = 2
arr.map(function(elem){return '1';});

  A.[2,1,1]

  B.["1","1","1"]

  C.[2,"1","1"]

  D.其他

19,以下表達式的運行結(jié)果是:

function sidEffecting(arr){
arr[0] = arr[2];
}
function bar(a,b,c){
c = 10;
sidEffecting(arguments);
return a+b+c;
}
bar(1,1,1);

  A.3

  B.12

  C.報錯

  D.其他

20,以下表達式的運行結(jié)果是:

var a = 111111111111111110000;
b = 1111;
console.info(a+b);

  A.111111111111111111111

  B.111111111111111110000

  C.NaN

  D.Infinity 

21,以下表達式的運行結(jié)果是:

ar x = [].reverse;
x();

  A.[]

  B.undefined

  C.報錯

  D.window

22,以下表達式的運行結(jié)果是:

Number.MIN_VALUE>0

  A.true

  B.false

  C.報錯

  D.其他

23,以下表達式的運行結(jié)果是:

[1<2<3,3<2<1]

  A.[true,true]

  B.[true,false]

  C.報錯

  D.其他

24,以下表達式的運行結(jié)果是:

2 == [[[2]]]

  A.true

  B.false

  C.undefined

  D.其他

25,以下表達式的運行結(jié)果是:

[3.toString(),3..toString(),3...toString()]

  A.["3",error,error]

  B.["3","3.0",error]

  C.[error,"3",error]

  D.其他

26,以下表達式的運行結(jié)果是:

(function(){
var x1 =y1 =1;
})();

console.info(y1);
console.info(x1);

  A.1,1

  B.error,error

  C.1,error

  D.其他

27,列舉IE和FF腳本兼容性的問題

28,以下函數(shù)有什么問題?如何改進?

function initButtons(){
var body = document.body,button,i;

  for(i =0;i<5;i++){
button = document.createElement("button");
button.innerHTML = "Button" + i;
button.addEventListener("click",function(e){
alert(i);
},false);
body.appendChild(button);
}

}
initButtons();

29,寫一段代碼,判斷一個字符串中出現(xiàn)次數(shù)最多的字符,并統(tǒng)計出現(xiàn)的次數(shù)。

30,請問一下兩段代碼有什么不同?

setTimeout(function(){

  /*代碼塊*/

  setTimeout(arguments.callee,10);

},10);

setInterval(function(){

  /*代碼塊*/

},10);

#p#

1,D

map對數(shù)組的每個元素調(diào)用定義的回調(diào)函數(shù)并返回包含結(jié)果的數(shù)組。["1","2","3"].map(parseInt)對于數(shù)組中每個元素調(diào)用paresInt。但是該題目不同于:

function testFuc(a){
        return parseInt(a);
}
console.info(["1","2","3"].map(testFuc));

題目等同于:


function testFuc(a,x){
        return parseInt(a,x);
}
console.info(["1","2","3"].map(testFuc));

map中回調(diào)函數(shù)的語法如下所示:function callbackfn(value, index, array1),可使用最多三個參數(shù)來聲明回調(diào)函數(shù)。***參數(shù)value,數(shù)組元素的值;第二個參數(shù)index,數(shù)組元素的數(shù)組所以;array1,包含該元素的數(shù)組對象。

因此,題目等同于[parseInt(1,0),parseInt(2,1),parseInt(3,2)]

最終返回[1, NaN, NaN]

2,A

typeof用以獲取一個變量或者表達式的類型,typeof一般只能返回如下幾個結(jié)果:

number,boolean,string,function(函數(shù)),object(NULL,數(shù)組,對象),undefined。

instanceof 表示某個變量是否是某個對象的實例,null是個特殊的Object類型的值 ,表示空引用的意思 。但null返回object這個其實是最初JavaScript的實現(xiàn)的一個錯誤,
然后被ECMAScript沿用了,成為了現(xiàn)在的標準,不過我們把null可以理解為尚未存在的對象的占位符,這樣就不矛盾了 ,雖然這是一種“辯解”。
對于我們開發(fā)人員 還是要警惕這種“語言特性”。最終返回:["object", false]

3,A

pow() 方法可返回 x 的 y 次冪的值。[3,2,1].reduce(Math.pow);等同于:

function testFuc(x,y){
        console.info(x +" : "+y);
        return Math.pow(x,y);
}
console.info([3,2,1].reduce(testFuc));

執(zhí)行Math.pow(3,2)和Math.pow(2,1),最終返回9和9。

但是要注意pow的參數(shù)都是必須的,[].reduce(Math.pow),等同于執(zhí)行Math.pow();會導致錯誤。

4,A

先執(zhí)行字符串拼接,再執(zhí)行校驗

var val = 'value';
 console.info('Value id '+(val === 'value123')?'Something':'Nothing');

同樣會返回something

***

判斷語句被包裹在立即調(diào)用函數(shù)里,函數(shù)內(nèi)部無法訪問外部值為'World'的name,因此typeof name === 'undefined'為真,執(zhí)行下一步操作,最終輸出Goodbye Jack

6,D
END = 9007199254740992 ,START = 9007199254740892目的是計算的END和START之間的差。但是2的53次方計算出的結(jié)果由于精度問題使得i++失效。

7,C

filter會接觸到?jīng)]有被賦值的元素,即在arr中,長度為10但實際數(shù)值元素列表為[0, 1, 2, 10],因此,最終返回一個空的數(shù)組[]

8,C

兩個浮點數(shù)相加或者相減,將會導致一定的正常的數(shù)據(jù)轉(zhuǎn)換造成的精度丟失問題eight-six = 0.20000000000000007。

JavaScript中的小數(shù)采用的是雙精度(64位)表示的,由三部分組成: 符 + 階碼 + 尾數(shù),在十進制中的 1/10,在十進制中可以簡單寫為 0.1 ,但在二進制中,他得寫成:0.0001100110011001100110011001100110011001100110011001…..(后面全是 1001 循環(huán))。因為浮點數(shù)只有52位有效數(shù)字,從第53位開始,就舍入了。這樣就造成了“浮點數(shù)精度損失”問題。

更嚴謹?shù)淖龇ㄊ?eight-six ).totoFiexd(1)或者用用Math.round方法回歸整數(shù)運算。判斷兩個浮點數(shù)是否相等,還是建議用逼近的比較,比如if((a-b) < 1E-10)

 9,C

使用new String()使用構(gòu)造函數(shù)調(diào)用講一個全新的對象作為this變量的值,并且隱式返回這個新對象作為調(diào)用的結(jié)果,因此showCase()接收的參數(shù)為String {0: "A"}為不是我們所認為的“A”

10,A

直接調(diào)用String("A")創(chuàng)建的變量和"A"無異。

var a="123"    '只是設置變量
b=new String('123') '設置一個成員

var a="123";
a.sex=1;
alert(a.sex);//輸出未定義,因為不是成員,沒有這屬性

b=new String('123');
b.sex=1;
alert(b.sex);//輸出1,成員的屬性

11,C

function isSane(num){
return isEven(num)||isOdd(num);
}

該函數(shù)判斷num是否為正整數(shù),'13'被強制轉(zhuǎn)換為數(shù)值13,-9%2結(jié)果為-1,Infinity %2為NaN

12,D
最終結(jié)果為[3, NaN, 3];
parseInt() 函數(shù)可解析一個字符串,并返回一個整數(shù)。當參數(shù) radix 的值為 0,或沒有設置該參數(shù)時,parseInt() 會根據(jù) string 來判斷數(shù)字的基數(shù)。

13,A
Array.prototype為[],Array.isArray(a)是一個判斷a是否為數(shù)組的方法。

判斷對象是否為數(shù)組的方法:
1)ES5函數(shù)isArray(),該函數(shù)測試對象的內(nèi)部[[Class]]屬性是否為Array:
Arrray.isArray(a);
2)判斷對象的構(gòu)造函數(shù)是否為Array:
a.constructor === Array
3)使用對象內(nèi)部[[Class]]屬性創(chuàng)建結(jié)果字符串:
Object.prototype.toString.call(a)
4)使用instanceof操作符測試對象是否繼承自Array:
(但由于,一個頁面的iframe不會繼承自另外一個頁面的iframe,該方法不可靠)
a instanceof Array

14,B
在if條件判斷語句相對于==比較寬松中,只要if(n),n不為null,0,undefined數(shù)值,都會轉(zhuǎn)換為true。進入console.info(a == true);最終返回false。

15,B
數(shù)組,在 Javascript 中是對象,對象使用 == 比較都是比較的引用。簡單的說,就是,如果是同一個對象,就相等,如果不是同一個對象,就不等。每次使用 [] 都是新建一個數(shù)組對象,所以 [] == [] 這個語句里建了兩個數(shù)據(jù)對象,它們不等。

#p#

16,A
執(zhí)行'5'+3,加號具備拼接字符串功能,會將3強制轉(zhuǎn)換為字符串'3'和'5'拼接。
執(zhí)行'5'-3,減號只具備數(shù)值運算的功能,因此會將'5'轉(zhuǎn)化為數(shù)值,進行5-3的數(shù)值運算

17,C

18,D
區(qū)分賦值和聲明。雖然var arr = Array(3);創(chuàng)建一個長度為3的數(shù)組,但是實際只有一個元素被賦值,因此arr的實際長度為1,即最終參與map的只有一個元素,返回[1]

19,D
按照執(zhí)行步驟,無需多疑,最終結(jié)果為10+1+10

20,B
js的精確整數(shù)***為:Math.pow(2,53)-1 =9007199254740991.
var a = 111111111111111110000,
 max = 9007199254740992;
a的值大于javascript所能表示的***整數(shù)精度,因此和任何數(shù)值相加將會導致失真。
深入理解可以查看http://www.zhihu.com/question/24423421

21,C
 正確調(diào)用方式為x.call([])

22,B
Number.MIN_VALUE表示的最小值為5e-324,MIN_VALUE代表的并不是負最小,而是最接近0的一個數(shù),因此Number.MIN_VALUE>0。
負最小值可以使用-Number.MAX_VALUE表示。

23,A
1<2,返回true,執(zhí)行true<3,會強制將true轉(zhuǎn)換為1,1<3,最終返回true。
3<2,返回false,執(zhí)行false<1,會強制將false轉(zhuǎn)換為0,0<1,最終返回true。

24,A
使用a==b判斷a和b對象是否相等,可以會將b對象強制轉(zhuǎn)換為a對象的類型,即執(zhí)行2 == [[[2]]],會隱式調(diào)用parseInt([[[2]]])將[[[2]]]強制轉(zhuǎn)化為數(shù)字基本量,即2,2==2,最終返回true。

25,C
Number中的toString(a),能夠?qū)?shù)值轉(zhuǎn)化成為a進制的值。但a缺省時,默認轉(zhuǎn)化為十進制。
一般使用方法為:var n = 3;3.toString();
執(zhí)行3.toString(),因為3只是為數(shù)值型變量,為非Number實例,因此對于3不能直接調(diào)用Number方法。而執(zhí)行3..toString(),會強制將3轉(zhuǎn)化為數(shù)字實例,因此能夠被解釋,輸出3,同樣可以使用(3).toString()。

26,C
在立即調(diào)用函數(shù)內(nèi)執(zhí)行,var x1 =y1 =1;創(chuàng)建局部變量x1和全局變量y1。函數(shù)外部試圖訪問函數(shù)內(nèi)部的變量,將會導致錯誤。

27,
列舉IE和FF腳本兼容性的問題
(1)window.event
表示當前的事件對象,IE有這個對象,F(xiàn)F沒有
(2)獲取事件源
IE用srcElement獲取事件源,而FF用target獲取事件源
(3)添加、移除事件
IE:element.attachEvent("onclick",function)
element.detachEvent("onclick",function)
FF:element.addEventListener("click",function,true)
element.removeEventListener("click",function,true)

28,
題目所給出的代碼,除了有addEventListener不兼容IE瀏覽器的問題之外,最突出的一個問題是:
雖然在頁面上會顯示值為button+i的按鈕,但是點擊任意一個按鈕,最終都會顯示5。

要想點擊相關(guān)按鈕,彈出相應的1,2,3,4,5的值,需要理解閉包原理實現(xiàn)和使用立即回調(diào)函數(shù)。修改后的代碼如下:

  1. function initButtons(){ 
  2.         var body = document.body,button,i; 
  3.  
  4.         for(i =0;i<5;i++){ 
  5.             (function(i){ 
  6.                 button = document.createElement("button"); 
  7.                 button.innerHTML = "Button" + i; 
  8.                 button.addEventListener("click",function(e){ 
  9.                     alert(i); 
  10.                 },false); 
  11.                 body.appendChild(button); 
  12.             })(i); 
  13.              
  14.         } 
  15.  
  16.     } 
  17.     initButtons(); 


涉及綁定和賦值得到區(qū)別。在運行時,進入一個作用域,javascript會為每一個綁定到該作用域的變量在內(nèi)存中分配一個“槽”(slot)。函數(shù)中,創(chuàng)建變量document.body,button,i,因此當函數(shù)體(創(chuàng)建按鈕,并為按鈕綁定事件)被調(diào)用時,函數(shù)會為每個變量分配一個“槽”。在循環(huán)的每次迭代中,循環(huán)體都會為嵌套函數(shù)分配一個閉包。我們可能理解為,該函數(shù)存儲的是嵌套函數(shù)創(chuàng)建時變量i的值。但事實上,他存儲的是i的引用。由于每次函數(shù)創(chuàng)建后變量i的值都發(fā)生變化,因此函數(shù)內(nèi)部最終看到的是變量i的引用。閉包存儲的是外部變量的引用而非值。
立即調(diào)用的函數(shù)表達式,是一種不可或缺的解決javascript缺少塊級作用域的方法。
需要深入理解,可以查看《Effective JavaScript》第13條:使用立即調(diào)用的函數(shù)表達式創(chuàng)建局部作用域

29,使用常規(guī)方法和正則表達式匹配兩種算法

  1. /*寫一段代碼。判斷一個字符串中出現(xiàn)次數(shù)最多的字符串,并統(tǒng)計出現(xiàn)的次數(shù)*/ 
  2.    
  3.     function toGetTheMostCharsByArray(s){ 
  4.         var r={}; 
  5.         for(var i=0;i<s.length;i++){ 
  6.              
  7.             if(!r[s[i]]){ 
  8.                 r[s[i]] = 1; 
  9.             }else
  10.                 r[s[i]]++; 
  11.             } 
  12.         } 
  13.         var max = { 
  14.             "value " :s[0], 
  15.             "num" :  r[s[0]] 
  16.         }; 
  17.          
  18.         for(var n in r){//對象使用in關(guān)鍵字,因為沒有l(wèi)ength 
  19.  
  20.             if(r[n]>max.num){ 
  21.                 max.num = r[n]; 
  22.                 max.value = n;  
  23.             } 
  24.         } 
  25.         return max; 
  26.     } 
  27.     function toGetTheMostCharsByRegex(s){ 
  28.         var a = s.split(''); 
  29.         a.sort(); 
  30.         s = a.join(''); 
  31.  
  32.         var regex = /(\w)\1+/g ;//\1代表重復的 
  33.  
  34.         var max = { 
  35.             "value " :s[0], 
  36.             "num" :  0 
  37.         }; 
  38.          
  39.         s.replace(regex,function(a,b){ 
  40.             if(max.num < a.length){ 
  41.                 max.num = a.length; 
  42.                 max.value= b; 
  43.             } 
  44.         }); 
  45.  
  46.         return max; 
  47.  
  48.     } 
  49.     var test = "efdfssssfrhth"
  50.     console.info("使用常規(guī)方法 ,出現(xiàn)最多的字符串為:"+toGetTheMostCharsByArray(test).value+" ,出現(xiàn)次數(shù):"+toGetTheMostCharsByArray(test).num); 
  51.     console.info("使用字符串匹配,出現(xiàn)最多的字符串為:"+toGetTheMostCharsByRegex(test).value+" ,出現(xiàn)次數(shù):"+toGetTheMostCharsByRegex(test).num); 

30,
javascript的引擎是單線程的
javascript的引擎是基于事件驅(qū)動的
setTimeout和setInterval都是往事件隊列中增加一個待處理時間而已,setTimeout只觸發(fā)一次,而setInterval是循環(huán)觸發(fā)

setTimeout(function(){
    //代碼塊
    setTimeout(arguments.callee,10);
},10);

上段代碼可使得setTimeout循環(huán)觸發(fā)。但是,執(zhí)行完這段代碼塊才掛起時間,所以兩次執(zhí)行時間會大于10毫秒

setInterval(function(){
    /*代碼塊*/
},10);

而上段代碼,是自動在10的時候掛上這個事件,所以兩次事件的相隔會小于等于10毫秒。
當線程阻塞在一個事件的時候,不管是使用setInterval還是setTimeout都需要等待當前事件處理完才能執(zhí)行。
想進一步理解javascript線程阻塞,可以查看http://www.cnblogs.com/0603ljx/p/4387628.html里所提到的題目。

 

責任編輯:王雪燕 來源: 博客園
相關(guān)推薦

2023-12-05 07:19:43

CAP定理分布式

2021-04-20 08:11:33

Css前端@property

2016-03-14 14:45:18

中華網(wǎng)

2020-07-31 17:13:28

Python開發(fā)工具

2014-07-17 10:38:30

大數(shù)據(jù)

2019-01-02 06:26:02

API應用程序編程接口應用安全

2017-12-19 14:15:27

程序員愿望加班

2021-02-21 14:05:02

區(qū)塊鏈比特幣安全

2012-04-10 08:58:26

小米

2024-01-24 13:08:00

2016-09-01 16:37:24

2013-12-13 10:01:16

諾基亞安卓手機

2021-10-15 10:34:31

云計算制造業(yè)云應用

2012-03-13 14:14:37

啟明星辰終端管理產(chǎn)品

2019-09-16 20:00:52

C語言編程語言

2019-03-27 14:33:11

人工智能機器人職業(yè)

2018-06-06 16:41:53

Python高考考題

2018-07-26 08:13:31

根服務器網(wǎng)絡TCP

2013-07-02 09:26:11

IntelCEO代工

2012-03-24 21:26:56

點贊
收藏

51CTO技術(shù)棧公眾號