Js前端面試題

1. Js的基本數(shù)據(jù)類型

  1. null
  2. undefined
  3. string
  4. symbol
  5. bigint
  6. boolean
  7. number
  8. object

Es6 新增了symbol和bigint兩種類型谆级,symbol一般常用可以結(jié)合redux的action的type進(jìn)行使用;bigint是大數(shù)處理姥卢,一般除非項目中涉及到很大的數(shù)才會用到舶掖。

2. 數(shù)據(jù)類型檢測的方式有哪些

  1. typeof 矩欠, 但是在判斷Array null為object
  2. instanceof 靶庙, 通過prototype 判斷構(gòu)造函數(shù)
  3. construct,通過構(gòu)造函數(shù)來判斷
  4. Object.prototype.toString()

一般項目中常用的判斷方式可能是使用typeof剖张,typeof null === "object" 是一個歷史遺留問題.

3 null 和 undefined 區(qū)別

兩者都是基本數(shù)據(jù)類型
undefined 在 JavaScript 中不是一個保留字派阱,這意味著可以使用 undefined 來作為一個變量名诬留,但是這樣的做法是非常危險的,它會 影響對 undefined 值的判斷。我們可以通過一些方法獲得安全的 undefined 值文兑,比如說 void 0傀广。

但是現(xiàn)在大多數(shù)瀏覽器應(yīng)該是都無法使用undefined作為一個變量名。

5 intanceof 操作符的實(shí)現(xiàn)原理及實(shí)現(xiàn)

intanceof 是判斷構(gòu)造函數(shù)的prototype是否存在于對象的原型鏈上彩届,一直找到Object.prototype.

知道了原理伪冰,實(shí)現(xiàn)就很簡單了,就是無限循環(huán)遞歸

function myInstanceOf(left:object, right:object) {
  // Object.getPrototypeOf() 返回對象的原型
  const leftPrototype = Object.getPrototypeOf(left);
  const rightPrototype = right.prototype;
  while(leftPrototype) {
    if(leftPrototype === rightPrototype) return true;
    if(!rightPrototype) return false;
    leftPrototype = Object.getPrototypeOf(leftPrototype);
  }
  return fasle;
}

6 Object.is() 與比較操作符 “===”樟蠕、“==” 的區(qū)別?

=== 判斷兩邊類型和值都相等才返回true

== 會進(jìn)行隱士類型轉(zhuǎn)換贮聂,轉(zhuǎn)換之后才判斷,項目中不推薦==進(jìn)行判斷

Object.is() 基本上和===使用類似寨辩,這兩者的區(qū)別在于如何判斷+0和-0吓懈,以及NaN的處理

console.log(+0 === -0); //true
console.log(Object.is(+0, -0)); //false

console.log(NaN === NaN); // false
console.log(Object.is(NaN, NaN)); //true

console.log(Number.NaN === Number.NaN); // false
console.log(Object.is(Number.NaN, Number.NaN)); // true

console.log(NaN === Number.NaN); // false
console.log(Object.is(NaN, Number.NaN)); // true

7 什么是BigInt

JavaScript 中 Number.MAX_SAFE_INTEGER 表示最大安全數(shù)字,計算 結(jié)果是 9007199254740991靡狞,即在這個數(shù)范圍內(nèi)不會出現(xiàn)精度丟失(小 數(shù)除外)耻警。

8 如何判斷一個對象是一個空對象

function isEmptyObject(obj={}) {
  return Object.keys(obj).length > 0;
}
console.log(isEmptyObject({}));
console.log(isEmptyObject({'a':1}));

9 new 一個類的時候發(fā)生了什么?

  1. 創(chuàng)建一個對象
  2. 把該對象的proto指向類的原型
  3. 使用apply執(zhí)行構(gòu)造函數(shù)甸怕,如果返回是一個對象就返回甘穿,如果不是就返回剛才創(chuàng)建的對象。

10 Proxy 可以實(shí)現(xiàn)什么功能

在 Vue3.0 中通過 Proxy 來替換原本的 Object.defineProperty 來實(shí)現(xiàn)數(shù)據(jù)響應(yīng)式梢杭。

之所以 Vue3.0 要使用 Proxy 替換原本的 API 原因在于 Proxy 無需一層層遞歸為每個屬性添加代理温兼,一次即可完成以上操作,性能上更好武契,并且原本的實(shí)現(xiàn) 有一些數(shù)據(jù)更新不能監(jiān)聽到募判,比如數(shù)組的push和pop等,但是 Proxy 可以完美監(jiān)聽到任何方式的數(shù)據(jù)改變咒唆,唯一缺陷就是瀏覽器的兼容性不好届垫。

Proxy是Es6中添加的,基本使用如下:

const target1 = {
  message1: "hello",
  message2: "everyone"
};

const handler2 = {
  // target 原始對象全释,這里是指target1装处,prop傳入的屬性,receiv   // er表示是接受的對象恨溜,這里是handle2
  get(target, prop, receiver) {
    return "world";
  }
};

const proxy2 = new Proxy(target1, handler2);

11 Js 文件延遲加載方法有哪些符衔?

  1. defer:js文件下載會和瀏覽器的解析同時執(zhí)行,當(dāng)瀏覽器解析完畢后糟袁,然后再執(zhí)行js文件。
  2. async:js文件下載會和瀏覽器的解析同時執(zhí)行躺盛,當(dāng)js文件下載完畢后项戴,會立即執(zhí)行js文件。
  3. 如果沒有defer和async槽惫,文件會立即下載和立即執(zhí)行周叮,并且會阻塞瀏覽器的解析辩撑。

12 ES6 模塊與 CommonJS 模塊的區(qū)別

相同點(diǎn):
ES6和CommonJS都可以對引入的對象內(nèi)部重新賦值

不同點(diǎn):
CommonJS模塊輸出的是一個值的拷貝,ES6 模塊輸出的是值的引用仿耽;
也就是說ComonnJS是引用的一個值的拷貝合冀,如果當(dāng)我們引入之后,修改了原來文件的內(nèi)容项贺,我們引用的值不會改變君躺,比如下面的例子,test.js中輸出的值都是3,3

// lib.js
let counter = 3;
function incCounter() {
  counter++;
}
module.exports = {
  counter: counter,
  incCounter: incCounter,
};
// test.js
const mod = require("./lib");
console.log(mod.counter); // 3
mod.incCounter();
console.log(mod.counter); // 3

ES6是導(dǎo)入的引用开缎,有點(diǎn)類似指針棕叫,所以當(dāng)引入的文件內(nèi)容改變后,會跟著改變奕删。

可以看下下面的例子

// lib.js
export let counter = 3;
export function incCounter() {
  counter++;
}
// test.js
export let counter = 3;
export function incCounter() {
  counter++;
}

13 for...in 和 for...of 的區(qū)別

for...of 是 ES6 新增的遍歷方式俺泣,允許遍歷一個含有 iterator 接口 的數(shù)據(jù)結(jié)構(gòu)(數(shù)組、對象等)并且返回各項的值

for...in 主要是遍歷對象完残,并且會沿著原型鏈向上查找

for... in 遍歷數(shù)組的時候伏钠,返回的是數(shù)組下標(biāo)
for... of 遍歷數(shù)組的時候,返回的是數(shù)組的值

例子如下:

Object.prototype.objCustom = function() {};
Array.prototype.arrCustom = function() {};

const iterable = [3, 5, 7];
iterable.foo = 'hello';

for (const i in iterable) {
// logs "0", "1", "2", "foo", "arrCust  om", "objCustom"
  console.log(i); 
}

for (const i in iterable) {
  if (Object.hasOwn(iterable, i)) {
    // logs "0", "1", "2", "foo"
    console.log(i); 
  }
}

for (const i of iterable) {
  // logs 3, 5, 7
  console.log(i); 
}

for...of 不能遍歷對象谨设,如果想要遍歷對象贝润,可以使用如下代碼

const obj = {
  a: 1,
  b: 2,
};
for (let [key, value] of Object.entries(obj)) {
  console.log(key, value);
}

14 原型和原型鏈的經(jīng)典圖

15 this的理解

  1. 當(dāng)一個函數(shù)不是一個對象的屬性時,直接作為函數(shù)來調(diào)用時铝宵,this 指向全局對象打掘。
  2. 如果一個函數(shù)作為一個對象的方法來調(diào)用時, this 指向這個對象鹏秋。
  3. 如果一個函數(shù)用 new 調(diào)用時尊蚁,函數(shù)執(zhí)行 前會新創(chuàng)建一個對象,this 指向這個新創(chuàng)建的對象侣夷。
  4. apply 横朋、 call 和 bind 調(diào)用模式, 這三個方法都可以顯示的指定調(diào)用函數(shù)的 this 指向。其中 apply 方法接收兩個參數(shù): 一個是 this 綁定的對象百拓,一個是參數(shù)數(shù)組琴锭。call 方法接收的參數(shù), 第一個是 this 綁定的對象衙传,后面的其余參數(shù)是傳入函數(shù)執(zhí)行的參數(shù)决帖。 也就是說,在使用 call() 方法時蓖捶,傳遞給函數(shù)的參數(shù)必須逐個列舉出來地回。bind 方法通過傳入一個對象,返回一個 this 綁定了傳入對 象的新函數(shù)。這個函數(shù)的 this 指向除了使用 new 時會被改變刻像,其 他情況下都不會改變畅买。
  5. 箭頭函數(shù)的this指向定義的時候,最外層的this

16 內(nèi)存泄露的情況

  1. 全局變量
  2. 閉包
  3. dom元素的引用细睡,當(dāng)dom被刪除后谷羞,引用沒有清空。

本文由mdnice多平臺發(fā)布

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末溜徙,一起剝皮案震驚了整個濱河市湃缎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌萌京,老刑警劉巖雁歌,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異知残,居然都是意外死亡靠瞎,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門求妹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來乏盐,“玉大人,你說我怎么就攤上這事制恍「改埽” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵净神,是天一觀的道長何吝。 經(jīng)常有香客問我,道長鹃唯,這世上最難降的妖魔是什么爱榕? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮坡慌,結(jié)果婚禮上黔酥,老公的妹妹穿的比我還像新娘。我一直安慰自己洪橘,他們只是感情好跪者,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著熄求,像睡著了一般渣玲。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上抡四,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天柜蜈,我揣著相機(jī)與錄音仗谆,去河邊找鬼指巡。 笑死淑履,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的藻雪。 我是一名探鬼主播秘噪,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼勉耀!你這毒婦竟也來了指煎?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤便斥,失蹤者是張志新(化名)和其女友劉穎至壤,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體枢纠,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡像街,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了晋渺。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片镰绎。...
    茶點(diǎn)故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖木西,靈堂內(nèi)的尸體忽然破棺而出畴栖,到底是詐尸還是另有隱情,我是刑警寧澤八千,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布吗讶,位于F島的核電站,受9級特大地震影響恋捆,放射性物質(zhì)發(fā)生泄漏照皆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一鸠信、第九天 我趴在偏房一處隱蔽的房頂上張望纵寝。 院中可真熱鬧,春花似錦星立、人聲如沸爽茴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽室奏。三九已至,卻和暖如春劲装,著一層夾襖步出監(jiān)牢的瞬間胧沫,已是汗流浹背昌简。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留绒怨,地道東北人纯赎。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像南蹂,于是被迫代替她去往敵國和親犬金。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容

  • web前端面試題分為:html/css面試題六剥、javascript面試題晚顷、vue面試題、性能優(yōu)化面試題疗疟、網(wǎng)絡(luò)方面面...
    終身成長人格閱讀 10,823評論 0 3
  • 2022金三銀四前端面試題預(yù)告 馬上就到了面試季了该默,今天整理了一下前端常見的一些面試題。雖說面試的時候造火箭策彤,需要...
    伯約同學(xué)閱讀 526評論 0 15
  • 一栓袖、xue的生命周期是什么 vue每個組件都是獨(dú)立的,锅锨,每個組件都有一個屬于他的生命周期叽赊,從一個組件創(chuàng)建、數(shù)據(jù)初始...
    康娜閱讀 807評論 0 0
  • 時間轉(zhuǎn)換為相對時間 過濾器的使用 1. 定義一個時間過濾器必搞, vue.filter('timefilter'必指,fu...
    就是那么倔強(qiáng)閱讀 367評論 0 1
  • html 1.1 html標(biāo)簽的類型(head, body恕洲,塔橡!Doctype) 他們的作用是什么 參考答案: !D...
    _Y_X_閱讀 587評論 0 1