前端面試題總結——JS(持續更新中)

前端面試題總結——JS(持續更新中)

1.javascript的typeof返回哪些數據類型

Object number function boolean underfind string

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

強制(parseInt,parseFloat,number)
隱式(== - ===)

3.split() join() 的區別

前者是切割成數組的形式,後者是將數組轉換成字符串

4.數組方法pop() push() unshift() shift()

Unshift()頭部添加 shift()頭部刪除
Push()尾部添加 pop()尾部刪除

5.IE和DOM事件流的區別

1.執行順序不一樣、
2.參數不一樣
3.事件加不加on
4.this指向問題

6.IE和標準下有哪些兼容性的寫法

Var ev = ev || window.event
document.documentElement.clientWidth || document.body.clientWidth
Var target = ev.srcElement||ev.target

7.ajax請求的時候get 和post方式的區別

1.一個在url後面 一個放在虛擬載體裏面
2.有大小限制
3.安全問題
4.應用不同 一個是論壇等只需要請求的,一個是類似修改密碼的

8.call和apply的區別

Object.call(this,obj1,obj2,obj3)
Object.apply(this,arguments)

9.ajax請求時,如何解析json數據

使用eval parse 鑑於安全性考慮 使用parse更靠譜

10.寫一個獲取非行間樣式的函數

function getStyle(obj, attr, value) {
if(!value) {
if(obj.currentStyle) {
return obj.currentStyle(attr)
}
else {
obj.getComputedStyle(attr, false)
}
}
else {
obj.style[attr]=value
}
}

11.事件委託(代理)是什麼

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

12.閉包是什麼,有什麼特性,對頁面有什麼影響

閉包就是能夠讀取其他函數內部變量的函數。
http://blog.csdn.net/gaoshanw… (問這個問題的不是一個公司)
也可以直接點擊此處查看之前更的關於閉包的文章

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

stoppropagation / preventdefault

14.添加 插入 替換 刪除到某個接點的方法

obj.appendChidl()
obj.innersetBefore
obj.replaceChild
obj.removeChild

15.解釋jsonp的原理,以及爲什麼不是真正的ajax

動態創建script標籤,回調函數
Ajax是頁面無刷新請求數據操作

16.javascript的本地對象,內置對象和宿主對象

本地對象爲array obj regexp等可以new實例化
內置對象爲gload Math 等不可以實例化的
宿主爲瀏覽器自帶的document,window 等

17.document load 和document ready的區別

頁面加載完成有兩種事件:
一.是ready,表示文檔結構已經加載完成(不包含圖片等非文字媒體文件)。
二.是onload,指示頁面包含圖片等文件在內的所有元素都加載完成。

18.””和“=”的不同

前者會自動轉換類型
後者不會

19.javascript的同源策略

同源策略是一個很重要的安全理念,它在保證數據的安全性方面有着重要的意義,
一段腳本只能讀取來自於同一來源的窗口和文檔的屬性,這裏的同一來源指的是協議、域名和端口號的組合

20.最快捷的數組求最大值

var arr = [ 1,5,1,7,5,9];
Math.max(...arr)  // 9 

21.更短的數組去重寫法

[...new Set([2,"12",2,12,1,2,1,6,12,13,6])]

// [2, "12", 12, 1, 6, 13]

22.排序算法

升序:

var numberArray = [3,6,2,4,1,5];
numberArray.sort(function(a,b){  
   return a-b;
})
console.log(numberArray);

23.冒泡排序

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);

24.null和undefined的區別:

null:表示無值;undefined:表示一個未聲明的變量,或已聲明但沒有賦值的變量,
或一個並不存在的對象屬性。

25.使用閉包的注意點:

1.由於閉包會使得函數中的變量都被保存在內存中,內存消耗很大,所以不能濫用閉包,否則會造成網頁的性能問題,在IE中可能導致內存泄露。解決方法是,在退出函數之前,將不使用的局部變量全部刪除。

2.閉包會在父函數外部,改變父函數內部變量的值。所以,如果你把父函數當作對象(object)使用,把閉包當作它的公用方法(Public Method),把內部變量當作它的私有屬性(private value),這時一定要小心,不要隨便改變父函數內部變量的值。 
(關於閉包,詳細瞭解請看JavaScript之作用域與閉包詳解)

26.請解釋JSONP的工作原理,以及它爲什麼不是真正的AJAX。

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是一個是跨域的,還有就是二者接收參數形式不一樣!

27.請解釋變量聲明提升。

在函數執行時,把變量的聲明提升到了函數頂部,而其值定義依然在原來位置。

28.如何從瀏覽器的URL中獲取查詢字符串參數。

以下函數把獲取一個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];
     }
 }

29.arguments是什麼?

arguments雖然有一些數組的性質,但其並非真正的數組,只是一個類數組對象。
其並沒有數組的很多方法,不能像真正的數組那樣調用.jion(),.concat(),.pop()等方法。

30.什麼是”use strict”;?使用它的好處和壞處分別是什麼?

在代碼中出現表達式-“use strict”; 意味着代碼按照嚴格模式解析,這種模式使得Javascript在更嚴格的條件下運行。

好處:
1.消除Javascript語法的一些不合理、不嚴謹之處,減少一些怪異行爲;
2.消除代碼運行的一些不安全之處,保證代碼運行的安全;
3.提高編譯器效率,增加運行速度;

壞處:
1.同樣的代碼,在”嚴格模式”中,可能會有不一樣的運行結果;一些在”正常模式”下可以運行的語句,在”嚴格模式”下將不能運行。

31.什麼是回調函數?

1.就是一個函數的調用過程。那麼就從理解這個調用過程開始吧。
函數a有一個參數,這個參數是個函數b,當函數a執行完以後執行函數b。那麼這個過程就叫回調。

2.另外種解釋:開發網站的過程中,我們經常遇到某些耗時很長的javascript操作。其中,既有異步的操作(比如ajax讀取服務器數據),也有同步的操作(比如遍歷一個大型數組),它們都不是立即能得到結果的。 
通常的做法是,爲它們指定回調函數(callback)。即事先規定,一旦它們運行結束,應該調用哪些函數。

32.使用 typeof bar === “object” 判斷 bar 是不是一個對象有神馬潛在的弊端?如何避免這種弊端?

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]

33.下面的代碼會輸出什麼?爲什麼?


    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

34.邏輯運算

或邏輯時:當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;

35.在 JavaScript,常見的 false 值:

0, ‘0’, +0, -0, false, ‘’,null,undefined,null,NaN

要注意空數組([])和空對象({}):


    console.log([] == false) //true
    console.log({} == false) //false
    console.log(Boolean([])) //true          

36.解釋下面代碼的輸出

 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]完全相同。`

37.解釋下面代碼的輸出

(function(x) {
    return (function(y) {
        console.log(x);
    })(2)
})(1);

輸出1,閉包能夠訪問外部作用域的變量或參數。

38.請寫出以下輸出結果:

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

39.談談你對Ajax的理解?(概念、特點、作用)

AJAX全稱爲“Asynchronous JavaScript And XML”(異步JavaScript和XML)是指一種創建交互式網頁應用的開發技術、改善用戶體驗,實現無刷新效果。

優點

a、不需要插件支持 
b、優秀的用戶體驗 
c、提高Web程序的性能 
d、減輕服務器和帶寬的負擔

缺點

a、破壞瀏覽器“前進”、“後退”按鈕的正常功能,可以通過簡單的插件彌補 
b、對搜索引擎的支持不足

40.說說你對延遲對象deferred的理解?

a、什麼是deferred對象

在回調函數方面,jQuery的功能非常弱。爲了改變這一點,jQuery開發團隊就設計了deferred對象。 
簡單說,deferred對象就是jQuery的回調函數解決方案。在英語中,defer的意思是”延遲”,所以deferred對象的含義就是”延遲”到未來某個點再執行。 
它解決了如何處理耗時操作的問題,對那些操作提供了更好的控制,以及統一的編程接口。

b、它的主要功能,可以歸結爲四點:

(1)、實現鏈式操作 
(2)、指定同一操作的多個回調函數 
(3)、爲多個操作指定回調函數 
(4)、普通操作的回調函數接口

41.什麼是跨域,如何實現跨域訪問?

跨域是指不同域名之間相互訪問。 
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>
弊端:請看下面渲染加載優化

1、 nginx代理跨域
2、 nodejs中間件代理跨域
3、 後端在頭部信息裏面設置安全域名

(3)、跨域資源共享(CORS) 
跨域資源共享(CORS)是一種網絡瀏覽器的技術規範,它爲Web服務器定義了一種方式,允許網頁從不同的域訪問其資源。

CORS與JSONP相比:

a、JSONP只能實現GET請求,而CORS支持所有類型的HTTP請求。 
b、使用CORS,開發者可以使用普通的XMLHttpRequest發起請求和獲得數據,比起JSONP有更好的錯誤處理。 
c、JSONP主要被老的瀏覽器支持,它們往往不支持CORS,而絕大多數現代瀏覽器都已經支持了CORS。
更多跨域的具體內容請看 https://segmentfault.com/a/11…

42.爲什麼要使用模板引擎?

a.模板引擎(這裏特指用於Web開發的模板引擎)是爲了使用戶界面與業務數據(內容)分離而產生的,它可以生成特定格式的文檔,用於網站的模板引擎就會生成一個標準的HTML文檔。 
b.在一些示例中javascript有大量的html字符串,html中有一些像onclick樣的javascript,這樣javascript中有html,html中有javascript,代碼的偶合度很高,不便於修改與維護,使用模板引擎可以解決問題。

43.根據你的理解,請簡述JavaScript腳本的執行原理?

JavaScript是一種動態、弱類型、基於原型的語言,通過瀏覽器可以直接執行。 
當瀏覽器遇到

44.JavaScript的數據類型有哪些?

基本數據類型:字符串 String、數字 Number、布爾Boolean 
複合數據類型:數組 Array、對象 Object 
特殊數據類型:Null 空對象、Undefined 未定義

45.ionic和angularjs的區別?

a、ionic是一個用來開發混合手機應用的,開源的,免費的代碼庫。可以優化html、css和js的性能,構建高效的應用程序,而且還可以用於構建Sass和AngularJS的優化。 
b、AngularJS通過新的屬性和表達式擴展了HTML。AngularJS可以構建一個單一頁面應用程序(SPAs:Single Page Applications)。 
c、Ionic是一個混合APP開發工具,它以AngularJS爲中間腳本工具(稱爲庫,似乎又不恰當),所以,你如果要使用Ionic開發APP,就必須瞭解AngularJS。

46.談談你對閉包的理解?

(1)、使用閉包主要是爲了設計私有的方法和變量。閉包的優點是可以避免全局變量的污染,
缺點是閉包會常駐內存,會增大內存使用量,使用不當很容易造成內存泄露。

(2)、閉包有三個特性: 
a、函數嵌套函數 
b、函數內部可以引用外部的參數和變量 
c、參數和變量不會被垃圾回收機制回收

47.談談你This對象的理解?

回答一:

(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對象。

48.JavaScript對象的幾種創建方式?

(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();

49.請寫出js內存泄漏的問題?

回答一:

(1)、IE7/8 DOM循環引用導致內存泄漏 
a、多個對象循環引用 
b、循環引用自己

(2)、基礎的DOM泄漏 
當原有的DOM被移除時,子結點引用沒有被移除則無法回收。

(3)、timer定時器泄漏 
這個時候你無法回收buggyObject,解決辦法,先停止timer然後再回收

回答二:

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

setTimeout 的第一個參數使用字符串而非函數的話,會引發內存泄漏。 
閉包、控制檯日誌、循環(在兩個對象彼此引用且彼此保留時,就會產生一個循環)也會引發內存泄漏問題。

50.JS應該放在什麼位置?

(1)、放在底部,雖然放在底部照樣會阻塞所有呈現,但不會阻塞資源下載。 
(2)、如果嵌入JS放在head中,請把嵌入JS放在CSS頭部。 
(3)、使用defer(只支持IE) 
(4)、不要在嵌入的JS中調用運行時間較長的函數,如果一定要用,可以用setTimeout來調用

51.請你解釋一下事件冒泡機制

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

51.說說你對Promise的理解?

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 狀態時,無法得知目前進展到哪一個階段(剛剛開始還是即將完成)。

52.說說你對原型(prototype)理解?

JavaScript是一種通過原型實現繼承的語言與別的高級語言是有區別的,像java,C#是通過類型決定繼承關係的,JavaScript是的動態的弱類型語言,總之可以認爲JavaScript中所有都是對象,在JavaScript中,原型也是一個對象,通過原型可以實現對象的屬性繼承,JavaScript的對象中都包含了一個” prototype”內部屬性,這個屬性所對應的就是該對象的原型。

“prototype”作爲對象的內部屬性,是不能被直接訪問的。所以爲了方便查看一個對象的原型,Firefox和Chrome內核的JavaScript引擎中提供了”proto“這個非標準的訪問器(ECMA新標準中引入了標準對象原型訪問器”Object.getPrototype(object)”)。

原型的主要作用就是爲了實現繼承與擴展對象。

53.在 JavaScript 中,instanceof用於判斷某個對象是否被另一個函數構造。

使用 typeof 運算符時採用引用類型存儲值會出現一個問題,無論引用的是什麼類型的對象,它都返回 “object”。ECMAScript 引入了另一個 Java 運算符 instanceof 來解決這個問題。instanceof 運算符與 typeof 運算符相似,用於識別正在處理的對象的類型。與 typeof 方法不同的是,instanceof 方法要求開發者明確地確認對象爲某特定類型。

54.純數組排序

常見有冒泡和選擇,這裏利用sort排序

 export const orderArr=(arr)=>{
        arr.sort((a,b)=>{
            return a-b //將arr升序排列,如果是倒序return -(a-b)
        })
    }

55.數組對象排序

export const orderArr=(arr)=>{
        arr.sort((a,b)=>{
            let value1 = a[property];
            let value2 = b[property];
            return value1 - value2;//sort方法接收一個函數作爲參數,這裏嵌套一層函數用
            //來接收對象屬性名,其他部分代碼與正常使用sort方法相同
        })
    }      

  1. 對象遍歷

export const traverseObj=(obj)=>{
        for(let variable in obj){
        //For…in遍歷對象包括所有繼承的屬性,所以如果
         //只是想使用對象本身的屬性需要做一個判斷
        if(obj.hasOwnProperty(variable)){
            console.log(variable,obj[variable])
        }
        }
    }

57.promise

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]
})
}

58.如何禁用網頁菜單右鍵?

<script>
function Click(){
window.event.returnValue=false;
}
document.oncontextmenu=Click;
</script>
恢復方法:javascript:alert(document.oncontextmenu='')

發佈了42 篇原創文章 · 獲贊 150 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章