2020前端JavaScript面試題/錯題整理

1 .介紹JavaScript的基本數據類型

Number、String 、Boolean 、Null、Undefined Object 是 JavaScript 中所有對象的父對象
數據封裝類對象:Object、Array、Boolean、Number 和 String
其他對象:Function、Arguments、Math、Date、RegExp、Error
新類型:Symbol

2.eval是做什麼的?

它的功能是把對應的字符串解析成JS代碼並運行; 應該避免使用eval,不安全,非常耗性能(2次,一次解析成js語句,一次執行)。
由JSON字符串轉換爲JSON對象的時候可以用eval,var obj =eval(’(’+ str +’)’);

3.Javascript中,有一個函數,執行時對象查找時,永遠不會去查找原型,這個函數是?

hasOwnProperty
javaScript中hasOwnProperty函數方法是返回一個布爾值,指出一個對象是否具有指定名稱的屬性。此方法無法檢查該對象的原型鏈中是否具有該屬性;該屬性必須是對象本身的一個成員。
使用方法: object.hasOwnProperty(proName) 其中參數object是必選項。一個對象的實例。
proName是必選項。一個屬性名稱的字符串值。 如果 object
具有指定名稱的屬性,那麼JavaScript中hasOwnProperty函數方法返回 true,反之則返回 false。

4.js延遲加載的方式有哪些?

defer和async、動態創建DOM方式(用得最多)、按需異步載入js

5.如何判斷當前腳本運行在瀏覽器還是node環境中?

this === window ? ‘browser’ : ‘node’;
通過判斷Global對象是否爲window,如果不爲window,當前腳本沒有運行在瀏覽器中

6.例舉3種強制類型轉換和2種隱式類型轉換?

強制(parseInt(),parseFloat(),Number())
隱式(== ,!=)

7.split() 、join() 的區別

前者是切割成數組的形式,後者是將數組轉換成字符串

8.數組方法pop() push() unshift() shift()map()filter()

push()尾部添加 pop()尾部刪除
unshift()頭部添加 shift()頭部刪除
map() : 遍歷數組中的元素,返回一個新數組(包含回調函數返回的數據)
filter():遍歷數組中的元素, 返回一個新數組(包含回調函數返回true的元素)

9.如何阻止事件冒泡和事件默認行爲

//阻止事件冒泡

if(typeof ev.stopPropagation=='function') {  //標準的

    ev.stopPropagation();

} else { //非標準IE

    window.event.cancelBubble = true;

}

//阻止事件默認行爲
return false
window.onload 和document ready的區別
window.onload 是在dom文檔樹加載完和所有文件加載完之後執行一個函數 document.ready原生中
沒有這個方法,jquery中有 $().ready(function),在dom文檔樹加 載完之後執行一個函數
(注意,這裏面的文檔樹加載完不代表全部文件加載完)。
$(document).ready要比window.onload先執行
window.onload只能出來一次,$(document).ready可以出現多次

10.“ == ” 和 “ === ”的不同

前者會自動轉換類型
後者不會

11.當一個DOM節點被點擊時候,我們希望能夠執行一個函數,應該怎麼做?

直接在DOM裏綁定事件:<div οnclick=”test()”></div>
在JS裏通過onclick綁定:xxx.onclick = test
通過事件添加進行綁定:addEventListener(xxx, ‘click’, test)

12.Javascript的事件流模型都有什麼?

“事件冒泡”:事件開始由最具體的元素接受,然後逐級向上傳播
“事件捕捉”:事件由最不具體的節點先接收,然後逐級向下,一直到最具體的
“DOM事件流”:三個階段:事件捕捉,目標階段,事件冒泡

13.截取字符串abcdefg的efg

alert('abcdefg'.substring(4));

14.字符串反轉,如將 ‘12345678’ 變成 ‘87654321’

//思路:先將字符串轉換爲數組 split(),
利用數組的反序函數 reverse()顛倒數組,再利用 jion() 轉換爲字符串

var str = '12345678';
str = str.split('').reverse().join('');

15.哪些操作會造成內存泄漏?

內存泄漏指任何對象在您不再擁有或需要它之後仍然存在。

垃圾回收器定期掃描對象,並計算引用了每個對象的其他對象的數量。
如果一個對象的 引用數量爲0(沒有其他對象引用過該對象),或對該對象的惟一引用是循環的,那麼 該對象的內存即可回收。

  1. setTimeout 的第一個參數使用字符串而非函數的話,會引發內存泄漏。
  2. 閉包
  3. 控制檯日誌
  4. 循環(在兩個對象彼此引用且彼此保留時,就會產生一個循環)

16.typeof運算符返回值中有一個跟javascript數據類型不一致,它是?如何判斷是不是數組?

Array,Array.isArray(data)

17.window.location.search() 返回的是什麼?

http://localhost:8080/xxx?ver=1.0&id=123

返回值:?ver=1.0&id=timlq 也就是問號後面的部分

18.window.location.reload() 作用?

刷新當前頁面。

19.javascript 中的垃圾回收機制?

在Javascript中,如果一個對象不再被引用,那麼這個對象就會被GC回收。如果兩個對象互相引用,而不再
被第3者所引用,那麼這兩個互相引用的對象也會被回收。因爲函數a被b引用,b又被a外的c引用,這就是爲什麼 函數a執行後不會被回收的原因。

20.簡述readonly與disabled的區別

ReadOnly和Disabled的作用是使用戶不能夠更改表單域中的內容. 但是二者還是有着一些區別的:
1、Readonly只針對input(text/password)和textarea有效,而disabled對於所有的表單
元素有效,包括select,radio,checkbox,button等。
2、在表單元素使用了disabled後,我們將表單以POST或者GET的方式提交的話,這
個元素的值不會被傳遞出去,而readonly會將該值傳遞出去

21.用JavaScript實現升序排序。數據爲23、45、18、37、92、13、24

//升序算法

function sort(arr){

    for (var i = 0; i <arr.length; i++) {

        for (var j = 0; j <arr.length-i; j++) {

            if(arr[j]>arr[j+1]){

                var c=arr[j];//交換兩個變量的位置

                arr[j]=arr[j+1];

                arr[j+1]=c;

            }

        };

    };

    return arr.toString();

}

console.log(sort([23,45,18,37,92,13,24]));

22.請說出三種減低頁面加載時間的方法

1、壓縮css、js文件

2、合併js、css文件,減少http請求

3、外部js、css文件放在最底下

4、減少dom操作,儘可能用變量替代不必要的dom操作

23.變量提升

function sayHi(){
		console.log(name);
		console.log(age);
		var name = "Tom";
		let age = 18;
	}

	sayHi();
  • A: Tom 和 undefined
  • B: Tom 和 ReferenceError
  • C: ReferenceError 和 18
  • D: undefined 和 ReferenceError

在函數中,我們首先使用var關鍵字聲明瞭name變量。這意味着變量在創建階段會被提升(JavaScript會在創建變量創建階段爲其分配內存空間),默認值爲undefined,直到我們實際執行到使用該變量的行。
我們還沒有爲name變量賦值,所以它仍然保持undefined的值。
使用let關鍵字(和const)聲明的變量也會存在變量提升,但與var不同,初始化沒有被提升。 在我們聲明(初始化)它們之前,它們是不可訪問的。 這被稱爲“暫時死區”。 當我們在聲明變量之前嘗試訪問變量時,JavaScript會拋出一個ReferenceError。

24.setTimeout函數

for (var i = 0; i < 3; i++) {
	  setTimeout(() => console.log(i), 1);
	}

	for (let i = 0; i < 3; i++) {
	  setTimeout(() => console.log(i), 1);
	}
  • A: 0 1 2 和 0 1 2
  • B: 0 1 2 和 3 3 3
  • C: 3 3 3 和 0 1 2
  • 答案:C

由於JavaScript中的異步執行機制,setTimeout函數真正被執行時,循環已經走完。
由於第一個循環中的變量i是使用var關鍵字聲明的,因此該值是全局的。 在循環期間,我們每次使用一元運算符++都會將i的值增加1。
因此在第一個例子中,當調用setTimeout函數時,i已經被賦值爲3。
在第二個循環中,使用let關鍵字聲明變量i:使用let(和const)關鍵字聲明的變量是具有塊作用域的(塊是{}之間的任何東西)。 在每次迭代期間,i將被創建爲一個新值,並且每個值都會存在於循環內的塊級作用域。

25.數組定義(錯題)

var a=[]創建一個長度爲0的數組,a[5]=4,數組長度自動延長至6,沒有賦值的元素均爲undefined。

26.內部變量與全局變量重名時(錯題)

內部變量將覆蓋外部變量

27.關於塊內聲明函數的方法(錯題)

if(x){var foo =function(){}}

要有var

28.若需給子scope發送消息

$emit() 向上冒泡
$broadcast() 是向下傳播事件

29.如何阻止瀏覽器默認行爲

兩種方法:

window.event.returnValue=false;
event.preventDefault();

30.算術運算

JavaScript定義var a=“40”,var b=7,則執行a%b會得到(5)。

在進行算術運算時會做,+號,數字隱式轉換成字符串。其餘的運算符號是字符串隱式轉換成數字。

31.w3c 制定的 javascript 標準事件模型(錯題)

事件捕獲->事件處理->事件冒泡

32.JavaScript解析順序

以下代碼執行後, num 的值是?

var foo=function(x,y){
return x-y;
}
function foo(x,y){
return x+y;
}
var num=foo(1,2);
答案:-1

33.以下哪一個不是JavaScript的數據類型:

Integer

Integer是int的一個封裝類。javascript是一種弱類型語言,定義變量時不需要指明特定的數據類型。javascript中的數據類型有Undefined,Null,Boolean,Number.這些屬於基本類型。Object,
Array,
Function屬於引用類型。string類型有些特殊,因爲字符串具有可變的大小,所以顯然它不能被直接存儲在具有固定大小的變量中。由於效率的原因,我們希望JS只複製對字符串的引用,而不是字符串的內容。但是另一方面,字符串在許多方面都和基本類型的表現相似,而字符串是不可變的這一事實(即沒法改變一個字符串值的內容),因此可以將字符串看成行爲與基本類型相似的不可變引用類型

34.在JavaScript中,調用對象屬性的描述中,例如:調用對象obj的arr屬性

obj["arr"]
obj["a"+"r"+"r"]
obj.arr

中括號方式或者點方式

35.如何判斷一個js對象是否是Array,arr爲要判斷的對象,其中最準確的方法是?

在這裏插入圖片描述

typeof(arr) 返回的是 Object
instanceof 在跨 frame 對象構建的場景下會失效
arr.toString 沒有這種用法,正確的用法是 arr.toString() 返回的是數組的內容

36.從字符串 const str = ‘qwbewrbbeqqbbbweebbbbqee’;中能得到結果 [“b”, “bb”, “bbb”, “bbbb”] 以下錯誤語句是?

審題:錯誤
在這裏插入圖片描述

+表示出現至少一次b
*表示可以不出現b,也可以出現一次或多次
{n,m}表示最少出現n次b,最多出現m次b

/b+/g    //匹配前面的子表達式一次或多次,有一個或多個b
 /b*/g    //匹配前面的子表達式零次或多次,結果不止數組中那麼多
 /b{1,4}/g   //匹配1-4個b 
 /b{1,5}/g    //匹配1-5個b

37.下面哪種方式不能改變作用域鏈?

在這裏插入圖片描述

with try-catch eval可以改變作用域鏈

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章