這段時間在進行 web 前端的面試做院,在各大平臺、社區(qū)尋找面試題濒持,其中有一些基礎的面試題键耕,用來檢查自己的基礎的地方。
掘金上的 Cornad Li 將Github
的一個很火的基礎題翻譯過來柑营,自己試著做了一下屈雄,還是錯了不少,有些是基礎不牢官套,有些是粗心酒奶,用錯題集整理一下,查漏補缺奶赔。
- global / window變量聲明
下面代碼會輸出什么惋嚎?
let greeting = "Halo";
greating = "Fuck JavaScript";
console.log(greating);
瀏覽器中當沒有聲明變量時(使用let const var
等),會自動將變量聲明為window/global
的一個屬性站刑,并完成賦值瘸彤,因此輸出是:
"Fuck JavaScript"
- 當我們這樣做時會發(fā)生什么?
function bark() {
console.log("Woof!");
}
bark.animal = "dog";
A: Nothing, this is totally fine!
B: SyntaxError. You cannot add properties to a function this way.
C: undefined
D: ReferenceError
答案:A。因為在JavaScript中笛钝,函數(shù)也是一種對象质况,因此可以對其添加屬性并賦值愕宋。
- 構造函數(shù)屬性的添加
下面代碼的輸出是什么?
function Person(firstName, lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
const member = new Person("Lydia", "Hallie");
Person.getFullName = () => this.firstName + this.lastName;
console.log(member.getFullName());
A: TypeError
B: SyntaxError
C: Lydia Hallie
D: undefined undefined
答案:A。構造函數(shù)添加屬性结榄,不能像一般對象那樣直接添加中贝,而是要在構造函數(shù)的原型上添加屬性。像這樣:
Person.prototype.getFullName = function() {
return this.firstName+this.lastName;
}
- this值 / new操作符流程
下面代碼輸出是什么臼朗?
function Person(firstName, lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
const lydia = new Person("Lydia", "Hallie");
const sarah = Person("Sarah", "Smith");
console.log(sarah);
A. undefined
B. ReferenceError
C. {}
D. Person {firstName: "Sarah", lastName: "Smith"}
答案:A邻寿。由于lydia
定義時 使用new
關鍵詞,因此lydia
定義時的構造函數(shù)Person
中的this
是指lydia
视哑,而sarah
定義時未使用關鍵詞绣否,因此構造函數(shù)中的this
是定義的,也就是undefined
挡毅,在非嚴格模式下蒜撮,構造函數(shù)中的this
就是window
,因此window.firstName
和window.lastName
就是undefined
跪呈。
PS:在嚴格模式下段磨,下面中會直接報錯:Cannot set property 'firstName' of undefined
function Person(firstName, lastName) {
"use strict";
this.firstName = firstName;
this.lastName = lastName;
console.log(this);
}
const lydia = new Person("Lydia", "Hallie");
const sarah = Person("Sarah", "Smith");
/*
[object Object] {
firstName: "Lydia",
lastName: "Hallie"
} // lydia
"TypeError: Cannot set property 'firstName' of undefined // sarah
*/
- 自加自減運算
let number = 0;
console.log(number++);
console.log(++number);
console.log(number);
A: 1 1 2
B: 1 2 2
C: 0 2 2
D: 0 1 2
答案: C。
后綴一元運算符++
: 返回值 0
耗绿,增加值 1
苹支。
前綴一元運算符++
: 增加值 2
,返回值 2
误阻。
MDN-Expressions_and_Operators
- 帶標簽的模板字符串
以下代碼輸出什么债蜜?
function getPersonInfo(one, two, three) {
console.log(one);
console.log(two);
console.log(three);
}
const person = "Lydia";
const age = 21;
getPersonInfo`${person} is ${age} years old`;
A: Lydia 21 ["", "is", "years old"]
B: ["", "is", "years old"] Lydia 21
C: Lydia ["", "is", "years old"] 21
答案:B。帶標簽的模板字符串第一個參數(shù)包含一個字符串值的數(shù)組究反,其余參數(shù)與表達式相關策幼。因此two, three
分別是${person}, ${age}
。
- 基礎類型和引用類型區(qū)別
以下代碼輸出什么奴紧?
function checkAge(data) {
if (data === { age: 18 }) {
console.log("You are an adult!");
} else if (data == { age: 18 }) {
console.log("You are still an adult.");
} else {
console.log(`Hmm.. You don't have an age I guess`);
}
}
checkAge({ age: 18 });
A: You are an adult!
B: You are still an adult.
C: Hmm.. You don't have an age I guess
答案: C特姐。涉及到基礎類型和引用類型的比較。原始類型通過值去比較黍氮,只要值相等唐含,兩個就相等。而引用類型(對象)通過他們的引用的內(nèi)存地址是否一樣去比較相似性沫浆。JavaScript
檢查對象是否具有對內(nèi)存中相同位置的引用捷枯。這就是為什么{ age: 18 } === { age: 18 }和 { age: 18 } == { age: 18 } 返回 false的原因。
- 拓展運算符
以下代碼輸出什么专执?
function getAge(...args) {
console.log(typeof args);
}
getAge(21);
A: "number"
B: "array"
C: "object"
D: "NaN"
答案:C淮捆。擴展運算符(... args)返回一個帶參數(shù)的數(shù)組。 數(shù)組是一個對象,因此typeof args返回object攀痊。
- 嚴格模式下的引用錯誤桐腌。
function getAge() {
"use strict";
age = 21;
console.log(age);
}
getAge();
A: 21
B: undefined
C: ReferenceError
D: TypeError
答案:C。使用嚴格模式"use strict";
可以確保不會意外地生成全局變量苟径,我們從未聲明變量age案站,因為我們使用``use strict',它會引發(fā)一個ReferenceError棘街。 如果我們不使用“use strict”蟆盐,它就會起作用,因為屬性age`會被添加到全局對象中遭殉。
- sessionStorage, localStorage
cool_secret可以訪問多長時間?
sessionStorage.setItem("cool_secret", 123);
A:永遠石挂,數(shù)據(jù)不會丟失。
B:用戶關閉選項卡時险污。
C:當用戶關閉整個瀏覽器時痹愚,不僅是選項卡。
D:用戶關閉計算機時罗心。
答案: B里伯。
關閉選項卡后城瞎,將刪除存儲在sessionStorage
中的數(shù)據(jù)渤闷。如果使用localStorage
,數(shù)據(jù)將永遠存在脖镀,除非例如調(diào)localStorage.clear()
飒箭。
MDN-sessionStorage
MDN-localStorage
-
continue
關鍵字
下面代碼的輸出是什么?
for (let i = 1; i < 5; i++) {
if (i === 3) continue;
console.log(i);
}
A: 1 2
B: 1 2 3
C: 1 2 4
D: 1 3 4
答案: C。
如果某個條件返回true蜒灰,則continue語句跳過迭代弦蹂。
- 基本類型的裝箱轉(zhuǎn)換
下面代碼的輸出是什么?
String.prototype.giveLydiaPizza = () => {
return "Just give Lydia pizza already!";
};
const name = "Lydia";
name.giveLydiaPizza();
A: "Just give Lydia pizza already!"
B: TypeError: not a function
C: SyntaxError
D: undefined
答案: A。
String是一個內(nèi)置的構造函數(shù)强窖,我們可以為它添加屬性凸椿。 我剛給它的原型添加了一個方法。 原始類型的字符串自動轉(zhuǎn)換為字符串對象翅溺,由字符串原型函數(shù)生成脑漫。 因此,所有字符串(字符串對象)都可以訪問該方法咙崎!
譯者ConardLi 注:
當使用基本類型的字符串調(diào)用giveLydiaPizza時优幸,實際上發(fā)生了下面的過程:
- 創(chuàng)建一個String的包裝類型實例
- 在實例上調(diào)用substring方法
- 銷毀實例
學習者注:也就是基礎類型轉(zhuǎn)化為引用類型的 "裝箱轉(zhuǎn)換",這使得基礎類型例如string, number, boolean 的變量可以調(diào)用其對應復雜類型對象上的方法褪猛。
- 對象鍵值自動轉(zhuǎn)化為字符串网杆。
下面代碼的輸出是什么?
const a = {};
const b = { key: "b" };
const c = { key: "c" };
a[b] = 123;
a[c] = 456;
console.log(a[b]);
A: 123
B: 456
C: undefined
D: ReferenceError
答案: B
對象鍵自動轉(zhuǎn)換為字符串。我們試圖將一個對象設置為對象a的鍵,其值為123碳却。
但是队秩,當對象自動轉(zhuǎn)換為字符串化時,它變成了[Object object]追城。 所以我們在這里說的是a["Object object"] = 123刹碾。 然后,我們可以嘗試再次做同樣的事情座柱。 c對象同樣會發(fā)生隱式類型轉(zhuǎn)換迷帜。那么,a["Object object"] = 456色洞。
然后戏锹,我們打印a[b],它實際上是a["Object object"]火诸。 我們將其設置為456锦针,因此返回456。
此時打印出a, b, c
分別是:
[object Object] {
[object Object]: 456
} // a
[object Object] {
key: "b"
} // b
[object Object] {
key: "c"
} // c
- 單擊按鈕時event.target是什么?
<div onclick="console.log('first div')">
<div onclick="console.log('second div')">
<button onclick="console.log('button')">
Click!
</button>
</div>
</div>
A: div外部
B: div內(nèi)部
C: button
D: 所有嵌套元素的數(shù)組.
答案: C置蜀。
導致事件的最深嵌套元素是事件的目標奈搜。 可以通過在需要停止冒泡的地方用 event.stopPropagation 停止冒泡。
document.querySelector('button').addEventListener('click', event=> {
event.stopPropagation();
console.log(event.target);
});
/*
button
<button onclick="console.log('button')">Click!
</button>
*/
- 塊級作用域盯荤。
下面代碼的輸出是什么?
(() => {
let x, y;
try {
throw new Error();
} catch (x) {
(x = 1), (y = 2);
console.log(x);
}
console.log(x);
console.log(y);
})();
A: 1 undefined 2
B: undefined undefined undefined
C: 1 1 2
D: 1 undefined undefined
答案: A馋吗。
catch
作用域中的x
與外面的x
不同,不是同一個x
秋秤。
在catch
中的賦值宏粤,對catch
外的x
沒有作用,對y
有作用灼卢,因為y
的賦值是catch
在作用域鏈上對外部y
的賦值绍哎。
x
還是undefined
,y
被賦值為2鞋真。
-
JavaScript
中的所有內(nèi)容都是...
A:原始或?qū)ο?br>
B:函數(shù)或?qū)ο?br>
C:技巧問題崇堰!只有對象
D:數(shù)字或?qū)ο?br>
答案: A
JavaScript
只有原始類型和對象。
原始類型是boolean涩咖,null海诲,undefined,bigint抠藕,number饿肺,string和symbol
。
-
JavaScript
單變量的布爾值轉(zhuǎn)換
下面代碼的輸出是什么?
!!null;
!!"";
!!1;
A: false true false
B: false false true
C: false true true
D: true true false
答案: B
null
是假值盾似。 !null
返回true
敬辣。 !true
返回false
雪标。
""
是假值。 !""
返回true
溉跃。 !true
返回false
村刨。
1
是真值。 !1
返回false
撰茎。 !false
返回true
嵌牺。
學習者注:JavaScript的單變量布爾值的轉(zhuǎn)化中,以下幾種為false
龄糊,其余為true
逆粹,null, undefined, '', NaN, 0,false
。
- 參考閱讀
[譯] 送你 43 道 JavaScript 面試題炫惩,ConardLi僻弹。