這些 JavaScript 筆試題你能答對幾道?

来源:https://www.cnblogs.com/lessfish/archive/2023/02/25/17155370.html
-Advertisement-
Play Games

收藏 javascript-questions 這個倉庫很久了,趁著周末來鍛煉下自己的 JS 基礎水平 因為逐漸也在承擔一些面試工作,順便摘錄一些個人覺得比較適合面試的題目和方向 事件流(捕獲、冒泡) 源鏈接 以下代碼點擊結果是啥? <div onclick="console.log('div')" ...


收藏 javascript-questions 這個倉庫很久了,趁著周末來鍛煉下自己的 JS 基礎水平

因為逐漸也在承擔一些面試工作,順便摘錄一些個人覺得比較適合面試的題目和方向

事件流(捕獲、冒泡)

源鏈接

以下代碼點擊結果是啥?

<div onclick="console.log('div')">
  <p onclick="console.log('p')">
    Click here!
  </p>
</div>
答案

-> 依次列印 pdiv

這道題考查事件流,在事件傳播中,有三個階段,捕獲->目標->冒泡,按照標簽來看,就是 div->p->div,但是預設只在冒泡階段處理事件

如果需要在捕獲階段處理事件,可用 addEventLister 並且傳入第三個參數為 true(預設是 false,即預設冒泡階段處理)

<div id="div">
  <p id="p">
    Click here!
  </p>
</div>

<script>
  document.getElementById('div').addEventListener('click', () => console.log('div'), true)
  document.getElementById('p').addEventListener('click', () => console.log('p'), true)
</script>

call、apply、bind

源鏈接

以下代碼輸出結果是啥?

const person = { name: 'Lydia' };

function sayHi(age) {
  return `${this.name} is ${age}`;
}

console.log(sayHi.call(person, 21));
console.log(sayHi.bind(person, 21));
答案

-> Lydia is 21 [Function: bound sayHi]

這道題主要考查 call 和 bind,當然我們面試的時候一般會把 apply 拿出來一起考察下

call、apply 以及 bind 都是為了改變 this 指向而生,而 call 和 apply 用法比較像,都會在函數調用時改變 this 指向,唯一的區別是 apply 的第二個參數是數組,而 call 從第二個參數開始都是實際傳入該函數中的值。bind 與他們不一樣,它返回的還是函數

new

源鏈接

以下代碼輸出結果是啥?

function Car() {
  this.make = 'Lamborghini';
  return { make: 'Maserati' };
}

const myCar = new Car();
console.log(myCar.make);
答案

-> Maserati

這題考查 new。如果對構造函數以及 new 比較瞭解的就會知道,構造函數里,如果返回一個非 null 的對象(包括數組),則將該對象值賦值給新建的對象

瞭解更多可以參考 一道有意思的筆試題引發的對於 new 操作符的思考

JSON.stringify

源鏈接

以下代碼輸出結果是啥?

const settings = {
  username: 'lydiahallie',
  level: 19,
  health: 90,
};

const data = JSON.stringify(settings, ['level', 'health']);
console.log(data);
答案

-> {"level":19,"health":90}

這道題主要考查 JSON.stringify 的第二個參數,當然它還能傳入第三個參數

語法:JSON.stringify(value[, replacer [, space]])。詳見 JSON.stringify

replacer

replacer 參數可以是一個函數或者一個數組。作為函數,它有兩個參數,鍵(key)和值(value),它們都會被序列化

在開始時,replacer 函數會被傳入一個空字元串作為 key 值,代表著要被 stringify 的這個對象。隨後每個對象或數組上的屬性會被依次傳入

const settings = {
  username: 'lydiahallie',
  level: 19,
  health: 90,
};

const data = JSON.stringify(settings, (k, v) => {
  console.log(k, v);
  return v 
});

console.log(data);

/*
// 這裡其實最開始列印了個空字元串。在開始時,replacer 函數會被傳入一個空字元串作為 key 值,代表著要被 stringify 的這個對象
 { username: 'lydiahallie', level: 19, health: 90 }
username lydiahallie
level 19
health 90 

{"username":"lydiahallie","level":19,"health":90}
*/
const settings = {
  username: 'lydiahallie',
  level: 19,
  health: 90,
};

const data = JSON.stringify(settings, (k, v) => {
  if (k === 'level') return v * 2
  return v
});

console.log(data);

// {"username":"lydiahallie","level":38,"health":90}

當傳入數組的時候,相對比較簡單,就是需要 picked 的 key(但是沒法深度 pick,只能 pick 第一層)

space

用來格式化,可以傳入數字或者字元串

const settings = {
  username: 'lydiahallie',
  level: 19,
  health: 90,
};

const data = JSON.stringify(settings, null, 2); // 這時候和傳入 '  '(length 2)效果一樣

console.log(data);

/*
{
  "username": "lydiahallie",
  "level": 19,
  "health": 90
}
*/
const settings = {
  username: 'lydiahallie',
  level: 19,
  health: 90,
};

const data = JSON.stringify(settings, null, 'hello');

console.log(data);

/*
{
hello"username": "lydiahallie",
hello"level": 19,
hello"health": 90
}
*/

函數參數解構

源鏈接

以下代碼輸出結果是啥?

const myFunc = ({ x, y, z }) => {
  console.log(x, y, z);
};

myFunc(1, 2, 3);
答案

-> undefined undefined undefined

這道題比較簡單,myFunc 函數需要的是一個對象參數,並且有 key x yz,但是傳入的並不是對象,所以都取了他們的預設值 undefined

如果傳入對象,但是並沒有對應的 key,也同樣是 undefined

const myFunc = ({ x, y, z }) => {
  console.log(x, y, z);
};

myFunc({ x: 1 }); // 1 undefined undefined

函數中的剩餘參數

源鏈接

以下代碼輸出結果是啥?

function getItems(fruitList, ...args, favoriteFruit) {
  return [...fruitList, ...args, favoriteFruit]
}

getItems(["banana", "apple"], "pear", "orange")
答案

-> SyntaxError

這道題就比較腦經急轉彎了,剩餘參數只能放在最後,其實我覺得像上面代碼那樣其實也有使用場景,不知道未來會不會支持這樣的寫法

展開運算符

源鏈接

以下代碼輸出結果是啥?

const person = {
  name: 'Lydia',
  age: 21,
};

const changeAge = (x = { ...person }) => (x.age += 1);
const changeAgeAndName = (x = { ...person }) => {
  x.age += 1;
  x.name = 'Sarah';
};

changeAge(person);
changeAgeAndName();

console.log(person);
答案

-> { name: 'Lydia', age: 22 }

這道題的考點是展開運算符在對象中的使用。一般我們會用展開運算符來複制一個對象

當調用 changeAge(person) 時,參數傳入了 person,所以 (x.age += 1) 實際操作的和 person 是一個對象引用。而調用 changeAgeAndName() 時,因為沒有傳入參數,所以 x 其實是 { ...person },而這個其實是 person 的一個淺拷貝

可以考查下將 (x = { ...person }) 改成 (x = person)

||

源鏈接

以下代碼輸出結果是啥?

const one = false || {} || null;
const two = null || false || '';
const three = [] || 0 || true;

console.log(one, two, three);
答案

-> {} "" true

這道題的考點是 || 和假值。 || 運算符會返回第一個真值,如果都為假值,則返回最後一個值

這裡可以順便考查 &&&& 操作符,一旦遇到了假值,便會停止往後

console.log(true && 0); // 0
console.log(true && 0 && true); // 0
console.log(1 && 2); // 2
console.log(1 && false); // false
console.log('' && false); // ''

falsy

源鏈接

以下哪些值是假值?

0;
new Number(0);
('');
(' ');
new Boolean(false);
undefined;
答案

-> 0 '' undefined

JS 中的假值有以下幾種:

  • false
  • ''
  • NaN
  • undefined
  • null
  • 0 / -0
  • 0n(BigInt(0))

除此之外,new Numbernew Boolean 創建的其實都是對象,都是真值

對象中 key 重覆

源鏈接

以下代碼輸出結果是啥?

const obj = { a: 'one', b: 'two', a: 'three' };
console.log(obj);
答案

-> { a: 'three', b: 'two' }

這其實更像是一個規範,當對象中 key 重覆的時候,value 會被後面的替換,但是 key 的位置會是第一次出現的位置

一般是對象合併的時候會用到:

const oldObj = {
  name: 'fish',
  age: 30
}

const coverdObj = { name: 'lessfish' }

const newObj = {
  ...oldObj,
  ...coverdObj
}

console.log(newObj); // { name: 'lessfish', age: 30 }

Array Operators

有好幾道和數組操作有關的題

這題 主要考查 push 操作返回 push 後的數組長度這題 也是類似

這題 主要考查哪些數組操作會改變原來的數組(splice)

這題 主要考查 reduce 的使用

[1, 2, 3, 4].reduce((x, y) => console.log(x, y));

這題還是比較有意思的,reduce 函數調用中如果有第二個參數,則會被當作第一次迭代中的 previous 值(也就是第一個參數 x),如果沒有第二個參數,則數組第一個元素會被當作第一次迭代的 previous

所以上面的代碼,如果 reduce 有第二個參數,會被迭代 4 次,如果沒有,則是迭代三次

再看代碼,因為沒有第二個參數,所以第一次迭代參數是 12,reduce 迭代中的返回會被當作下次迭代的 previous,但是這裡沒返回,所以就是 undefined,而第二個參數 y 就是數組元素

Object Operators

這題 主要考查用 Object.defineProperty 定義的對象中的屬性預設不可枚舉,不能用 Object.keys 拿到

這題 主要考查 Object.freeze,顧名思義它能冰凍住對象,使得對象不能增、刪、修改鍵值對(但是註意,它只是 freeze 了第一層,可以參考 這題

這題 考查 Object.seal,它能阻止對象新增、刪除屬性,但是對於已有的屬性依然可以修改其值(註意和 freeze 一樣同樣只是第一層)

delete

源鏈接

以下代碼輸出結果是啥?

const name = 'Lydia';
age = 21;

console.log(delete name);
console.log(delete age);
答案

-> false true

這題考查 delete 操作

首先 delete 返回一個布爾值,代表是否刪除成功。然後 var const let 定義的變數,都不能被刪除,只有全局變數才能被刪除

這裡要註意下 name,因為瀏覽器中預設掛了個全局變數 name,所以 delete name 是 ok 的

暫時性死區

這兩題都是暫時性死區相關,註意下 varlet const 是有差異的,var 的話會變數聲明提升(但是是 undefined),但是 letconst 並不會初始化

Object toString

源鏈接

以下代碼輸出結果是啥?

const animals = {};
let dog = { emoji: '

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • CAN 是一種典型的廣播式網路, 在實際應用中, 如果只希望接收到特定類型的數據, 就要藉助過濾器來實現. AIR32/STM32的CAN控制器包含14個過濾器, 可以設置為 屏蔽模式 或 列表模式 對CAN匯流排上的報文進行過濾. 當節點希望接收到一種報文時, 可以用屏蔽位模式進行過濾, ...
  • 痞子衡嵌入式半月刊: 第 72 期 這裡分享嵌入式領域有用有趣的項目/工具以及一些熱點新聞,農曆年分二十四節氣,希望在每個交節之日準時發佈一期。 本期刊是開源項目(GitHub: JayHeng/pzh-mcu-bi-weekly),歡迎提交 issue,投稿或推薦你知道的嵌入式那些事兒。 上期回顧 ...
  • 環境 系統:Ubuntu 20.04 虛擬平臺:Vmware Workstation 16 PRO 軟體版本:Zabbix 6.0 LTS 資料庫:PostgreSQL Web服務:Apache 新建虛擬機(物理機跳過) Ubuntu安裝優化 安裝Zabbix倉庫 wget https://repo ...
  • 前天寫SQL時本想通過 A left B join on and 後面的條件來使查出的兩條記錄變成一條,奈何發現還是有兩條。 後來發現 join on and 不會過濾結果記錄條數,只會根據and後的條件是否顯示 B表的記錄,A表的記錄一定會顯示。 不管and 後面的是A.id=1還是B.id=1, ...
  • 1、項目結構 項目說明: 該項目是用NET6搭建的webapi介面項目,然後配一個asp.net mvc的管理系統,資料庫是用的mysql,在SiteApi項目下有資料庫sql文件,下麵是一些截圖 介面配置的swagger界面 配套的後臺管理系統 項目具體說明: SiteApi:NET6介面項目,具 ...
  • 2、增量備份 2.1、添加備份腳本 [root@localhost]# vim /mnt/data/backup/mysql/mysql_m_bak_diff.sh #!/bin/bash #mysql 增量備份 time=`date +%Y%m%d` now=`date +%F' '%T` eti ...
  • 原文:Jetpack Compose學習(11)——Navigation頁面導航的使用 - Stars-One的雜貨小窩 在Android原生的View開發中的,也是有Navigation,原生我之後可能再出篇教程,今天講解的則是compose版本的Navigation組件的使用 本系列以往文章請查 ...
  • 我們常常使用的drawable和mipmap到底區別在哪裡, 我們找到資料中關於它們的說明到底是不是符合我們實際的情況. ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...