escape()
, decodeURIComponent()
, decodeURI
之間的區別是什麼?++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++javascript
同源策略及跨域請求的方法和原理(比較JSONP和document.domain的不一樣及優劣,以及HTML5的跨域方案)
答案:同源策略是客戶端腳本(尤爲是Javascript)的重要的安全度量標準。它最先出自Netscape Navigator2.0,其目的是防止某個文檔或腳本從多個不一樣源裝載。這裏的同源指的是:同協議,同域名和同端口。這裏說的js跨域是指經過js在不一樣的域之間進行數據傳輸或通訊,好比用ajax向一個不一樣的域請求數據,或者經過js獲取頁面中不一樣域的框架中(iframe)的數據。只要協議、域名、端口有任何一個不一樣,都被看成是不一樣的域。
瀏覽器的同源策略,其限制之一就是第一種方法中咱們說的不能經過ajax的方法去請求不一樣源中的文檔。 它的第二個限制是瀏覽器中不一樣域的框架之間是不能進行js的交互操做的。有一點須要說明,不一樣的框架之間(父子或同輩),是可以獲取到彼此的window對象的,但頭疼的是你卻不能使用獲取到的window對象的屬性和方法(html5中的postMessage方法是一個例外,還有些瀏覽器好比ie6也可使用top、parent等少數幾個屬性),總之,你能夠當作是隻能獲取到一個幾乎無用的window對象。html
document.domain:只要將同一域下不一樣子域的document.domain設置爲共同的父域,則這個時候咱們就能夠訪問對應window的各類屬性和方法了。例如:www.example.com父域下的www.lib.example.com和www.hr.example.com兩個子域,將對應頁面的document.domain設爲example.com便可。缺點:只能在一級域名相同時才能運用。前端
JSONP:原理是動態添加一個script標籤,而script標籤的src屬性是沒有跨域的限制的。jquery中還提供了一個$.getJSON(url,arg,callback(data))用來進行jsonp訪問。缺點:只支持get不支持post;只支持http請求這種狀況,不能解決不一樣域兩個頁面之間如何進行JavaScript調用的問題;JSONP請求失敗時不返回http狀態碼。html5
CORS(跨域資源共享):HTML5引入的新的跨域的方法,不過須要在請求頭和相應頭設置相應的Access-Control-屬性。缺點:兼容性問題,適合一些新的瀏覽器。java
參考:
說說JSON和JSONP
js中幾種實用的跨域方法原理詳解
The Same Origin Policy: JSONP vs The document.domain Property
HTTP訪問控制(CORS)node
JavaScript數據類型
答案: JavaScript中有5種簡單數據類型(也稱爲基本數據類型):Undefined、Null、Boolean、Number和String。還有1種複雜數據類型——Object,Object本質上是由一組無序的名值對組成的。jquery
JavaScript字符串轉化
答案:熟悉基本的字符串操做函數,參考
JavaScript中常見的字符串操做函數及用法git
JSONP原理及優缺點
答案:具體JSONP的原理可參考1,說白了就是插入一個script標籤,其src指向跨域接口,返回對應的callback(data),其中data是json格式,callback是頁面已存在的function。
優勢:它不像XMLHttpRequest對象實現的Ajax請求那樣受到同源策略的限制;它的兼容性更好,在更加古老的瀏覽器中均可以運行,不須要XMLHttpRequest或ActiveX的支持;而且在請求完畢後能夠經過調用callback的方式回傳結果。
缺點:它只支持GET請求而不支持POST等其它類型的HTTP請求;它只支持跨域HTTP請求這種狀況,不能解決不一樣域的兩個頁面之間如何進行JavaScript調用的問題。angularjs
XMLHttpRequest
答案:輕鬆掌握XMLHttpRequest對象es6
事件委託
答案:使用事件委託技術能讓你避免對特定的每一個節點添加事件監聽器;相反,事件監聽器是被添加到它們的父元素上。事件監聽器會分析從子元素冒泡上來的事件,找到是哪一個子元素的事件。
前端模塊化(AMD和CommonJS的原理及異同,seajs和requirejs的異同和用法
答案:
使用AMD\CommonJS\ES Harmony編寫模塊化的JavaScript
RequireJS中文網
SeaJS對模塊的態度是懶執行,SeaJS只會在真正須要使用(依賴)模塊時才執行該模塊;而RequireJS對模塊的態度是預執行;會先儘早地執行(依賴)模塊, 至關於全部的require都被提早了, 並且模塊執行的順序也不必定
SeaJS和RequireJS最大的不一樣,其中AMD和CMD的區別能夠看玉伯在知乎上的回答
常見的cookie操做包括建立cookie、添加cookie、刪除cookie等,相應函數參考:
//添加(daysToLive大於0)cookie/刪除(daysToLive爲0)cookie function setcookie(name,value,daysToLive){ var cookie = name + "=" + encodeURIComponent(value); if(typeof daysToLive === "number"){ cookie += ";max-age=" + (daysToLive*60*60*24); } document.cookie = cookie; } //解析cookie,直接getcookie()[name]獲取對應的name cookie function getcookie(){ var cookies = {}; var all = document.cookie; if(all === ""){ return false; } var list = all.split(";"); for(var i=0;i < list.length; i++){ var cookie = list[i]; var p = cookie.indexOf("="); var name = cookie.substring(0,p); var value = cookie.substring(p+1); value = decodeURIComponent(value); cookies[name] = value; } return cookies; } //刪除某個cookie function deletecookie( name ) { document.cookie = name + '=; expires=Thu, 01 Jan 1970 00:00:01 GMT;'; //或者 document.cookie = name + '=; expires=' + (new Date(1970)).toGMTString(); }
seaJS的用法及原理,依賴加載的原理、初始化、實現等
答案:模塊化開發之sea.js實現原理總結,簡言之就是要解決三個問題,分別爲:
1.模塊加載(插入script標籤來加載模塊。你在頁面看不到標籤是由於模塊被加載完後刪除了對應的script標籤);
2.模塊依賴(按依賴順序依賴);
3.命名衝突(封裝一層define,全部的都成爲了局部變量,並經過exports暴漏出去)。
this問題
答案:別再爲了this發愁了------JS中的this機制
模塊化原理(做用域)
答案:其中seajs的原理參考第10題。大體原理都相似。
JavaScript動畫算法
拖拽的實現
JavaScript原型鏈及JavaScript如何實現繼承、類的
答案:原型鏈:就是每一個構造函數都有一個原型對象,原型對象包含一個指向構造函數的指針(prototype),而實例則包含一個指向原型對象的內部指針(proto),經過將子構造函數的原型指向父構造函數的實例。
參考:
JS 面向對象之繼承 -- 原型鏈
js 基於原型的類實現詳解
閉包及閉包的用處,以及閉包可能形成的不良後果
答案:好處:可以實現封裝和緩存等;壞處:就是消耗內存、不正當使用會形成內存溢出的問題。
聊一下JS中的做用域scope和閉包closure
javascript 閉包的好處及壞處
常見算法的JS實現(如快排、冒泡等)
答案:經常使用排序算法之JavaScript實現。這裏有一篇阮一峯老師寫的,很是不錯的快排算法,快速排序(Quicksort)的Javascript實現。
和排序算法. 還有如《五大經常使用算法》等。
事件冒泡和事件捕獲
答案:W3C中定義事件的發生經歷三個階段:捕獲階段(capturing)、目標階段(targeting)、冒泡階段(bubbling)。
阻止事件傳播的方法:ie下:window.event.cancelBubble = true; 其餘瀏覽器:e.stopPropagation()。
參考:
事件冒泡和事件捕獲
瀏覽器檢測(能力檢測、怪癖檢測等)
JavaScript代碼測試
答案:平時在測試方面作的比較少,通常用JSlint檢查一些常見的錯誤。對於功能性的可能會使用基於karma+Jasmine測試框架來作。
call與apply的做用及不一樣
答案:做用是綁定this指針,設定函數中this的上下文環境。第二個參數不一樣,apply是類數組,而call是一些列參數。
bind的用法,以及如何實現bind的函數和須要注意的點
答案:bind的做用與call和apply相同,區別是call和apply是當即調用函數,而bind是返回了一個函數,須要調用的時候再執行。
一個簡單的bind函數實現以下:
Function.prototype.bind = function(ctx) { var fn = this; return function() { fn.apply(ctx, arguments); }; };
可參考:How is bind() different from call() & apply() in Javascript?
變量名提高
答案:參考16中的博客及評論部分。
== 與 ===
答案:前者隱式類型轉換,後者嚴格對比。
"use strict"做用
答案:做用是爲了規範js代碼,消除一些不合理、不嚴謹的地方;提升效率;爲之後新版本js作鋪墊。
主要限制:
1.全局變量顯式聲明;
2.禁止使用with,不推薦使用eval;
3.加強安全措施,好比禁止this關鍵字指向全局對象;
4.禁止刪除變量;
5.顯式報錯;好比對只讀屬性賦值,對一個使用getter方法讀取屬性賦值,對禁止擴展的對象添加新屬性;
6.重名錯誤,對象不能有重名的屬性,函數不能有重名的參數;
7.禁止八進制表示法;
8.argument對象的限制;好比禁止使用arguments.callee;
9.函數必須聲明在頂層;
10.新增保留字:implements, interface, let, package, private, protected, public, static, yield
AJAX請求的細節和原理
答案:原生的細節也須要重點研究,實際上是jQuery ajax
函數柯里化(Currying)
答案: 柯里化(Currying),是把接受多個參數的函數變換爲接受單一參數(最初函數的第一個參數)的函數,而且返回接受餘下的參數並且返回結果的新函數的技術。
做用:
1.參數複用;在柯里化的外圍函數中添加複用的參數便可。
2.提早返回;參看「參考」中綁定事件的例子。
3.延遲計算/運行;其實Function.prototype.bind的方法中延遲計算就是運用的柯里化。
參考:
JS中的柯里化(currying)
NodeJS健壯性方面的實踐(子進程等)
答案:同29。
NodeJS可否用利用多核實如今計算性能上的劣勢等
jQuery鏈式調用的原理
ES6及jQuery新引進的Promise有什麼用處、Promise的原理
NodeJS的優缺點及使用場景
JS中random的機率問題
客戶端存儲及他們的異同(例如:cookie, sessionStorage和localStorage等)
共同點:都是保存在瀏覽器端,且同源的。
區別:
1.cookie數據始終在同源的http請求中攜帶(即便不須要),即cookie在瀏覽器和服務器間來回傳遞。而sessionStorage和localStorage不會自動把數據發給服務器,僅在本地保存。
2.cookie數據還有路徑(path)的概念,能夠限制cookie只屬於某個路徑下。
3.存儲大小限制也不一樣,cookie數據不能超過4k,同時由於每次http請求都會攜帶cookie,因此cookie只適合保存很小的數據,如會話標識。sessionStorage和localStorage 雖然也有存儲大小的限制,但比cookie大得多,通常爲5M左右。
4.數據有效期不一樣,sessionStorage僅在當前瀏覽器窗口關閉前有效,天然也就不可能持久保持;localStorage始終有效(除非清除),窗口或瀏覽器關閉也一直保存,所以用做持久數據;cookie只在設置的cookie過時時間以前一直有效,即便窗口或瀏覽器關閉。
5.做用域不一樣,sessionStorage不在不一樣的瀏覽器窗口中共享,即便是同一個頁面;localStorage 在全部同源窗口中都是共享的;cookie也是在全部同源窗口中都是共享的。
6.Web Storage 支持事件通知機制(storage事件),能夠將數據更新的通知發送給監聽者。Web Storage 的 api 接口使用更方便。
AngularJS的文件管理及打包(包括模板打包及請求、JS的打包和請求等)
AngularJS的JS模塊管理及實踐
在你的Angular App頁面裏隨意加一個JS文件,會有什麼影響
答案:這個啥問題XX。
AngularJS directive及本身如何定義directive
AngularJS雙向綁定的原理及實現
答案:AngularJS數據綁定及AngularJS的工做機制,參考《AngularJS up and running》第203頁,十三章第一節。簡單說檢查數據有無更新,僅在如下事件發生時,即:XHR請求、頁面加載、用戶交互事件等。
你如何測試你的JS代碼
答案:平時在測試方面作的比較少,通常用JSlint檢查一些常見的錯誤。對於功能性的可能會使用基於karma的Jasmine測試框架來作。
DOM1\DOM2\DOM3都有什麼不一樣
XSS
答案:1. 《淺談javascript函數劫持》 2. 《xss零碎指南》
經常使用數組方法和數組算法(如數組去重、求交集、並集等)
答案:javascript經常使用數組算法總結和Merge/flatten an Array of Arrays in JavaScript
js數組去重複項
js中的垃圾回收機制
常見的JS設計模式
js獲取服務器精準時間(客戶端如何與服務器時間同步)
答案:思路:簡而言之就是發送一個ajax請求,而後獲取對應的HTTP Header中的time,因爲時延等問題形成時間在JS客戶端獲取後當前時間已經再也不是服務器此時的時間,而後用本地的時間減去獲取的服務器的時間,這應該就是時間偏移量。再新建一個時間,加上此偏移量應該就是此時此刻服務器的時間。代碼以下:
var offset = 0; function calcOffset() { var xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); xmlhttp.open("GET", "http://stackoverflow.com/", false); xmlhttp.send(); var dateStr = xmlhttp.getResponseHeader('Date'); var serverTimeMillisGMT = Date.parse(new Date(Date.parse(dateStr)).toUTCString()); var localMillisUTC = Date.parse(new Date().toUTCString()); offset = serverTimeMillisGMT - localMillisUTC; } function getServerTime() { var date = new Date(); date.setTime(date.getTime() + offset); return date; }
或者是:
var start = (new Date()).getTime(); var serverTime;//服務器時間 $.ajax({ url:"XXXX", success: function(data,statusText,res){ var delay = (new Date()).getTime() - start; serverTime = new Date(res.getResponseHeader('Date')).getTime() + delay; console.log(new Date(serverTime));//標準時間 console.log((new Date(serverTime)).toTimeString());//轉換爲時間字符串 console.log(serverTime);//服務器時間毫秒數 } })
什麼是js中的類數組對象
答案:一、它們都有一個合法的 length 屬性(0 到 2**32 - 1 之間的正整數)。二、length 屬性的值大於它們的最大索引(index)。
Node中exports和module.exports的區別
異步編程的瞭解
答案:
Grunt和Gulp的區別
AngularJS中service\factory\provider的區別
答案:講的很是不錯,能夠看看。Differences Between Providers In AngularJS和stackoverflow上的回答Service vs provider vs factory。若是英文看的不爽,這裏有一篇中文的,還不錯那傷不起的provider們啊。
JavaScript中異步編程的幾種方式
答案:參加阮一峯前輩寫的Javascript異步編程的4種方法,簡單說就是1回調函數2事件監聽3發佈/訂閱4promise
Nodejs開發踩過的坑
AngularJS中依賴注入的理解
JS中判斷是否爲數組
答案:isArray/typeof/instanceof,還有toString方法返回的字符串(數組返回'[Object Array]')。
Nodejs內存溢出
關於BFC和hasLayout
統計頁面中使用最多的三個標籤
答案:思路大體是首先獲取頁面中全部用到的標籤數組,而後依次遍歷,將用到的標籤放置新的hash表裏,每次檢測到相同標籤對應的key的value值加1.最後轉爲數組,排序,取前三個。實現方法以下:
function findTags(){ var allTags = document.getElementsByTagName("*"), hash = {}; for(var i = 0, j = allTags.length; i < j; i++){ var temp = allTags[i].tagName; if(hash[temp]){ hash[temp]++; }else{ hash[temp] = 1; } } var sortable = []; for (var i in hash){ sortable.push([i, hash[i]]); } sortable.sort(function(a, b) {return b[1] - a[1]}); return sortable.splice(0,3); }
JS內存泄露及解決方法
答案:JS內存泄露及解決方法
在瀏覽器地址欄按回車、F五、Ctrl+F5刷新網頁的區別
判斷兩個對象的相等
選取兩個數的最大公約數
Node模塊是如何尋址的
答案:《NodeJS深刻淺出》模塊開發那一章有詳解。
ES6新增的特性
答案:
escape()
, decodeURIComponent()
, decodeURI
之間的區別是什麼?CSRF?
答案:淺談CSRF攻擊方式