前端開發面試題JS2

2一、如何判斷一個對象是否屬於某個類?html

 

  使用instanceofhtml5

  if(a instanceof Person){java

      alert('yes');node

   }jquery

 

2二、new操做符具體幹了什麼呢?web

 

(1)建立一個空對象,而且 this 變量引用該對象,同時還繼承了該函數的原型。ajax

(2)屬性和方法被加入到 this 引用的對象中。json

(3)新建立的對象由 this 所引用,而且最後隱式的返回 this 。後端

 

var obj = {};跨域

obj.__proto__ = Base.prototype;

Base.call(obj);

 

2三、Javascript中,有一個函數,執行時對象查找時,永遠不會去查找原型,這個函數是?

 

hasOwnProperty

 

javaScript中hasOwnProperty函數方法是返回一個布爾值,指出一個對象是否具備指定名稱的屬性。此方法沒法檢查該對象的原型鏈中是否具備該屬性;該屬性必須是對象自己的一個成員。

使用方法:

object.hasOwnProperty(proName)

其中參數object是必選項。一個對象的實例。

proName是必選項。一個屬性名稱的字符串值。

 

若是 object 具備指定名稱的屬性,那麼JavaScript中hasOwnProperty函數方法返回 true,反之則返回 false。

 

2四、JSON 的瞭解?

 

JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式。

它是基於JavaScript的一個子集。數據格式簡單, 易於讀寫, 佔用帶寬小

如:{"age":"12", "name":"back"}

 

JSON字符串轉換爲JSON對象:

var obj =eval('('+ str +')');

var obj = str.parseJSON();

var obj = JSON.parse(str);

 

JSON對象轉換爲JSON字符串:

var last=obj.toJSONString();

var last=JSON.stringify(obj);

[].forEach.call($$("*"),function(a){a.style.outline="1pxsolid #"+(~~(Math.random()*(1<<24))).toString(16)}) 能解釋一下這段代碼的意思嗎?

 

2五、js延遲加載的方式有哪些?

 

defer和async、動態建立DOM方式(用得最多)、按需異步載入js

 

2六、Ajax 是什麼? 如何建立一個Ajax?

 

ajax的全稱:AsynchronousJavascript And XML。

異步傳輸+js+xml。

所謂異步,在這裏簡單地解釋就是:向服務器發送請求的時候,咱們沒必要等待結果,而是能夠同時作其餘的事情,等到有告終果它本身會根據設定進行後續操做,與此同時,頁面是不會發生整頁刷新的,提升了用戶體驗。

 

(1)建立XMLHttpRequest對象,也就是建立一個異步調用對象

(2)建立一個新的HTTP請求,並指定該HTTP請求的方法、URL及驗證信息

(3)設置響應HTTP請求狀態變化的函數

(4)發送HTTP請求

(5)獲取異步調用返回的數據

(6)使用JavaScript和DOM實現局部刷新

 

2七、Ajax 解決瀏覽器緩存問題?

 

(1)在ajax發送請求前加上anyAjaxObj.setRequestHeader("If-Modified-Since","0")。

 

(2)在ajax發送請求前加上anyAjaxObj.setRequestHeader("Cache-Control","no-cache")。

 

(3)在URL後面加上一個隨機數: "fresh=" + Math.random();。

 

(4)在URL後面加上時間搓:"nowtime=" + new Date().getTime();。

 

(5)若是是使用jQuery,直接這樣就能夠了 $.ajaxSetup({cache:false})。這樣頁面的全部ajax都會執行這條語句就是不須要保存緩存記錄。

 

2八、同步和異步的區別?

 

同步的概念應該是來自於OS中關於同步的概念:不一樣進程爲協同完成某項工做而在前後次序上調整(經過阻塞,喚醒等方式).同步強調的是順序性.誰先誰後.異步則不存在這種順序性.

 

同步:瀏覽器訪問服務器請求,用戶看獲得頁面刷新,從新發請求,等請求完,頁面刷新,新內容出現,用戶看到新內容,進行下一步操做。

 

異步:瀏覽器訪問服務器請求,用戶正常操做,瀏覽器後端進行請求。等請求完,頁面不刷新,新內容也會出現,用戶看到新內容。

 

 

2九、如何解決跨域問題?

 

jsonp、 iframe、window.name、window.postMessage、服務器上設置代理頁面

 

30、模塊化開發怎麼作?

 

當即執行函數,不暴露私有成員

 

   var module1 = (function(){

    var_count = 0;

    var m1 =function(){

    //...

    };

    var m2 =function(){

    //...

    };

    return {

    m1 :m1,

    m2 : m2

    };

    })();

 

3一、AMD(Modules/Asynchronous-Definition)、CMD(CommonModule Definition)規範區別?

 

Asynchronous Module Definition,異步模塊定義,全部的模塊將被異步加載,模塊加載不影響後面語句運行。全部依賴某些模塊的語句均放置在回調函數中。

 

 區別:

 

    (1) 對於依賴的模塊,AMD 是提早執行,CMD 是延遲執行。不過RequireJS 從 2.0 開始,也改爲能夠延遲執行(根據寫法不一樣,處理方式不一樣)。CMD 推崇 as lazy as possible.

    (2)CMD 推崇依賴就近,AMD 推崇依賴前置。看代碼:

 

// CMD

define(function(require, exports, module) {

   var a = require('./a')

   a.doSomething()

   // 此處略去 100 行

   var b = require('./b') // 依賴能夠就近書寫

   b.doSomething()

   // ...

})

 

// AMD 默認推薦

define(['./a', './b'], function(a, b) { // 依賴必須一開始就寫好

   a.doSomething()

   // 此處略去 100 行

   b.doSomething()

   // ...

})

 

 

3二、異步加載JS的方式有哪些?

 

  (1)defer,只支持IE

 

  (2)async:

 

  (3)建立script,插入到DOM中,加載完畢後callBack

 

3三、documen.write和 innerHTML的區別

 

document.write只能重繪整個頁面

 

innerHTML能夠重繪頁面的一部分

 

3四、DOM操做——怎樣添加、移除、移動、複製、建立和查找節點?

 

(1)建立新節點

 createDocumentFragment()    //建立一個DOM片斷

 createElement()   //建立一個具體的元素

 createTextNode()   //建立一個文本節點

(2)添加、移除、替換、插入

 appendChild()

 removeChild()

 replaceChild()

 insertBefore() //在已有的子節點前插入一個新的子節點

(3)查找

 getElementsByTagName()    //經過標籤名稱

 getElementsByName()    //經過元素的Name屬性的值(IE容錯能力較強,會獲得一個數組,其中包括id等於name值的)

 getElementById()    //經過元素Id,惟一性

 

3五、.call() 和 .apply() 的區別?

 

  例子中用 add 來替換 sub,add.call(sub,3,1)== add(3,1) ,因此運行結果爲:alert(4);

 

  注意:js 中的函數實際上是對象,函數名是對 Function 對象的引用。

 

   function add(a,b)

    {

       alert(a+b);

    }

 

   function sub(a,b)

    {

       alert(a-b);

    }

 

   add.call(sub,3,1);

 

3六、jquery.extend 與jquery.fn.extend的區別?

 

* jquery.extend 爲jquery類添加類方法,能夠理解爲添加靜態方法

* jquery.fn.extend:

    源碼中jquery.fn= jquery.prototype,因此對jquery.fn的擴展,就是爲jquery類添加成員函數

使用:

jquery.extend擴展,須要經過jquery類來調用,而jquery.fn.extend擴展,全部jquery實例均可以直接調用。

 

 

3七、Jquery與jQuery UI 有啥區別?

 

*jQuery是一個js庫,主要提供的功能是選擇器,屬性修改和事件綁定等等。

 

*jQuery UI則是在jQuery的基礎上,利用jQuery的擴展性,設計的插件。

 提供了一些經常使用的界面元素,諸如對話框、拖動行爲、改變大小行爲等等

 

3八、jquery 中如何將數組轉化爲json字符串,而後再轉化回來?

 

jQuery中沒有提供這個功能,因此你須要先編寫兩個jQuery的擴展:

 

   $.fn.stringifyArray = function(array) {

       return JSON.stringify(array)

    }

 

   $.fn.parseArray = function(array) {

       return JSON.parse(array)

    }

 

    而後調用:

   $("").stringifyArray(array)

 

3九、針對 jQuery 的優化方法?

 

*基於Class的選擇性的性能相對於Id選擇器開銷很大,由於需遍歷全部DOM元素。

 

*頻繁操做的DOM,先緩存起來再操做。用Jquery的鏈式調用更好。

 好比:varstr=$("a").attr("href");

 

*for (var i = size; i < arr.length; i++){}

 for 循環每一次循環都查找了數組(arr) 的.length 屬性,在開始循環的時候設置一個變量來存儲這個數字,可讓循環跑得更快:

 for(var i = size, length = arr.length; i < length; i++) {}

 

40、如何判斷當前腳本運行在瀏覽器仍是node環境中?(阿里)

 

this === window ? 'browser' : 'node';

 

經過判斷Global對象是否爲window,若是不爲window,當前腳本沒有運行在瀏覽器中

 

4一、jQuery 的 slideUp動畫 ,若是目標元素是被外部事件驅動, 當鼠標快速地連續觸發外部元素事件, 動畫會滯後的反覆執行,該如何處理呢?

 

jquery stop(): 如:$("#div").stop().animate({width:"100px"},100);

 

4二、那些操做會形成內存泄漏?

 

內存泄漏指任何對象在您再也不擁有或須要它以後仍然存在。

垃圾回收器按期掃描對象,並計算引用了每一個對象的其餘對象的數量。若是一個對象的引用數量爲 0(沒有其餘對象引用過該對象),或對該對象的唯一引用是循環的,那麼該對象的內存便可回收。

 

setTimeout 的第一個參數使用字符串而非函數的話,會引起內存泄漏。

閉包、控制檯日誌、循環(在兩個對象彼此引用且彼此保留時,就會產生一個循環)

 

4三、JQuery一個對象能夠同時綁定多個事件,這是如何實現的?

 

* 多個事件同一個函數:

   $("div").on("click mouseover", function(){});

* 多個事件不一樣函數

   $("div").on({

       click: function(){},

       mouseover: function(){}

});

 

4四、知道什麼是webkit麼? 知道怎麼用瀏覽器的各類工具來調試和debug代碼麼?

 

Chrome,Safari瀏覽器內核。

 

4五、用js實現千位分隔符?

 

 

function commafy(num) {

   return num && num

       .toString()

       .replace(/(\d)(?=(\d{3})+\.)/g, function($0, $1) {

           return $1 + ",";

       });

}

console.log(commafy(1234567.90));//1,234,567.90

 

4六、檢測瀏覽器版本版本有哪些方式?

 

功能檢測、userAgent特徵檢測

 

好比:navigator.userAgent

//"Mozilla/5.0 (Macintosh; Intel MacOS X 10_10_2) AppleWebKit/537.36

 (KHTML, like Gecko) Chrome/41.0.2272.101 Safari/537.36"

 

4七、What is a Polyfill?

 

polyfill 是「在舊版瀏覽器上覆制標準 API 的 JavaScript 補充」,能夠動態地加載JavaScript 代碼或庫,在不支持這些標準 API 的瀏覽器中模擬它們。

例如,geolocation(地理位置)polyfill 能夠在 navigator 對象上添加全局的 geolocation 對象,還能添加 getCurrentPosition 函數以及「座標」回調對象,

全部這些都是 W3C 地理位置 API 定義的對象和函數。由於 polyfill 模擬標準 API,因此可以以一種面向全部瀏覽器將來的方式針對這些 API 進行開發,

一旦對這些 API 的支持變成絕對大多數,則能夠方便地去掉 polyfill,無需作任何額外工做。

 

4八、作的項目中,有沒有用過或本身實現一些polyfill 方案(兼容性處理方案)?

 

好比: html5shiv、Geolocation、Placeholder

 

4九、使用JS實現獲取文件擴展名?

 

function getFileExtension(filename) {

 return filename.slice((filename.lastIndexOf(".") - 1>>> 0) + 2);

}  

 

String.lastIndexOf() 方法返回指定值(本例中的'.')在調用該方法的字符串中最後出現的位置,若是沒找到則返回 -1。

對於'filename'和'.hiddenfile',lastIndexOf的返回值分別爲0和-1無符號右移操做符(»>) 將-1轉換爲4294967295,將-2轉換爲4294967294,這個方法能夠保證邊緣狀況時文件名不變。

String.prototype.slice() 從上面計算的索引處提取文件的擴展名。若是索引比文件名的長度大,結果爲""。

相關文章
相關標籤/搜索