8.29做JS的題目
1.以下程式碼執行後,console的輸出是?
functionFoo(){
console.log(this.location);
}
Foo();
A.當前視窗的 Location 物件
B.undefined
C.null
D.TypeError
'use strict'條件下,會報TypeError 無'use strict'下,this指向window2.在 es6 中,下面程式執行結果輸出,選項結果正確的是
i not defined,TypeError,3,12,[2,3,4]
1.let 與var不同,存在塊級作用域,在for迴圈中宣告,迴圈之外銷燬 所以i not defined
2.const 宣告一個常量無法更改,所以TypeError
3.const 宣告的是一個常量所以是無法更改的
const a={x:1};
console.log(a.x);
a.x=5;
console.log(a);//Object {x: 5}
3.
console.log(1+ "2"+"2");
console.log(1+ +"2"+"2");
console.log("A"- "B"+"2");
console.log("A"- "B"+2);
如下程式碼輸出的結果是什麼:
122
32
NaN2
NaN
1做加法時要注意雙引號,當使用雙引號時,JavaScript認為是字串,字串相加等於字串合併。
2.第一個+"2"中的加號是一元加操作符,+"2"會變成數值2,因此1+ +"2"相當於1+2=3.然後和後面的字串“2”相合並,變成了字串"32".
3"A"-"B"的運算中,需要先把"A"和"B"用Number函式轉換為數值,其結果為NaN,在剪髮操作中,如果有一個是NaN,則結果是NaN,因此"A"-"B"結果為NaN。然後和"2"進行字串合併,變成了NaN2.
4.根據上題所述,"A"-"B"結果為NaN,然後和數值2進行加法操作,在加法操作中,如果有一個運算元是NaN,則結果為NaN。
4.下面有關JavaScript中call和apply的描述,錯誤的是?C
A.apply傳入的是一個引數陣列,也就是將多個引數組合成為一個數組傳入
B.call與apply都屬於Function.prototype的一個方法,所以每個function例項都有call、apply屬性
C.兩者傳遞的引數不同,call函式第一個引數都是要傳入給當前物件的物件,apply不是
D.call傳入的則是直接的引數列表。call 方法可將一個函式的物件上下文從初始的上下文改變為由 thisObj 指定的新物件。
call和apply的作用都是改變this作用域,都是在特定作用域中呼叫函式。當一個物件沒有某個方法,而其他物件有,我們就可以使用call或apply實現某個方法的複用.
5.
var a = [1,4,5,2,9];
下面求a中最大值正確的是
Math.max(a)
Array.max(a)
Math.max.call(null,a)
Math.max.apply(null,a)
以上均不是
1.Math.max不能接受一個數組作排除A 2.array沒有max()方法排除B 3.call第二個引數不能為陣列排除C6.在javascript中,()變數在函式外宣告,並可從指令碼的任意位置訪問 B
A.區域性
B.全域性
C.typeOf
D.New
7.語句var arr=[a,b,c,d];執行後,陣列arr中每項都是一個整數,下面得到其中最大整數語句正確的是哪幾項?
A.Math.max(arr)
B.Math.max(arr[0], arr[1], arr[2], arr[3])
C.Math.max.call(Math, arr[0], arr[1], arr[2], arr[3])
D.Math.max.apply(Math,arr)
Math.max(args...)傳入引數是任意數量的值 A 傳入陣列,所以錯誤 B 可以 C Function.call()可以傳入任意多個引數,C正確 D Function.apply()第二個引數以陣列形式傳遞,D正確8.在大資料量場景下,以下哪種js中字串連線方式較為高效()
a+=b
a=a+b
Array.join()
Array.push()
+的處理機制是:新建一個臨時字串,將新字串賦值為a+b,然後返回這個臨新字串並同時銷燬原始字串,所以字串連線效率較低。所以用Array.join()不會新建臨時字串效率更高。 (當然以上效率問題僅存在於低版本瀏覽器ie7-及以下,現在的新瀏覽器基本上都解決了這個問題,效率差不多) 所以在面試時遇到這種題時告訴面試官分兩種情況: 舊瀏覽器(ie7-)下用join()會高效,而新版本瀏覽器下除了做變數快取外不需要做別的優化。這樣可以側面表達對劉拉你相容有所瞭解。 C9.解釋型語言的特性有什麼?
非獨立:JavaScript語言依賴執行環境,對於客戶端來說是瀏覽器,對於服務端來說是node。 效率低:執行前不需要編譯,執行時才編譯,因此效率低。 解釋性語言和編譯性語言的定義:計算機不能直接理解高階語言,只能直接理解機器語言,所以必須要把高階語言翻譯成機器語言,計算機才能執行高階語言編寫的程式。
翻譯的方式有兩種,一個是編譯,一個是解釋。兩種方式只是翻譯的時間不同。
解釋性語言的定義:
解釋性語言的程式不需要編譯,在執行程式的時候才翻譯,每個語句都是執行的時候才翻譯。這樣解釋性語言每執行一次就需要逐行翻譯一次,效率比較低。
現代解釋性語言通常把源程式編譯成中間程式碼,然後用直譯器把中間程式碼一條條翻譯成目標機器程式碼,一條條執行。
編譯性語言的定義:
編譯性語言寫的程式在被執行之前,需要一個專門的編譯過程,把程式編譯成為機器語言的檔案,比如exe檔案,以後要執行的話就不用重新翻譯了,直接使用編譯的結果就行了(exe檔案),因為翻譯只做了一次,執行時不需要翻譯,所以編譯型語言的程式執行效率高。
10.以下哪些語句觸發了隱式的型別轉換?
parseInt(12.34, 10)
0 ? 1 : 2
2e1 * 0xaa
1 + '1'
- parseInt() 函式可解析一個字串,並返回一個整數。
所以說,number型別的12.34發生隱式轉換為string。 - 三元運算子,會判斷?前的表示式為true或者false。所以number型別的0發生了隱式轉換為boolean。
- +運算髮生了字串的隱式轉化。原本number型別的1,和string型別的'1'進行了+運算,連線了字串。返回'11'。
- C選項:
e是js裡面指數的一種表示形式。也就是10的多少次方。
2e1 等價於 2 *(10^1) = 20
2e2 等價於 2 *(10^2)= 200
0xaa是16進位制的表示方法。相當於十進位制的170。
這裡都是number型別,發生了數字的乘法運算:20*170,沒有發生型別轉換。