【面試篇】JavaScript面試經,offer拿到手軟

2021-02-19 程式設計師技術精選
JavaScript的數據類型都有什麼?

基本數據類型:String,Boolean,Number,Undefined,Null

引用數據類型:Object(Array,Date,RegExp,Function)

javascript中==和===的區別是什麼?

==會自動進行類型轉換,===不會

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

強制(parseInt,parseFloat,Number())

隱式(==)1==」1」//true

null==undefined//true

原生 JS 中 call()、apply()、bind() 方法有什麼區別?

三個方法都可以改變函數運行時的 this 指向。

三個方法第一個參數都是函數調用執行時this 指向的對象。

call() 方法第二個參數是個可變參數,是函數調用執行時本身所需要的參數。

apply() 方法第二個參數是數組或arguments。call()與apply()都是立即調用函數執行,在運行時修改this指向。

bind()是返回一個新的函數,新函數的函數主體與原函數的函數主體一致,當新函數被調用時,函數體中 this 指向的是 bind() 方法第一個參數傳遞的對象,而bind() 方法不會影響原函數本身的 this 指向。

什麼是閉包?特點是?

閉包,官方對閉包的解釋是:一個擁有許多變量和綁定了這些變量的環境的表達式(通常是一個函數),因而這些變量也是該表達式的一部分。

閉包的特點:

(1)作為一個函數變量的一個引用,當函數返回時,其處於激活狀態。

(2) 一個閉包就是當一個函數返回時,一個沒有釋放資源的棧區。

簡單的說,Javascript允許使用內部函數---即函數定義和函數表達式位於另一個函數的函數體內。而且,這些內部函數可以訪問它們所在的外部函數中聲明的所有局部變量、參數和聲明的其他內部函數。當其中一個這樣的內部函數在包含它們的外部函數之外被調用時,就會形成閉包。

事件委託是什麼?

符合W3C標準的事件綁定addEventLisntener /attachEvent

讓利用事件冒泡的原理,讓自己的所觸發的事件,讓他的父元素代替執行!

如何阻止事件冒泡和默認事件

e. stopPropagation();//標準瀏覽器

event.canceBubble=true;//ie9之前

阻止默認事件:

為了不讓a點擊之後跳轉,我們就要給他的點擊事件進行阻止

return false

e.preventDefault();

document load 和document ready的區別?

Document.onload 是在結構和樣式加載完才執行js

window.onload:不僅僅要在結構和樣式加載完,還要執行完所有的樣式、圖片這些資源文件,全部加載完才會觸發window.onload事件

Document.ready原生種沒有這個方法,jquery中有 $().ready(function)

為了保證頁面輸出安全,我們經常需要對一些特殊的字符進行轉義,請寫一個函數escapeHtml,將<, >, &, 「進行轉義
return str.replace(/[<>」&]/g, function(match) {
    switch (match) {
      case 「<」:
         return 「&lt;」;
      case 「>」:
          return 「&gt;」;
      case 「&」:
          return 「&amp;」;
      case 「\」」:
         return 「&quot;」;
     }
  });
}

簡述創建函數的幾種方式

第一種(函數聲明):function sum1(num1,num2){return num1+num2;}

第二種(函數表達式):var sum2 = function(num1,num2){return num1+num2;}

第三種(函數對象方式):var sum3 = new Function("num1","num2","return num1+num2");

把 Script 標籤 放在頁面的最底部的body封閉之前 和封閉之後有什麼區別?瀏覽器會如何解析它們?

如果說放在body的封閉之前,將會阻塞其他資源的加載

如果放在body封閉之後,不會影響body內元素的加載

iframe的優缺點?

優點:

缺點:

Javascript如何實現繼承?

原型鏈繼承,借用構造函數繼承,組合繼承,寄生式繼承,寄生組合繼承

請你談談Cookie的弊端?

缺點:

1.Cookie數量和長度的限制。部分瀏覽器每個domain最多只能有50條cookie,基本所有瀏覽器中每個cookie長度不能超過4KB,否則會被截掉。

2.安全性問題。如果cookie被人攔截了,那人就可以取得所有的session信息。即使加密也與事無補,因為攔截者並不需要知道cookie的意義,他只要原樣轉發cookie就可以達到目的了。

3.有些狀態不可能保存在客戶端。例如,為了防止重複提交表單,我們需要在伺服器端保存一個計數器。如果我們把這個計數器保存在客戶端,那麼它起不到任何作用。

4.佔用網絡上傳帶寬。每次請求伺服器資源時,都會攜帶 cookie 信息向伺服器傳遞。

如何解決跨域問題?

理解跨域的概念:URL的協議、域名、埠都相同才是同域,否則都是跨域

出於安全考慮,瀏覽器不允許跨域獲取數據,這是瀏覽器同源策略的限制,但實際開發過程中會遇到非常多的跨域問題,具體解決跨域的方式可以參考我的另一篇文章:

項目實戰之跨域處理~一文搞所有跨域需求

DOM操作——怎樣添加、移除、移動、複製、創建和查找節點?創建新節點createDocumentFragment() // 創建一個DOM片段createElement() // 創建一個具體的元素createTextNode() // 創建一個文本節點添加、移除、替換、插入insertBefore() // 在已有的子節點前插入一個新的子節點查找getElementsByTagName() // 通過標籤名稱getElementsByName() // 通過元素的Name屬性的值(IE容錯能力較強,會得到一個數組,其中包括id等於name值的)getElementById() // 通過元素Id,唯一性js延遲加載的方式有哪些?動態創建DOM方式(創建script,插入到DOM中,加載完畢後callBack)documen.write和 innerHTML 的區別?

document.write 只能重繪整個頁面

innerHTML 可以重繪頁面的一部分

哪些操作會造成內存洩漏?

內存洩漏指任何對象在您不再擁有或需要它之後仍然存在。垃圾回收器定期掃描對象,並計算引用了每個對象的其他對象的數量。如果一個對象的引用數量為 0(沒有其他對象引用過該對象),或對該對象的惟一引用是循環的,那麼該對象的內存即可回收。

setTimeout 的第一個參數使用字符串而非函數的話,會引發內存洩漏。循環(在兩個對象彼此引用且彼此保留時,就會產生一個循環)判斷一個字符串中出現次數最多的字符,統計這個次數?
var str = 'asdfssaaasasasasaa';
var json = {};
for (var i = 0; i < str.length; i++) {
        if(!json[str.charAt(i)]){
                json[str.charAt(i)] = 1;
        }else{
                json[str.charAt(i)]++;
        }
};
var iMax = 0;
var iIndex = '';
for(var i in json){
        if(json[i]>iMax){
                iMax = json[i];
                iIndex = i;
        }
}
alert('出現次數最多的是:'+iIndex+'出現'+iMax+'次');

數組扁平化

數組扁平化是指將一個多維數組變為一個一維數組

const arr = [1, [2, [3, [4, 5]]], 6];
// => [1, 2, 3, 4, 5, 6]

方法一:使用flat()
const res1 = arr.flat(Infinity);

方法二:利用正則
const res2 = JSON.stringify(arr).replace(/\[|\]/g, '').split(',');

但數據類型都會變為字符串

方法三:正則改良版本
const res3 = JSON.parse('[' + JSON.stringify(arr).replace(/\[|\]/g, '') + ']');

方法四:使用reduce
const flatten = arr => {
  return arr.reduce((pre, cur) => {
    return pre.concat(Array.isArray(cur) ? flatten(cur) : cur);
  }, [])
}
const res4 = flatten(arr);

方法五:函數遞歸
const res5 = [];
const fn = arr => {
  for (let i = 0; i < arr.length; i++) {
    if (Array.isArray(arr[i])) {
      fn(arr[i]);
    } else {
      res5.push(arr[i]);
    }
  }
}
fn(arr);

數組去重
const arr = [1, 1, '1', 17, true, true, false, false, 'true', 'a', {}, {}];
// => [1, '1', 17, true, false, 'true', 'a', {}, {}]

方法一:利用Set
const res1 = Array.from(new Set(arr));

方法二:兩層for循環+splice
const unique1 = arr => {
  let len = arr.length;
  for (let i = 0; i < len; i++) {
    for (let j = i + 1; j < len; j++) {
      if (arr[i] === arr[j]) {
        arr.splice(j, 1);
        // 每刪除一個樹,j--保證j的值經過自加後不變。同時,len--,減少循環次數提升性能
        len--;
        j--;
      }
    }
  }
  return arr;
}

方法三:利用indexOf
const unique2 = arr => {
  const res = [];
  for (let i = 0; i < arr.length; i++) {
    if (res.indexOf(arr[i]) === -1) res.push(arr[i]);
  }
  return res;
}

方法四:利用include
const unique3 = arr => {
  const res = [];
  for (let i = 0; i < arr.length; i++) {
    if (!res.includes(arr[i])) res.push(arr[i]);
  }
  return res;
}

方法五:利用filter
const unique4 = arr => {
  return arr.filter((item, index) => {
    return arr.indexOf(item) === index;
  });
}

方法六:利用Map
const unique5 = arr => {
  const map = new Map();
  const res = [];
  for (let i = 0; i < arr.length; i++) {
    if (!map.has(arr[i])) {
      map.set(arr[i], true)
      res.push(arr[i]);
    }
  }
  return res;
}

類數組轉化為數組

類數組是具有length屬性,但不具有數組原型上的方法。常見的類數組有arguments、DOM操作方法返回的結果。

方法一:Array.from
Array.from(document.querySelectorAll('div'))

方法二:Array.prototype.slice.call()
Array.prototype.slice.call(document.querySelectorAll('div'))

方法三:擴展運算符
[...document.querySelectorAll('div')]

方法四:利用concat
Array.prototype.concat.apply([], document.querySelectorAll('div'));

debounce(防抖)

觸發高頻時間後n秒內函數只會執行一次,如果n秒內高頻時間再次觸發,則重新計算時間。

const debounce = (fn, time) => {
  let timeout = null;
  return function() {
    clearTimeout(timeout)
    timeout = setTimeout(() => {
      fn.apply(this, arguments);
    }, time);
  }
};

防抖常應用於用戶進行搜索輸入節約請求資源,window觸發resize事件時進行防抖只觸發一次。

throttle(節流)

高頻時間觸發,但n秒內只會執行一次,所以節流會稀釋函數的執行頻率。

const throttle = (fn, time) => {
  let flag = true;
  return function() {
    if (!flag) return;
    flag = false;
    setTimeout(() => {
      fn.apply(this, arguments);
      flag = true;
    }, time);
  }
}

節流常應用於滑鼠不斷點擊觸發、監聽滾動事件。

函數珂裡化

指的是將一個接受多個參數的函數 變為 接受一個參數返回一個函數的固定形式,這樣便於再次調用,例如f(1)(2)

經典面試題:實現add(1)(2)(3)(4)=10; 、 add(1)(1,2,3)(2)=9;

function add() {
  const _args = [...arguments];
  function fn() {
    _args.push(...arguments);
    return fn;
  }
  fn.toString = function() {
    return _args.reduce((sum, cur) => sum + cur);
  }
  return fn;
}

深拷貝

遞歸的完整版本(考慮到了Symbol屬性):

const cloneDeep1 = (target, hash = new WeakMap()) => {
  // 對於傳入參數處理
  if (typeof target !== 'object' || target === null) {
    return target;
  }
  // 哈希表中存在直接返回
  if (hash.has(target)) return hash.get(target);

  const cloneTarget = Array.isArray(target) ? [] : {};
  hash.set(target, cloneTarget);

  // 針對Symbol屬性
  const symKeys = Object.getOwnPropertySymbols(target);
  if (symKeys.length) {
    symKeys.forEach(symKey => {
      if (typeof target[symKey] === 'object' && target[symKey] !== null) {
        cloneTarget[symKey] = cloneDeep1(target[symKey]);
      } else {
        cloneTarget[symKey] = target[symKey];
      }
    })
  }

  for (const i in target) {
    if (Object.prototype.hasOwnProperty.call(target, i)) {
      cloneTarget[i] =
        typeof target[i] === 'object' && target[i] !== null
        ? cloneDeep1(target[i], hash)
        : target[i];
    }
  }
  return cloneTarget;
}

相關焦點

  • JavaScript面試經,offer拿到手軟
    基本數據類型:String,Boolean,Number,Undefined,Null引用數據類型:Object(Array,Date,RegExp,Function)javascript中==和===的區別是什麼?
  • 這樣準備英語面試,Offer拿到手軟!
    如何在面試中不被口語拖後腿?甚至脫穎而出?扇貝君整理了國內外面試環節HR和業務經理常問的幾大問題和回答,希望給在找工作或者考慮換工作的貝貝們一個參考,祝大家早日找到理想的工作吖!1 Tell me about yourself.
  • 德語水平零,面試20次,終於拿到滿意的offer了.分享商科工作AC面試經.純乾貨!(下)
    最後也總算是努力有回報,終於拿到了一個比較滿意的offer。看到這邊大家分享面試經,很多都是工科的。現在在德國學商科金融的也不少,所以我就來分享一下我的面試經驗吧。也算是還願了。希望可以幫到更多的同學們,尤其是跟我一樣不會德語的。往期微信:德語水平零,面試20次,終於拿到滿意的offer了。分享商科工作AC面試經。純乾貨!
  • 害怕面試?一個有效打動HR的面試技巧,讓你輕鬆拿到offer!
    這周呢,小X會給大家介紹面試相關的內容,包括面試技巧,還有答HR問的訣竅。最最重要的是!文末公布了免費改簡歷的名單,拉到文末就可以看到辣!很多人在面試時,最怕的就是被問到「工作經驗」不知道怎樣答更不知道怎樣展示自己尤其是聽到HR連珠炮的問題時兩眼發黑快要暈厥小X今天為大家介紹一個面試小技巧讓大家面試時冷靜下來不用再恐慌!
  • 世畢盟:offer拿到手軟的小仙女,文科轉STEM,還橫掃15個offer?!
    原標題:世畢盟:offer拿到手軟的小仙女,文科轉STEM,還橫掃15個offer?! Friday大家都說文科在美國不好找工作,我在本科期間通過各種途徑了解文科的各個專業,最後終於找到了文科轉STEM的方法!
  • 學會這4招面試技巧,讓你offer拿到手軟!
    那麼,在這個不平凡的求職季,我們怎樣才能抓住本就不多的機會,快速拿到心儀的offer呢? 以下為本人總結的4招面試技巧,乾貨滿滿,請點讚收藏,慢慢品讀!專業度:強調你的專業性和潛力要想做好一項工作,僅僅做到熱愛和匹配是不夠的,要想順利拿到offer,你還要表現出你的過人之處,也就是你的專業性以及亮眼的成果。可以用數字量化,選最誇張的。
  • 面試時間越長,拿到offer的概率就越大?
    ……一場面試下來,讓我震驚。現在找份實習生的工作也那麼難了嗎?休息10分鐘後進入第二輪面試,直接是經理。面試官上來就問「上一輪的面試官跟你說了崗位內容吧?你來重複一遍。」然後繼續深挖簡歷、讓我講HR工作的內容、招聘的本質是什麼?……走出公司大門那一刻,我就開始質疑「面試時間越長,成功率越高」的理論了。
  • 申請Rotman MBA 面試3天後拿到offer
    1月底收到了多倫多大學ROTMAN的offer letter,僅僅在面試後的三天。這樣的工作效率令人驚訝。  簡單介紹個人背景,  本人上海一所211大學,GPA3.2。國內一線媒體3年商業新聞記者的工作經驗。一直在考慮是不是出國。
  • 請假這麼難,不裸辭,你是如何面試並順利拿到offer的?
    據我粗略統計,在辦理離職手續的人員當中,已經拿到心儀offer和準備離職後再看機會的,大概要各佔一半。如果進行更進一步分類的話,一般來說,高管和工作年限較短的基層員工裸辭的比例更高;有一定工作經驗、技術性員工及中基層管理人員在拿到心儀offer之後再正式辦理離職手續的比例更高。
  • 10家科技和金融公司full-time面試總結(offer@Linkedin, Goldman Sachs)
    進入正題前先來點題外話,關於我為什麼沒拿到return offer。我認識的一些同學和這個版上大牛都有拿到return offer的,但是我認為失敗的教訓比成功的經驗更有教育意義,因此我很樂意在這裡分享。Amazon的return offer在你實習結束的最後一天就能見分曉。Manager會找你單獨談話,告訴你的performance review,還有offer結果。
  • 電商專業的我,第一次面試就拿到了offer!
    不要慌聘小哥給大家分享切身經歷我是如何第一次面試就拿到唯品會的offer我在學校學的是電子商務專業,跟大家一樣愛玩,平時喜歡玩點手遊,老師布置作業的時候不想做,看看別的同學,抄一抄完事。臨近畢業我卻慌了,平時功課不紮實...
  • 10個設計師的面試技巧輕鬆幫你拿到 Offer
    那麼對於那些準備看機會的小夥伴而言,在整個面試流程中, 實際上從收到面試邀請的那一刻,你就得開始詳細的去了解你面試的這個崗位,需要什麼樣的能力,包括未來面向的方向是什麼,根據這些要求,來調整自己表述的內容方向,展示相關的能力來滿足面試官的預期。這樣最終通過並拿到offer的機率,才是最大的。
  • 5個冷門但超實用的面試技巧,快速拿到更好offer
    我們今天所說的,不是該記住哪些知識點,不是怎樣描述自己的工作成績,而是個人的心態、行為層面,如何影響面試官對你的估值。並從5個環節,帶你迅速提高應聘能力,拿到更好的offer。
  • 【面試分享】大三本科生拿到阿里研發、網易郵件、騰訊微信實習offer面試經驗分享
    (已經拿到網易和微信的offer)PS: 總結不是空穴來風, 每次面試完, 我都會坐著認真總結之前的面試, 記錄每道題, 每個答案的關鍵點, 再比對下自己的回答是否完整。具體題目可以在這裡看到:阿里筆試題雖然筆試通過了, 不過現場面試的時間和課程衝突了, 然後就沒有跑去杭州面試。於是乎, 和阿里就這樣不了了之了。網易_郵件部門(拿到offer)在結束阿里內推沒多久, 偶然在網上看到網易的一個招聘。 因為方式比較新穎, 就關注了下。
  • 面試官問:你目前拿到幾個offer,該如何回答?高情商的這麼回答
    如果面試官問你目前拿到幾個offer,怎麼回答才好?其實,這是求職過程中很常見的面試問題。看到這個面試問題的時候,有的朋友會感覺腦瓜子嗡嗡的,不知如何回答。所以,在回答這個問題之前,我們要搞清楚面試官的用意,做到知己知彼。
  • 6天面試10家,已經拿到offer,Java程式設計師的面試總結分享
    大約2天後打電話讓去複試,因為我手裡有offer了就給hr說了情況,我說你問下,如果薪水不到,我就不去了。後來hr回復他們確實給不了,我說那就算了。這家公司是好的開頭,整個信心提升了好多。二面問的是資料庫,線程方面知識,我感覺答的倒是一般,大約聊了半個小時,然後說我們今天就聊到這,然後我就回去準備下一家,然後回來路上一面就給我打電話說你面試通過了,薪水按照你說的來,問我啥時候入職我說下周,他說儘快,最後hr也給我說了薪水,過了一天就發了offer,這家公司感覺還行吧,最後只是感覺挺對不起hr的,答應去沒去,打電話時候明顯生氣了。
  • 《令人心動的offer》面試篇:當對方問你想來嗎?不要猶豫拒絕!
    前段時間,推送了《令人心動的offer》簡歷篇,今天給大家介紹《令人心動的offer》的面試篇。 面試部分讓我印象特別深刻的是賀鑫磊和詹秋怡,面對面試官的問題的回答,她們表現差別很大,尤其是兩個人對求職崗位的渴求程度,完全不一樣,前者猶豫,後者堅決。
  • 第一次面試就拿到offer,這些經驗分享給你
    回顧之前找工作的情景,我是8月2號從華清畢業的,但是剛畢業我還沒有足夠的勇氣投簡歷,複習了面試題之後我才開始投的簡歷。準確的來說就是8月5號早上開始投的簡歷。剛開始投簡歷時,會有許多培訓機構打來電話,這種你不清楚的時候,最好打電話問就業老師,根據就業老師的反饋信息,再決定是否值得去面試。
  • 西北大學畢業生視頻面試四場已拿到一份offer
    視頻面試四場,已經拿到一份offer,西北大學應屆畢業生劉思諾說,視頻面試不用直接面對HR反而更放得開,但一定要提前做好功課。20多分鐘的視頻面試,招聘方共提出6個問題,包括自我介紹、對公司的了解、五年職業規劃、校內實踐活動中遇到的困難以及解決辦法、自身缺點和崗位職責勝任力等問題。劉思諾一一作出應答,她還就自己關心的崗位信息、薪資待遇等問題進行了諮詢。其實這並非劉思諾進行的第一場視頻面試,此前她已進行了三場視頻面試,還錄製了一堂試講視頻課,拿到了一個教育機構的offer。
  • 面試8次,仍沒有拿到offer:你的表現,暴露了你面試失敗的原因
    之前有一個夥伴,一臉苦惱的告訴我,她自己面試了8次都沒有收到一個offer。我聽到這,難免覺得有點兒奇怪,按照概率學來說每5次面試就應該有一次成功。是不是她缺少工作經驗?其實不是,她的工作經驗雖然算不上豐富,但不是職場小白。