Object number function boolean underfind stringjavascript
強制(parseInt,parseFloat,number)
隱式(== - ===)css
前者是切割成數組的形式,後者是將數組轉換成字符串html
Unshift()頭部添加 shift()頭部刪除
Push()尾部添加 pop()尾部刪除前端
1.執行順序不同、
2.參數不同
3.事件加不加on
4.this指向問題java
Var ev = ev || window.event
document.documentElement.clientWidth || document.body.clientWidth
Var target = ev.srcElement||ev.targetnode
1.一個在url後面 一個放在虛擬載體裏面
2.有大小限制
3.安全問題
4.應用不一樣 一個是論壇等只須要請求的,一個是相似修改密碼的nginx
Object.call(this,obj1,obj2,obj3)
Object.apply(this,arguments)angularjs
使用eval parse 鑑於安全性考慮 使用parse更靠譜面試
function getStyle(obj, attr, value) { if(!value) { if(obj.currentStyle) { return obj.currentStyle(attr) } else { obj.getComputedStyle(attr, false) } } else { obj.style[attr]=value } }
讓利用事件冒泡的原理,讓本身的所觸發的事件,讓他的父元素代替執行!ajax
閉包就是可以讀取其餘函數內部變量的函數。
http://blog.csdn.net/gaoshanw... (問這個問題的不是一個公司)
也能夠直接點擊此處查看以前更的關於閉包的文章
stoppropagation / preventdefault
obj.appendChidl()
obj.innersetBefore
obj.replaceChild
obj.removeChild
動態建立script標籤,回調函數
Ajax是頁面無刷新請求數據操做
本地對象爲array obj regexp等能夠new實例化
內置對象爲gload Math 等不能夠實例化的
宿主爲瀏覽器自帶的document,window 等
頁面加載完成有兩種事件:
一.是ready,表示文檔結構已經加載完成(不包含圖片等非文字媒體文件)。
二.是onload,指示頁面包含圖片等文件在內的全部元素都加載完成。
前者會自動轉換類型
後者不會
同源策略是一個很重要的安全理念,它在保證數據的安全性方面有着重要的意義,
一段腳本只能讀取來自於同一來源的窗口和文檔的屬性,這裏的同一來源指的是協議、域名和端口號的組合
var arr = [ 1,5,1,7,5,9]; Math.max(...arr) // 9
[...new Set([2,"12",2,12,1,2,1,6,12,13,6])] // [2, "12", 12, 1, 6, 13]
升序:
var numberArray = [3,6,2,4,1,5]; numberArray.sort(function(a,b){ return a-b; }) console.log(numberArray);
var examplearr=[8,94,15,88,55,76,21,39]; function sortarr(arr){ for(i=0;i<arr.length-1;i++){ for(j=0;j<arr.length-1-i;j++){ if(arr[j]>arr[j+1]){ var temp=arr[j]; arr[j]=arr[j+1]; arr[j+1]=temp; } } } return arr; } sortarr(examplearr); console.log(examplearr);
null:表示無值;undefined:表示一個未聲明的變量,或已聲明但沒有賦值的變量,
或一個並不存在的對象屬性。
1.因爲閉包會使得函數中的變量都被保存在內存中,內存消耗很大,因此不能濫用閉包,不然會形成網頁的性能問題,在IE中可能致使內存泄露。解決方法是,在退出函數以前,將不使用的局部變量所有刪除。
2.閉包會在父函數外部,改變父函數內部變量的值。因此,若是你把父函數看成對象(object)使用,把閉包看成它的公用方法(Public Method),把內部變量看成它的私有屬性(private value),這時必定要當心,不要隨便改變父函數內部變量的值。
(關於閉包,詳細瞭解請看JavaScript之做用域與閉包詳解)
JSONP (JSON with Padding)是一個簡單高效的跨域方式,HTML中的script標籤能夠加載並執行其餘域的javascript,因而咱們能夠經過script標記來動態加載其餘域的資源。例如我要從域A的頁面pageA加載域B的數據,那麼在域B的頁面pageB中我以JavaScript的形式聲明pageA須要的數據,而後在 pageA中用script標籤把pageB加載進來,那麼pageB中的腳本就會得以執行。JSONP在此基礎上加入了回調函數,pageB加載完以後會執行pageA中定義的函數,所須要的數據會以參數的形式傳遞給該函數。JSONP易於實現,可是也會存在一些安全隱患,若是第三方的腳本隨意地執行,那麼它就能夠篡改頁面內容,截獲敏感數據。可是在受信任的雙方傳遞數據,JSONP是很是合適的選擇。
AJAX是不跨域的,而JSONP是一個是跨域的,還有就是兩者接收參數形式不同!
在函數執行時,把變量的聲明提高到了函數頂部,而其值定義依然在原來位置。
如下函數把獲取一個key的參數。
function parseQueryString ( name ){ name = name.replace(/[\[]/,"\\\["); var regexS = "[\\?&]"+name+"=([^&#]*)"; var regex = new RegExp( regexS ); var results = regex.exec( window.location.href ); if(results == null) { return ""; } else { return results[1]; } }
arguments雖然有一些數組的性質,但其並不是真正的數組,只是一個類數組對象。
其並無數組的不少方法,不能像真正的數組那樣調用.jion(),.concat(),.pop()等方法。
在代碼中出現表達式-「use strict」; 意味着代碼按照嚴格模式解析,這種模式使得Javascript在更嚴格的條件下運行。
好處:
1.消除Javascript語法的一些不合理、不嚴謹之處,減小一些怪異行爲;
2.消除代碼運行的一些不安全之處,保證代碼運行的安全;
3.提升編譯器效率,增長運行速度;
壞處:
1.一樣的代碼,在」嚴格模式」中,可能會有不同的運行結果;一些在」正常模式」下能夠運行的語句,在」嚴格模式」下將不能運行。
1.就是一個函數的調用過程。那麼就從理解這個調用過程開始吧。
函數a有一個參數,這個參數是個函數b,當函數a執行完之後執行函數b。那麼這個過程就叫回調。
2.另外種解釋:開發網站的過程當中,咱們常常遇到某些耗時很長的javascript操做。其中,既有異步的操做(好比ajax讀取服務器數據),也有同步的操做(好比遍歷一個大型數組),它們都不是當即能獲得結果的。
一般的作法是,爲它們指定回調函數(callback)。即事先規定,一旦它們運行結束,應該調用哪些函數。
let obj = {}; let arr = []; console.log(typeof obj === 'object'); //true console.log(typeof arr === 'object'); //true
從上面的輸出結果可知,typeof bar === 「object」 並不能準確判斷 bar 就是一個 Object。能夠經過 Object.prototype.toString.call(bar) === 「[object Object]」 來避免這種弊端:
let obj = {}; let arr = []; console.log(Object.prototype.toString.call(obj)); //[object Object] console.log(Object.prototype.toString.call(arr)); //[object Array]
console.log(1 + "2" + "2"); //122 console.log(1 + +"2" + "2"); //32 console.log(1 + -"1" + "2"); //02 console.log(+"1" + "1" + "2"); //112 console.log( "A" - "B" + "2"); //NaN2 console.log( "A" - "B" + 2); //NaN console.log('3' + 2 + 1);//321 console.log(typeof +'3'); //number console.log(typeof (''+3)); //string console.log('a' * 'sd'); //NaN
或邏輯時:當0在前面時console.log((0|| 2));則輸出爲後面的數,爲2;
當除0覺得的數在前面時console.log((2|| 0));則輸出爲2;
與邏輯時:當只要有0時console.log(0&&2 );則輸出都爲0;
當不存在0時,console.log(1&&2 );則輸出都爲後面的一個,爲2; console.log(2&&1 );則輸出爲1;
0, '0', +0, -0, false, '',null,undefined,null,NaN
要注意空數組([])和空對象({}):
console.log([] == false) //true console.log({} == false) //false console.log(Boolean([])) //true
var a={}, b={key:'b'}, c={key:'c'}; a[b]=123; a[c]=456; console.log(a[b]);
由於在設置對象屬性時,JS將隱式地stringify參數值。
在本例中,因爲b和c都是對象,它們都將被轉換爲「[object object]」。
所以,a[b]和[c]都等價於[[object object]],而且能夠互換使用。
因此,設置或引用[c]與設置或引用a[b]徹底相同。`
(function(x) { return (function(y) { console.log(x); })(2) })(1);
輸出1,閉包可以訪問外部做用域的變量或參數。
function Foo() { getName = function () { alert (1); }; return this; } Foo.getName = function () { alert (2);}; Foo.prototype.getName = function () { alert (3);}; var getName = function () { alert (4);}; function getName() { alert (5);} Foo.getName(); //2 getName(); //4 Foo().getName(); //1 getName(); //1 new Foo.getName(); //2 new Foo().getName(); //3 new new Foo().getName(); //3
AJAX全稱爲「Asynchronous JavaScript And XML」(異步JavaScript和XML)是指一種建立交互式網頁應用的開發技術、改善用戶體驗,實現無刷新效果。
優勢
a、不須要插件支持
b、優秀的用戶體驗
c、提升Web程序的性能
d、減輕服務器和帶寬的負擔
缺點
a、破壞瀏覽器「前進」、「後退」按鈕的正常功能,能夠經過簡單的插件彌補
b、對搜索引擎的支持不足
a、什麼是deferred對象
在回調函數方面,jQuery的功能很是弱。爲了改變這一點,jQuery開發團隊就設計了deferred對象。
簡單說,deferred對象就是jQuery的回調函數解決方案。在英語中,defer的意思是」延遲」,因此deferred對象的含義就是」延遲」到將來某個點再執行。
它解決了如何處理耗時操做的問題,對那些操做提供了更好的控制,以及統一的編程接口。
b、它的主要功能,能夠歸結爲四點:
(1)、實現鏈式操做
(2)、指定同一操做的多個回調函數
(3)、爲多個操做指定回調函數
(4)、普通操做的回調函數接口
跨域是指不一樣域名之間相互訪問。
JavaScript同源策略的限制,A域名下的JavaScript沒法操做B或是C域名下的對象
實現:
(1)、JSONP跨域:利用script腳本容許引用不一樣域下的js實現的,將回調方法帶入服務器,返回結果時回調。
1 經過jsonp跨域
1.原生實現: <script> var script = document.createElement('script'); script.type = 'text/javascript'; // 傳參並指定回調執行函數爲onBack script.src = 'http://www.....:8080/login?user=admin&callback=onBack'; document.head.appendChild(script); // 回調執行函數 function onBack(res) { alert(JSON.stringify(res)); } </script> 2.document.domain + iframe跨域 此方案僅限主域相同,子域不一樣的跨域應用場景。 1.父窗口:(http://www.domain.com/a.html) <iframe id="iframe" src="http://child.domain.com/b.html"></iframe> <script> document.domain = 'domain.com'; var user = 'admin'; </script> 2.子窗口:(http://child.domain.com/b.html) <script> document.domain = 'domain.com'; // 獲取父窗口中變量 alert('get js data from parent ---> ' + window.parent.user); </script> 弊端:請看下面渲染加載優化 一、 nginx代理跨域 二、 nodejs中間件代理跨域 三、 後端在頭部信息裏面設置安全域名
(3)、跨域資源共享(CORS)
跨域資源共享(CORS)是一種網絡瀏覽器的技術規範,它爲Web服務器定義了一種方式,容許網頁從不一樣的域訪問其資源。
CORS與JSONP相比:
a、JSONP只能實現GET請求,而CORS支持全部類型的HTTP請求。
b、使用CORS,開發者可使用普通的XMLHttpRequest發起請求和得到數據,比起JSONP有更好的錯誤處理。
c、JSONP主要被老的瀏覽器支持,它們每每不支持CORS,而絕大多數現代瀏覽器都已經支持了CORS。
更多跨域的具體內容請看 https://segmentfault.com/a/11...
a.模板引擎(這裏特指用於Web開發的模板引擎)是爲了使用戶界面與業務數據(內容)分離而產生的,它能夠生成特定格式的文檔,用於網站的模板引擎就會生成一個標準的HTML文檔。
b.在一些示例中javascript有大量的html字符串,html中有一些像onclick樣的javascript,這樣javascript中有html,html中有javascript,代碼的偶合度很高,不便於修改與維護,使用模板引擎能夠解決問題。
JavaScript是一種動態、弱類型、基於原型的語言,經過瀏覽器能夠直接執行。
當瀏覽器遇到<script> 標記的時候,瀏覽器會執行之間的javascript代碼。嵌入的js代碼是順序執行的,每一個腳本定義的全局變量和函數,均可以被後面執行的腳本所調用。 變量的調用,必須是前面已經聲明,不然獲取的變量值是undefined。
基本數據類型:字符串 String、數字 Number、布爾Boolean
複合數據類型:數組 Array、對象 Object
特殊數據類型:Null 空對象、Undefined 未定義
a、ionic是一個用來開發混合手機應用的,開源的,免費的代碼庫。能夠優化html、css和js的性能,構建高效的應用程序,並且還能夠用於構建Sass和AngularJS的優化。
b、AngularJS經過新的屬性和表達式擴展了HTML。AngularJS能夠構建一個單一頁面應用程序(SPAs:Single Page Applications)。
c、Ionic是一個混合APP開發工具,它以AngularJS爲中間腳本工具(稱爲庫,彷佛又不恰當),因此,你若是要使用Ionic開發APP,就必須瞭解AngularJS。
(1)、使用閉包主要是爲了設計私有的方法和變量。閉包的優勢是能夠避免全局變量的污染,
缺點是閉包會常駐內存,會增大內存使用量,使用不當很容易形成內存泄露。
(2)、閉包有三個特性:
a、函數嵌套函數
b、函數內部能夠引用外部的參數和變量
c、參數和變量不會被垃圾回收機制回收
回答一:
(1)、js的this指向是不肯定的,也就是說是能夠動態改變的。call/apply 就是用於改變this指向的函數,這樣設計可讓代碼更加靈活,複用性更高
(2)、this 通常狀況下,都是指向函數的擁有者。
(3)、在函數自執行裏,this 指向的是 window 對象。
擴展:關於this,還有一個地方比較讓人模糊的是在dom事件裏,一般有以下3種狀況:
a、使用標籤屬性註冊事件,此時this指向的是window對象。
b、對與a,要讓this指向input,能夠將this做爲參數傳遞。
c、使用addEventListener等註冊事件。此時this也是指向 input。
回答二:
(1)、處於全局做用域下的this:
this;/*window*/ var a = {name: this}/*window*/ var b = [this];/*window*/
在全局做用域下,this默認指向window對象。
(2)、處在函數中的this,又分爲如下幾種狀況:
a、通常定義的函數,而後通常的執行:
var a = function(){ console.log(this); } a();/*window*/
this仍是默認指向window。
b、通常定義,用new調用執行:
var a = function(){ console.log(this); } new a();/*新建的空對象*/
這時候讓this指向新建的空對象,咱們才能夠給空對象初始化自有變量
c、做爲對象屬性的函數,調用時:
var a = { f:function(){ console.log(this) } } a.f();/*a對象*/
這時候this指向調用f函數的a對象。
(3)、經過call()和apply()來改變this的默認引用:
var b = {id: 'b'}; var a = { f:function(){ console.log(this) } } a.f.call(b);/*window*/
全部函數對象都有的call方法和apply方法,它們的用法大致類似,f.call(b);的意思 是,執行f函數,並將f函數執行期活動對象裏的this指向b對象,這樣標示符解析時,this就會是b對象了。不過調用函數是要傳參的。因此,f.call(b, x, y); f.apply(b, [x, y]);好吧,以上就是用call方法執行f函數,與用apply方法執行f函數時傳參方式,它們之間的差別,你們一目瞭然:apply經過數組的方式傳遞參數,call經過一個個的形參傳遞參數。
(4)、一些函數特殊執行狀況this的指向問題:
a、setTimeout()和setInverval(): var a = function(){ console.log(this); } setTimeout(a,0);/*window*/ setInterval()相似。
b、dom模型中觸發事件的回調方法執行中活動對象裏的this指向該dom對象。
(1) 工廠模式
function Parent(){ var Child = new Object(); Child.name="欲淚成雪"; Child.age="20"; return Child; }; var x = Parent();
引用該對象的時候,這裏使用的是 var x = Parent()而不是 var x = new Parent();由於後者會可能出現不少問題(前者也成爲工廠經典方式,後者稱之爲混合工廠方式),不推薦使用new的方式使用該對象
(2)構造函數方式
function Parent(){ this.name="欲淚成雪"; this.age="20"; }; var x =new Parent();
(3) 原型模式
function Parent(){ }; Parent.prototype.name="欲淚成雪"; Parent.prototype.age="20"; var x =new Parent();
(4)混合的構造函數,原型方式(推薦)
function Parent(){ this.name="欲淚成雪"; this.age=22; }; Parent.prototype.lev=function(){ return this.name; }; var x =new Parent();
(5)動態原型方式
function Parent(){ this.name="欲淚成雪"; this.age=22; ; if(typeof Parent._lev=="undefined"){ Parent.prototype.lev=function(){ return this.name; } Parent._lev=true; } }; var x =new Parent();
回答一:
(1)、IE7/8 DOM循環引用致使內存泄漏
a、多個對象循環引用
b、循環引用本身
(2)、基礎的DOM泄漏
當原有的DOM被移除時,子結點引用沒有被移除則沒法回收。
(3)、timer定時器泄漏
這個時候你沒法回收buggyObject,解決辦法,先中止timer而後再回收
回答二:
內存泄漏指任何對象在您再也不擁有或須要它以後仍然存在。
垃圾回收器按期掃描對象,並計算引用了每一個對象的其餘對象的數量。若是一個對象的引用數量爲 0(沒有其餘對象引用過該對象),或對該對象的唯一引用是循環的,那麼該對象的內存便可回收。
setTimeout 的第一個參數使用字符串而非函數的話,會引起內存泄漏。
閉包、控制檯日誌、循環(在兩個對象彼此引用且彼此保留時,就會產生一個循環)也會引起內存泄漏問題。
(1)、放在底部,雖然放在底部照樣會阻塞全部呈現,但不會阻塞資源下載。
(2)、若是嵌入JS放在head中,請把嵌入JS放在CSS頭部。
(3)、使用defer(只支持IE)
(4)、不要在嵌入的JS中調用運行時間較長的函數,若是必定要用,能夠用setTimeout來調用
a、在一個對象上觸發某類事件(好比單擊onclick事件),若是此對象定義了此事件的處理程序,那麼此事件就會調用這個處理程序,若是沒有定義此事件處理程序或者事件返回true,那麼這個事件會向這個對象的父級對象傳播,從裏到外,直至它被處理(父級對象全部同類事件都將被激活),或者它到達了對象層次的最頂層,即document對象(有些瀏覽器是window)。
b、冒泡型事件:事件按照從最特定的事件目標到最不特定的事件目標(document對象)的順序觸發
c、js冒泡機制是指若是某元素定義了事件A,如click事件,若是觸發了事件以後,沒有阻止冒泡事件,那麼事件將向父級元素傳播,觸發父類的click函數。
//阻止冒泡時間方法,兼容ie(e.cancleBubble)和ff(e.stopProgation)
function stopBubble(e){ var evt = e||window.event; evt.stopPropagation?evt.stopPropagation():(evt.cancelBubble=true);//阻止冒泡 evt.preventDefault
ES6 原生提供了 Promise 對象。
所謂 Promise,就是一個對象,用來傳遞異步操做的消息。它表明了某個將來纔會知道結果的事件(一般是一個異步操做),而且這個事件提供統一的 API,可供進一步處理。
Promise 對象有如下兩個特色:
(1)、對象的狀態不受外界影響。Promise 對象表明一個異步操做,有三種狀態:Pending(進行中)、Resolved(已完成,又稱 Fulfilled)和 Rejected(已失敗)。只有異步操做的結果,能夠決定當前是哪種狀態,任何其餘操做都沒法改變這個狀態。這也是 Promise 這個名字的由來,它的英語意思就是「承諾」,表示其餘手段沒法改變。
(2)、一旦狀態改變,就不會再變,任什麼時候候均可以獲得這個結果。Promise 對象的狀態改變,只有兩種可能:從 Pending 變爲 Resolved 和從 Pending 變爲 Rejected。只要這兩種狀況發生,狀態就凝固了,不會再變了,會一直保持這個結果。就算改變已經發生了,你再對 Promise 對象添加回調函數,也會當即獲得這個結果。這與事件(Event)徹底不一樣,事件的特色是,若是你錯過了它,再去監聽,是得不到結果的。
有了 Promise 對象,就能夠將異步操做以同步操做的流程表達出來,避免了層層嵌套的回調函數。此外,Promise 對象提供統一的接口,使得控制異步操做更加容易。
Promise 也有一些缺點。首先,沒法取消 Promise,一旦新建它就會當即執行,沒法中途取消。其次,若是不設置回調函數,Promise 內部拋出的錯誤,不會反應到外部。第三,當處於 Pending 狀態時,沒法得知目前進展到哪個階段(剛剛開始仍是即將完成)。
JavaScript是一種經過原型實現繼承的語言與別的高級語言是有區別的,像java,C#是經過類型決定繼承關係的,JavaScript是的動態的弱類型語言,總之能夠認爲JavaScript中全部都是對象,在JavaScript中,原型也是一個對象,經過原型能夠實現對象的屬性繼承,JavaScript的對象中都包含了一個」 prototype」內部屬性,這個屬性所對應的就是該對象的原型。
「prototype」做爲對象的內部屬性,是不能被直接訪問的。因此爲了方便查看一個對象的原型,Firefox和Chrome內核的JavaScript引擎中提供了」proto「這個非標準的訪問器(ECMA新標準中引入了標準對象原型訪問器」Object.getPrototype(object)」)。
原型的主要做用就是爲了實現繼承與擴展對象。
使用 typeof 運算符時採用引用類型存儲值會出現一個問題,不管引用的是什麼類型的對象,它都返回 「object」。ECMAScript 引入了另外一個 Java 運算符 instanceof 來解決這個問題。instanceof 運算符與 typeof 運算符類似,用於識別正在處理的對象的類型。與 typeof 方法不一樣的是,instanceof 方法要求開發者明確地確認對象爲某特定類型。
常見有冒泡和選擇,這裏利用sort排序
export const orderArr=(arr)=>{ arr.sort((a,b)=>{ return a-b //將arr升序排列,若是是倒序return -(a-b) }) }
export const orderArr=(arr)=>{ arr.sort((a,b)=>{ let value1 = a[property]; let value2 = b[property]; return value1 - value2;//sort方法接收一個函數做爲參數,這裏嵌套一層函數用 //來接收對象屬性名,其餘部分代碼與正常使用sort方法相同 }) }
export const traverseObj=(obj)=>{ for(let variable in obj){ //For…in遍歷對象包括全部繼承的屬性,因此若是 //只是想使用對象自己的屬性須要作一個判斷 if(obj.hasOwnProperty(variable)){ console.log(variable,obj[variable]) } } }
promise是一種封裝將來值的易於複用的異步任務管理機制,主要解決地獄回調和控制異步的順序
1.應用方法一
export const promiseDemo=()=>{ new Promise((resolve,reject)=>{ resolve(()=>{ let a=1; return ++a; }).then((data)=>{ console.log(data)//data值爲++a的值 }).catch(()=>{//錯誤執行這個 }) }) }
2.應用方法二
export const promiseDemo=()=>{ Promise.resolve([1,2,3]).then((data)=>{//直接初始化一個Promise並執行resolve方法 console.log(data)//data值爲[1,2,3] }) }
<script> function Click(){ window.event.returnValue=false; } document.oncontextmenu=Click; </script> 恢復方法:javascript:alert(document.oncontextmenu='')