題目1
咋一看這題目,還以為答案選擇B呢,其實正確答案為D,知道原因嗎?接著往下看
map對數組的每個元素調用定義的回調函數并返回包含結果的數組,咋一看還以為它會像如下這樣執行:
function testFuc(a){ return parseInt(a); } console.info(["1","2","3"].map(testFuc));
但事實上,map中回調函數的語法如下所示:function callbackfn(value, index, arr),可使用最多三個參數來聲明回調函數。第一參數value,數組元素的值;第二個參數index,數組元素的數組所以;arr,包含該元素的數組對象。
所以事實上題目執行的原理如下所示:
function testFuc(a,x){ return parseInt(a,x); } console.info(["1","2","3"].map(testFuc));
也就是[parseInt(1,0),parseInt(2,1),parseInt(3,2)] 所以最終答案是[1, NaN, NaN]
題目2
這個題目相對來說比較簡單,答案為A
typeof用以獲取一個變量或者表達式的類型,typeof一般只能返回如下幾個結果:number,boolean,string,function(函數),object(NULL,數組,對象),undefined。
instanceof 表示某個變量是否是某個對象的實例,null是個特殊的Object類型的值 ,表示空引用的意思 。但null返回object這個其實是最初JavaScript的實現的一個錯誤
題目3
其實這個題目前面一部分的執行原理如下所示(pow() 方法可返回 x 的 y 次冪的值):
function testFuc(x,y){ console.info(x +" : "+y); return Math.pow(x,y); } console.info([3,2,1].reduce(testFuc));
但是要注意pow的參數都是必須的,[].reduce(Math.pow),等同于執行Math.pow();會導致錯誤
所以題目的答案為A
題目4
這個題目相信大家多會,題目會先執行字符串拼接,再執行三則運算,所以答案為A
題目5
相信大家看到湯姆大叔的JavaScript系列文章就知道js有變量提前聲明,但不會提前賦值
所以上述的答案是A
題目6
這個題目,我到現在也沒明白原因,但是書上解釋是說:
filter會接觸到沒有被賦值的元素,即在arr中,長度為10但實際數值元素列表為[0, 1, 2, 10],因此,最終返回一個空的數組[]
所以正確的答案為C
題目7
題目答案是C
大家都知道兩個浮點數相加或者相減,將會導致一定的正常的數據轉換造成的精度丟失問題eight-six = 0.20000000000000007。
JavaScript中的小數采用的是雙精度(64位)表示的,由三部分組成: 符 + 階碼 + 尾數,在十進制中的 1/10,在十進制中可以簡單寫為 0.1 ,但在二進制中,他得寫成:0.0001100110011001100110011001100110011001100110011001…..(后面全是 1001 循環)。因為浮點數只有52位有效數字,從第53位開始,就舍入了。這樣就造成了“浮點數精度損失”問題。
更嚴謹的做法是(eight-six ).toFiexd(1)或者用用Math.round方法回歸整數運算。
判斷兩個浮點數是否相等,還是建議用逼近的比較,比如if((a-b) < 1E-10)
題目8
可能大家都認為答案是A,可偏偏答案是C,為什么呢,事實上你可以在函數內把value的值打印出來就知道傳進去的到底是一個什么
使用new String(),使用構造函數調用,將一個全新的對象作為this變量的值,并且隱式返回這個新對象作為調用的結果
題目9
相信如果弄懂上面一題,這題目根本就太容易了,答案是A
直接調用String("A")創建的變量和"A"無異。
題目10
看了這題目有點暈,但是事實上
function isSane(num){ return isEven(num)||isOdd(num); }
該函數判斷num是否為正整數,'13'被強制轉換為數值13,-9%2結果為-1,Infinity %2為NaN
所以答案為C
題目11
答案為D
parseInt() 函數可解析一個字符串,并返回一個整數。當參數 radix 的值為 0,或沒有設置該參數時,parseInt() 會根據 string 來判斷數字的基數。
題目12
答案為A
在此特意說明一下,
Array.prototype為[],Array.isArray(a)是一個判斷a是否為數組的方法
判斷對象是否為數組的方法:
1)ES5函數isArray(),該函數測試對象的內部[[Class]]屬性是否為Array:
Arrray.isArray(a);
2)判斷對象的構造函數是否為Array:
a.constructor === Array
3)使用對象內部[[Class]]屬性創建結果字符串:
Object.prototype.toString.call(a)
4)使用instanceof操作符測試對象是否繼承自Array:(但由于,一個頁面的iframe不會繼承自另外一個頁面的iframe,該方法不可靠)
a instanceof Array
題目13
這個相對來說挺簡單的,你稍微仔細一點就會了,看看你做對了沒
在if條件判斷語句相對于==比較寬松中,只要if(n),n不為null,0,undefined數值,都會轉換為true。進入console.info(a == true);最終返回false
也就是說答案為B
題目14
這個答案為B,是因為數組在 Javascript 中是對象,對象使用 ==
比較都是比較的引用。簡單的說,就是,如果是同一個對象,就相等,如果不是同一個對象,就不等。每次使用 []
都是新建一個數組對象,所以 [] == []
這個語句里建了兩個數據對象,它們不等。
題目15
這個相信你只要懂JavaScript中的+號運算肯定能做對答案,答案是A
執行'5'+3,加號具備拼接字符串功能,會將3強制轉換為字符串'3'和'5'拼接。
執行'5'-3,減號只具備數值運算的功能,因此會將'5'轉化為數值,進行5-3的數值運算
題目16
答案為D
區分賦值和聲明。雖然var arr = Array(3);但它只創建一個長度為3的數組,后面的那句話才只為第一個元素賦值,因此arr的實際長度為1,即最終參與map的只有一個元素,結果返回
題目17
最終結果為10+1+10
所以答案為D
題目18
答案為B,您猜對了嗎??
原因是javascript的精確整數最大為:Math.pow(2,53)-1 =9007199254740991.
var a = 111111111111111110000,
max = 9007199254740992;
a的值大于javascript所能表示的最大整數精度,因此和任何數值相加將會導致失真。
題目19
大家在控制臺里面一測試就知道了
所以正確的調用方式應該是:x.call([])
答案不言而喻為C
題目20
在JavaScript中,Number.MIN_VALUE表示的最小值為5e-324,MIN_VALUE代表的并不是負最小,而是最接近0的一個數,因此Number.MIN_VALUE>0。
負最小值可以使用-Number.MAX_VALUE表示。
答案為A
題目21
這個不多說,答案為A
1<2,返回true,執行true<3,會強制將true轉換為1,1<3,最終返回true。
3<2,返回false,執行false<1,會強制將false轉換為0,0<1,最終返回true。
題目22
使用a==b判斷a和b對象是否相等,可以會將b對象強制轉換為a對象的類型,即執行2 == [[[2]]],會隱式調用parseInt([[[2]]])將[[[2]]]強制轉化為數字基本量,即2,2==2,最終返回true。
引用評論的一番話:
console.info([[2]]==2); //true
console.info([[2,2]]==2); //false
console.info(parseInt([[2,2]])); //2
可以說
如果數組中只有單個字符的話 隱式調用parseInt
答案為A
題目23
在立即調用函數內執行,var x1 =y1 =1;創建局部變量x1和全局變量y1。函數外部試圖訪問函數內部的變量,將會導致錯誤。
所以答案選擇C
![]() |
不含病毒。www.avast.com |