【錯題記錄】JavaScript專項練習(篇五)

Milk595發表於2020-12-14

1.以下程式執行後返回的結果是

var p1 = {
  name:'小明',
  age:'12',
  action:function(where,doing){
   console.log(this.age + '歲的'+this.name + '在' + where + doing);
  }  
}
var p2 = {
  name:'小紅',
  age:'15'
}
console.log(p1.action.call(p2,'操場上','運動'))

解析:答案 15歲的小紅在操場上運動

call 、bind 、 apply 這三個函式的第一個引數都是 this 的指向物件,第二個引數差別就來了:
call的引數是直接放進去的,第二第三第n個引數全都用逗號分隔,直接放到後面 obj.myFun.call(db,‘廣州’, …
,‘string’ ); apply的所有引數都必須放在一個陣列裡面傳進去 obj.myFun.apply(db,[‘廣州’, …,
‘string’ ]); bind除了返回是函式以外,它 的引數和call 一樣。
當然,三者的引數不限定是string型別,允許是各種型別,包括函式 、 object 等

可以觀看此連結:尚矽谷_call和apply


2. a 的結果是什麼

if(! "a" in window){
    var a = 1;
}
alert(a);

解析:答案:undefined

if(! “a” in window) 這句話程式碼的意思是:判斷全域性物件window中是否有變數a,如果沒有變數a,就進入判斷將a賦值為1,但由於變數的提升,上面程式碼等價於:

var a;
if (! "a" in window) {
  a = 1;
}
alert(a);

由於變數的提升,在執行這段程式碼之後,全域性物件window中就已經存在a這個變數了,所以不能進入判斷,對a進行賦值,所以a的值為undefined


3. JavaScript實現繼承的方式,不正確的是

a. 原型鏈繼承
b. 建構函式繼承
c. 組合繼承
d. 關聯繼承

解析:答案:d

點選?JavaScript實現繼承共6種方式:

原型鏈繼承、借用建構函式繼承、組合繼承、原型式繼承、寄生式繼承、寄生組合式繼承

4.以下程式碼執行後,a.x 和 b.x 的結果分別是

function A(x){
this.x = x;
}
A.prototype.x = 1;

function B(x){
this.x = x;
}
B.prototype = new A();
var a = new A(2), b = new B(3);
delete b.x;

解析:答案 2, undefined

B的prototype=new A(),想錯的可能認為建構函式的x沒有賦值就自動去原型找,錯了,如果建構函式沒有x才會去原型找,如果有x但是沒有賦值,則是undefined,相當於x=undefined.就不會進入原型鏈


5.

NOSCRIPT標籤用來定義在指令碼未被執行時的替代內容


6. 下列哪些事件不支援冒泡

a. resize
b. click
c. blur
d. mouseleave

解析:答案 a c d
冒泡事件很多,不支援冒泡事件如下:

1.focus
2.blur
3.mouseenter
4.mouseleave
5.load
6.unload
7.resize


7. 下面有關瀏覽器中使用js跨域獲取資料的描述,說法錯誤的是

a. 域名、埠相同,協議不同,屬於相同的域
b. js可以使用jsonp進行跨域
c. 通過修改document.domain來跨子域
d. 使用window.name來進行跨域

解析:答案 a

只要 協議 、 域名 、 埠任何一個 不同, 都被當作是 不同 的域
在這裡插入圖片描述


8. 以下程式碼執行後,控制檯的輸出是

var a = 10;
function a() {}
console.log(typeof a)

解析:答案 "number"

函式提升大於變數提升,變數提升會提升到除函式宣告的後面;變數提升,但是賦值不提升,程式碼等價於

function a() {}
var a;
a = 10;
console.log(typeof a)

9. 在瀏覽器控制檯執行以下程式碼,結果是(後續理解…)

在這裡插入圖片描述
解析:答案 4400 4401 4399 4400


10. 下面哪個不是RegExp物件的方法

a. test
b. match
c. exec
d. compile

解析:答案 match

在這裡插入圖片描述


11.如果需要匹配包含文字的元素,用下面哪種方法來實現

a. text()
b. contains()
c. input()
d. attr(name)

解析:答案 b

四個方法都是jq中的方法,注意題幹說的是匹配包含文字的元素

text()是設定或獲取元素文字內容

contains()是檢測元素是否含有相應的文字

input()選擇器,選取表單元素

attr(name,value)屬性操作,設定或返回被選元素的屬性和屬性值

12. document.getElementById(“info”).innerHTML 的值是

<div id=”info” style=”display:block”><p> 請填寫 </p></div>

解析:答案 <p>請填寫</p>
在這裡插入圖片描述


13. 如果不給cookie設定過期時間會怎麼樣

解析:答案 在瀏覽器會話結束時過期

cookie的有效時間預設為-1,如果不進行設定的話,就會預設在瀏覽器會話關閉時結束。

可以通過setMaxAge()方法設定cookie的生命期,當setMaxAge(0)表示立刻刪除該瀏覽器上指定的cookie


14. 以下選項描述錯誤的是

a. 在原型上擴充套件的可列舉方法,會被for in迴圈出來
b. 使用object.defineProperty可向物件新增或者修改屬性
c. 每個物件都有prototype屬性,返回物件型別原型的引用
d. 通過hasOwnProperty可判斷一個物件以及其原型鏈上是否具有指定名稱的屬性
e. 原型鏈是JS實現繼承的一種模型
f. for迴圈是按順序的,for in 迴圈是不一定按順序的

解析:答案 d
《你不知道的JS》(上)119頁:
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述


15. 下面哪些方法可以用作javascript非同步模式的程式設計

a. 回撥函式 (非同步程式設計最基本的方法)
b. 事件監聽
c. 釋出/訂閱
d. Promises物件

解析:答案 a b c d

先解釋一下“同步模式”和“非同步模式”:
(1)同步模式:就是後一個任務等待前一個任務結束,然後再執行,程式的執行順序與任務的排列順序是一致的、同步的
(2)非同步模式:完全不同,每一個任務有一個或多個回撥函式(callback),前一個任務結束後,不是執行後一個任務,而是執行回撥函式,後一個任務則是不等前一個任務結束就執行,所以程式的執行順序與任務的排列順序是不一致的、非同步的


JavaScript中實現非同步程式設計模式的4種方法,回撥函式、事件監聽、釋出/訂閱、Promises物件:
(1)回撥函式:這是非同步程式設計最基本的方法,優點是簡單、容易理解和部署,缺點是不利於程式碼的閱讀和維護,各個部分之間高度耦合(Coupling),流程會很混亂,而且每個任務只能指定一個回撥函式。 例:假定有兩個函式f1和f2,後者等待前者的執行結果,如果f1是一個很耗時的任務,可以考慮改寫f1,把f2寫成f1的回撥函式
(2)事件監聽:任務的執行不取決於程式碼的順序,而取決於某個事件是否發生。優點是比較容易理解,可以繫結多個事件,每個事件可以指定多個回撥函式,而且可以”去耦合”(Decoupling),有利於實現模組化。缺點是整個程式都要變成事件驅動型,執行流程會變得很不清晰。例:為f1繫結一個事件,當f1發生done事件,就執行f2
(3)釋出/訂閱:我們假定,存在一個”訊號中心”,某個任務執行完成,就向訊號中心”釋出”(publish)一個訊號,其他任務可以向訊號中心”訂閱”(subscribe)這個訊號,從而知道什麼時候自己可以開始執行。這就叫做”釋出/訂閱模式”(publish-subscribe pattern),又稱”觀察者模式”(observer pattern)。這種方法的性質與”事件監聽”類似,但是明顯優於後者。因為我們可以通過檢視”訊息中心”,瞭解存在多少訊號、每個訊號有多少訂閱者,從而監控程式的執行
(4)Promises物件:是CommonJS工作組提出的一種規範,目的是為非同步程式設計提供統一介面。簡單說,它的思想是,每一個非同步任務返回一個Promise物件,該物件有一個then方法,允許指定回撥函式。回撥函式變成了鏈式寫法,程式的流程可以看得很清楚,而且有一整套的配套方法,可以實現許多強大的功能。例:f1的回撥函式f2,f1().then(f2)

相關文章