2021年精選JavaScript面試題:web前端工程師(js) | 智一面
1.介紹js的基本數(shù)據(jù)類型
Undefined渠牲、Null听盖、Boolean、Number瀑踢、String
2.有哪些內(nèi)置對(duì)象?
數(shù)據(jù)封裝類對(duì)象:Object擂啥、Array哄陶、Boolean、Number 和 String
其他對(duì)象:Function哺壶、Arguments屋吨、Math、Date山宾、RegExp至扰、Error
3.this對(duì)象的理解
this總是指向函數(shù)的直接調(diào)用者(而非間接調(diào)用者);
如果有new關(guān)鍵字,this指向new出來的那個(gè)對(duì)象;
在事件中塌碌,this指向觸發(fā)這個(gè)事件的對(duì)象渊胸,特殊的是,IE中的attachEvent中的this總是指向全局對(duì)象Window;
4.eval是做什么的?
它的功能是把對(duì)應(yīng)的字符串解析成JS代碼并運(yùn)行;
應(yīng)該避免使用eval台妆,不安全翎猛,非常耗性能(2次,一次解析成js語句接剩,一次執(zhí)行)切厘。
由JSON字符串轉(zhuǎn)換為JSON對(duì)象的時(shí)候可以用eval,var obj =eval(‘(‘+ str +’)’);
5.DOM怎樣添加懊缺、移除疫稿、移動(dòng)培他、復(fù)制、創(chuàng)建和查找節(jié)點(diǎn)
// 創(chuàng)建新節(jié)點(diǎn)
createDocumentFragment() //創(chuàng)建一個(gè)DOM片段
createElement() //創(chuàng)建一個(gè)具體的元素
createTextNode() //創(chuàng)建一個(gè)文本節(jié)點(diǎn)
// 添加遗座、移除舀凛、替換、插入
appendChild()
removeChild()
replaceChild()
insertBefore() //在已有的子節(jié)點(diǎn)前插入一個(gè)新的子節(jié)點(diǎn)
// 查找
getElementsByTagName() //通過標(biāo)簽名稱
getElementsByName() //通過元素的Name屬性的值(IE容錯(cuò)能力較強(qiáng)途蒋,會(huì)得到一個(gè)數(shù)組猛遍,其中包括id等于name值的)
getElementById() //通過元素Id,唯一性
6.null和undefined的區(qū)別?
null是一個(gè)表示”無”的對(duì)象号坡,轉(zhuǎn)為數(shù)值時(shí)為0;undefined是一個(gè)表示”無”的原始值懊烤,轉(zhuǎn)為數(shù)值時(shí)為NaN。
undefined:
(1)變量被聲明了宽堆,但沒有賦值時(shí)腌紧,就等于undefined。
(2) 調(diào)用函數(shù)時(shí)畜隶,應(yīng)該提供的參數(shù)沒有提供壁肋,該參數(shù)等于undefined。
(3)對(duì)象沒有賦值的屬性代箭,該屬性的值為undefined墩划。
(4)函數(shù)沒有返回值時(shí)涕刚,默認(rèn)返回undefined嗡综。
null:
(1) 作為函數(shù)的參數(shù),表示該函數(shù)的參數(shù)不是對(duì)象杜漠。
(2) 作為對(duì)象原型鏈的終點(diǎn)极景。
7.new操作符具體干了什么呢?
(1)創(chuàng)建一個(gè)空對(duì)象,并且 this 變量引用該對(duì)象驾茴,同時(shí)還繼承了該函數(shù)的原型盼樟。
(2)屬性和方法被加入到 this 引用的對(duì)象中。
(3)新創(chuàng)建的對(duì)象由 this 所引用锈至,并且最后隱式的返回 this 晨缴。
8.JSON 的了解?
JSON(JavaScript Object Notation) 是一種輕量級(jí)的數(shù)據(jù)交換格式。它是基于JavaScript的一個(gè)子集峡捡。數(shù)據(jù)格式簡單, 易于讀寫, 占用帶寬小击碗。
格式:采用鍵值對(duì),例如:{‘a(chǎn)ge’:’12’, ‘name’:’back’}
9.call() 和 apply() 的區(qū)別和作用?
apply()函數(shù)有兩個(gè)參數(shù):第一個(gè)參數(shù)是上下文们拙,第二個(gè)參數(shù)是參數(shù)組成的數(shù)組稍途。如果上下文是null,則使用全局對(duì)象代替砚婆。
如:function.apply(this,[1,2,3]);
call()的第一個(gè)參數(shù)是上下文械拍,后續(xù)是實(shí)例傳入的參數(shù)序列。
如:function.call(this,1,2,3);
10.如何獲取UA?
function whatBrowser() {
? ? ?document.Browser.Name.value=navigator.appName;
? ? ?document.Browser.Version.value=navigator.appVersion;
? ? ?document.Browser.Code.value=navigator.appCodeName;
? ? ?document.Browser.Agent.value=navigator.userAgent;
?}
11.解釋 JavaScript 中的相等性。
JavaScript 中有嚴(yán)格比較和類型轉(zhuǎn)換比較:
嚴(yán)格比較(例如 ===)在不允許強(qiáng)制轉(zhuǎn)型的情況下檢查兩個(gè)值是否相等坷虑;
抽象比較(例如 ==)在允許強(qiáng)制轉(zhuǎn)型的情況下檢查兩個(gè)值是否相等甲馋。
var a = "42";
var b = 42;
a == b; // true
a === b; // false
一些簡單的規(guī)則:
如果被比較的任何一個(gè)值可能是 true 或 false,要用 ===迄损,而不是 ==摔刁;
如果被比較的任何一個(gè)值是這些特定值(0、“”或 [])海蔽,要用 ===共屈,而不是 ==;
在其他情況下党窜,可以安全地使用 ==拗引。它不僅安全,而且在很多情況下幌衣,它可以簡化代碼矾削,并且提升代碼可讀性。
12.解釋 JavaScript 中的值和類型豁护。
JavaScript提供兩種數(shù)據(jù)類型: 基本數(shù)據(jù)類型和引用數(shù)據(jù)類型
基本數(shù)據(jù)類型有:
String
Number
Boolean
Null
Undefined
Symbol
引用數(shù)據(jù)類型有:
Object
Array
Function
13.解釋事件冒泡以及如何阻止它哼凯?
事件冒泡是指嵌套最深的元素觸發(fā)一個(gè)事件,然后這個(gè)事件順著嵌套順序在父元素上觸發(fā)楚里。
防止事件冒泡的一種方法是使用 event.cancelBubble 或 event.stopPropagation()(低于 IE 9)断部。
14.JavaScript 中的 let 關(guān)鍵字有什么用?
除了可以在函數(shù)級(jí)別聲明變量之外班缎,ES6 還允許你使用 let 關(guān)鍵字在代碼塊({..})中聲明變量蝴光。
15.Javascript 中的“閉包”是什么?舉個(gè)例子达址?
閉包是在另一個(gè)函數(shù)(稱為父函數(shù))中定義的函數(shù)蔑祟,并且可以訪問在父函數(shù)作用域中聲明和定義的變量。
閉包可以訪問三個(gè)作用域中的變量:
在自己作用域中聲明的變量沉唠;
在父函數(shù)中聲明的變量疆虚;
在全局作用域中聲明的變量。
var globalVar = "abc";
// 自調(diào)用函數(shù)
(function outerFunction (outerArg) { // outerFunction 作用域開始
// 在 outerFunction 函數(shù)作用域中聲明的變量
var outerFuncVar = 'x';
// 閉包自調(diào)用函數(shù)
(function innerFunction (innerArg) { // innerFunction 作用域開始
// 在 innerFunction 函數(shù)作用域中聲明的變量
var innerFuncVar = "y";
console.log(
"outerArg = " + outerArg + "
" +
"outerFuncVar = " + outerFuncVar + "
" +
"innerArg = " + innerArg + "
" +
"innerFuncVar = " + innerFuncVar + "
" +
"globalVar = " + globalVar);
// innerFunction 作用域結(jié)束
})(5); // 將 5 作為參數(shù)
// outerFunction 作用域結(jié)束
})(7); // 將 7 作為參數(shù)
innerFunction 是在 outerFunction 中定義的閉包满葛,可以訪問在 outerFunction 作用域內(nèi)聲明和定義的所有變量径簿。除此之外,閉包還可以訪問在全局命名空間中聲明的變量纱扭。
上述代碼的輸出將是:
outerArg = 7
outerFuncVar = x
innerArg = 5
innerFuncVar = y
globalVar = abc
16.如何在 JavaScript 中創(chuàng)建私有變量牍帚?
要在 JavaScript 中創(chuàng)建無法被修改的私有變量,你需要將其創(chuàng)建為函數(shù)中的局部變量乳蛾。即使這個(gè)函數(shù)被調(diào)用暗赶,也無法在函數(shù)之外訪問這個(gè)變量鄙币。例如:
function func() {
var priv = "secret code";
}
console.log(priv); // throws error
要訪問這個(gè)變量,需要?jiǎng)?chuàng)建一個(gè)返回私有變量的輔助函數(shù)蹂随。
function func() {
var priv = "secret code";
return function() {
return priv;
}
}
var getPriv = func();
console.log(getPriv()); // => secret code