1. 程式人生 > >前端學習---js.1

前端學習---js.1

1、介紹js的基本資料型別  

答: Undefined、Null、Boolean、Number、String

  

2、js有哪些內建物件? 

答:資料封裝類物件:Object、Array、Boolean、Number 和 String

  其他物件:Function、Arguments、Math、Date、RegExp、Error

  

3、this物件的理解 

答:this總是指向函式的直接呼叫者(而非間接呼叫者);

  如果有new關鍵字,this指向new出來的那個物件;

  在事件中,this指向觸發這個事件的物件,特殊的是,IE中的attachEvent中的this總是指向全域性物件Window。

  

4、eval是做什麼的? 

答:它的功能是把對應的字串解析成JS程式碼並執行;

  應該避免使用eval,不安全,非常耗效能(2次,一次解析成js語句,一次執行)。

  由JSON字串轉換為JSON物件的時候可以用eval,var obj =eval('('+ str +')')。

  

5、DOM怎樣新增、移除、移動、複製、建立和查詢節點

答:

// 建立新節點

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

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

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

  // 新增、移除、替換、插入

  appendChild()

  removeChild()

  replaceChild()

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

  // 查詢

  getElementsByTagName() //通過標籤名稱

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

  getElementById() //通過元素Id,唯一性

  

 

6、null和undefined的區別?

答:

  null是一個表示"無"的物件,轉為數值時為0;undefined是一個表示"無"的原始值,轉為數值時為NaN。

  undefined:

  (1)變數被聲明瞭,但沒有賦值時,就等於undefined。

  (2) 呼叫函式時,應該提供的引數沒有提供,該引數等於undefined。

  (3)物件沒有賦值的屬性,該屬性的值為undefined。

  (4)函式沒有返回值時,預設返回undefined。

  null:

  (1) 作為函式的引數,表示該函式的引數不是物件。

  (2) 作為物件原型鏈的終點。

 

7、new操作符具體幹了什麼呢?

答:

  (1)建立一個空物件,並且 this 變數引用該物件,同時還繼承了該函式的原型。

  (2)屬性和方法被加入到 this 引用的物件中。

  (3)新建立的物件由 this 所引用,並且最後隱式的返回 this 。

 

8、JSON 的瞭解?

答:

  JSON(JavaScript Object Notation) 是一種輕量級的資料交換格式。它是基於JavaScript的一個子集。資料格式簡單, 易於讀寫, 佔用頻寬小。

  格式:採用鍵值對,例如:{'age':'12', 'name':'back'}

 

9、call() 和 apply() 的區別和作用?

答:

  apply()函式有兩個引數:第一個引數是上下文,第二個引數是引數組成的陣列。如果上下文是null,則使用全域性物件代替。

  如:function.apply(this,[1,2,3]);

  call()的第一個引數是上下文,後續是例項傳入的引數序列。

  如:function.call(this,1,2,3);

  

10、如何獲取UA?

  答:

  function whatBrowser() {

  document.Browser.Name.value=navigator.appName;

  document.Browser.Version.value=navigator.appVersion;

  document.Browser.Code.value=navigator.appCodeName;

  document.Browser.Agent.value=navigator.userAgent;

  }

  其他

  

 

11、哪些常見操作會造成記憶體洩漏?

答:

  記憶體洩漏指任何物件在您不再擁有或需要它之後仍然存在。

  垃圾回收器定期掃描物件,並計算引用了每個物件的其他物件的數量。如果一個物件的引用數量為 0(沒有其他物件引用過該物件),或對該物件的惟一引用是迴圈的,那麼該物件的記憶體即可回收。

  setTimeout 的第一個引數使用字串而非函式的話,會引發記憶體洩漏。

  閉包、控制檯日誌、迴圈(在兩個物件彼此引用且彼此保留時,就會產生一個迴圈)。

 

12、執行緒與程序的區別

答:

  一個程式至少有一個程序,一個程序至少有一個執行緒。

  執行緒的劃分尺度小於程序,使得多執行緒程式的併發性高。

  另外,程序在執行過程中擁有獨立的記憶體單元,而多個執行緒共享記憶體,從而極大地提高了程式的執行效率。

  執行緒在執行過程中與程序還是有區別的。每個獨立的執行緒有一個程式執行的入口、順序執行序列和程式的出口。但是執行緒不能夠獨立執行,必須依存在應用程式中,由應用程式提供多個執行緒執行控制。

  從邏輯角度來看,多執行緒的意義在於一個應用程式中,有多個執行部分可以同時執行。但作業系統並沒有將多個執行緒看做多個獨立的應用,來實現程序的排程和管理以及資源分配。這就是程序和執行緒的重要區別。

 

 

 

13、如何解決跨域問題

JSONP:

原理是:動態插入script標籤,通過script標籤引入一個js檔案,這個js檔案載入成功後會執行我們在url引數中指定的函式,並且會把我們需要的json資料作為引數傳入。

由於同源策略的限制,XmlHttpRequest只允許請求當前源(域名、協議、埠)的資源,為了實現跨域請求,可以通過script標籤實現跨域請求,然後在服務端輸出JSON資料並執行回撥函式,從而解決了跨域的資料請求。

優點是相容性好,簡單易用,支援瀏覽器與伺服器雙向通訊。缺點是隻支援GET請求。

JSONPjson+padding(內填充),顧名思義,就是把JSON填充到一個盒子裡

<script>
    function createJs(sUrl){
 
        var oScript = document.createElement('script');
        oScript.type = 'text/javascript';
        oScript.src = sUrl;
        document.getElementsByTagName('head')[0].appendChild(oScript);
    }
 
    createJs('jsonp.js');
 
    box({
       'name': 'test'
    });
 
    function box(json){
        alert(json.name);
    }
</script>

 

 

 

14、javascript垃圾回收方法

標記清除(mark and sweep)

這是JavaScript最常見的垃圾回收方式,當變數進入執行環境的時候,比如函式中宣告一個變數,垃圾回收器將其標記為“進入環境”,當變數離開環境的時候(函式執行結束)將其標記為“離開環境”。

垃圾回收器會在執行的時候給儲存在記憶體中的所有變數加上標記,然後去掉環境中的變數以及被環境中變數所引用的變數(閉包),在這些完成之後仍存在標記的就是要刪除的變量了

引用計數(reference counting)

在低版本IE中經常會出現記憶體洩露,很多時候就是因為其採用引用計數方式進行垃圾回收。引用計數的策略是跟蹤記錄每個值被使用的次數,當聲明瞭一個 變數並將一個引用型別賦值給該變數的時候這個值的引用次數就加1,如果該變數的值變成了另外一個,則這個值得引用次數減1,當這個值的引用次數變為0的時 候,說明沒有變數在使用,這個值沒法被訪問了,因此可以將其佔用的空間回收,這樣垃圾回收器會在執行的時候清理掉引用次數為0的值佔用的空間。

在IE中雖然JavaScript物件通過標記清除的方式進行垃圾回收,但BOM與DOM物件卻是通過引用計數回收垃圾的, 
也就是說只要涉及BOM及DOM就會出現迴圈引用問題。

 

 

 

 

 

15、快速 排序的思想並實現一個快排?

“快速排序”的思想很簡單,整個排序過程只需要三步:

  (1)在資料集之中,找一個基準點

  (2)建立兩個陣列,分別儲存左邊和右邊的陣列

  (3)利用遞迴進行下次比較

    <script type="text/javascript">
 
        function quickSort(arr){
            if(arr.length<=1){
                return arr;//如果陣列只有一個數,就直接返回;
            }
 
            var num = Math.floor(arr.length/2);//找到中間數的索引值,如果是浮點數,則向下取整
 
            var numValue = arr.splice(num,1);//找到中間數的值
            var left = [];
            var right = [];
 
            for(var i=0;i<arr.length;i++){
                if(arr[i]<numValue){
                    left.push(arr[i]);//基準點的左邊的數傳到左邊陣列
                }
                else{
                   right.push(arr[i]);//基準點的右邊的數傳到右邊陣列
                }
            }
 
            return quickSort(left).concat([numValue],quickSort(right));//遞迴不斷重複比較
        }
 
        alert(quickSort([32,45,37,16,2,87]));//彈出“2,16,32,37,45,87”
 
    </script>

 

jquery將一些原型屬性和方法封裝在了jquery.prototype中,為了縮短名稱,又賦值給了jquery.fn,這是很形象的寫法。

有一些陣列或物件的方法經常能使用到,jQuery將其儲存為區域性變數以提高訪問速度。

jquery實現的鏈式呼叫可以節約程式碼,所返回的都是同一個物件,可以提高程式碼效率。

ES6的瞭解

新增模板字串(為JavaScript提供了簡單的字串插值功能)、箭頭函式(操作符左邊為輸入的引數,而右邊則是進行的操作以及返回的值Inputs=>outputs。)、for-of(用來遍歷資料—例如陣列中的值。)arguments物件可被不定引數和預設引數完美代替。ES6promise物件納入規範,提供了原生的Promise物件。增加了letconst命令,用來宣告變數。增加了塊級作用域。let命令實際上就增加了塊級作用域。ES6規定,var命令和function命令宣告的全域性變數,屬於全域性物件的屬性;let命令、const命令、class命令宣告的全域性變數,不屬於全域性物件的屬性。。還有就是引入module模組的概念

js繼承方式及其優缺點

原型鏈繼承的缺點

一是字面量重寫原型會中斷關係,使用引用型別的原型,並且子型別還無法給超型別傳遞引數。

借用建構函式(類式繼承)

借用建構函式雖然解決了剛才兩種問題,但沒有原型,則複用無從談起。所以我們需要原型鏈+借用建構函式的模式,這種模式稱為組合繼承

組合式繼承

組合式繼承是比較常用的一種繼承方法,其背後的思路是 使用原型鏈實現對原型屬性和方法的繼承,而通過借用建構函式來實現對例項屬性的繼承。這樣,既通過在原型上定義方法實現了函式複用,又保證每個例項都有它自己的屬性。

 

 

 

 

 

16、defer和async

defer並行載入js檔案,會按照頁面上script標籤的順序執行 
async並行載入js檔案,下載完成立即執行,不會按照頁面上script標籤的順序執行

 

 

 

17、用過哪些設計模式?

(1)工廠模式:

主要好處就是可以消除物件間的耦合,通過使用工程方法而不是new關鍵字。將所有例項化的程式碼集中在一個位置防止程式碼重複。
 
    (2)工廠模式解決了重複例項化的問題 ,但還有一個問題,那就是識別問題,因為根本無法 搞清楚他們到底是哪個物件的例項。
 
 
function createObject(name,age,profession){//集中例項化的函式var obj = new Object();
    obj.name = name;
    obj.age = age;
    obj.profession = profession;
    obj.move = function () {
        return this.name + ' at ' + this.age + ' engaged in ' + this.profession;
    };
    return obj;
}
var test1 = createObject('trigkit4',22,'programmer');//第一個例項var test2 = createObject('mike',25,'engineer');//第二個例項

 

(3)建構函式模式

使用建構函式的方法 ,即解決了重複例項化的問題 ,又解決了物件識別的問題,該模式與工廠模式的不同之處在於:

建構函式方法沒有顯示的建立物件 (new Object());
直接將屬性和方法賦值給 this 物件;
沒有 renturn 語句。
 

18、說說你對閉包的理解

使用閉包主要是為了設計私有的方法和變數。閉包的優點是可以避免全域性變數的汙染,缺點是閉包會常駐記憶體,會增大記憶體使用量,使用不當很容易造成記憶體洩露。在js中,函式即閉包,只有函式才會產生作用域的概念

閉包有三個特性:

(1)函式巢狀函式

(2)函式內部可以引用外部的引數和變數

(3)引數和變數不會被垃圾回收機制回收

 

 

 

 

 

19、請你談談Cookie的弊端

cookie雖然在持久儲存客戶端資料提供了方便,分擔了伺服器儲存的負擔,但還是有很多侷限性的。

第一:每個特定的域名下最多生成20個cookie

(1)IE6或更低版本最多20個cookie
 
(2)IE7和之後的版本最後可以有50個cookie。
 
(3)Firefox最多50個cookie
 
(4)chrome和Safari沒有做硬性限制

IEOpera 會清理近期最少使用的cookieFirefox會隨機清理cookie

cookie的最大大約為4096位元組,為了相容性,一般不能超過4095位元組。

IE 提供了一種儲存可以持久化使用者資料,叫做userdata,從IE5.0就開始支援。每個資料最多128K,每個域名下最多1M。這個持久化資料放在快取中,如果快取沒有清理,那麼會一直存在。

優點:極高的擴充套件性和可用性

通過良好的程式設計,控制儲存在cookie中的session物件的大小。

通過加密和安全傳輸技術(SSL),減少cookie被破解的可能性。

只在cookie中存放不敏感資料,即使被盜也不會有重大損失。
控制cookie的生命期,使之不會永遠有效。偷盜者很可能拿到一個過期的cookie。

缺點:

`Cookie`數量和長度的限制。每個domain最多隻能有20條cookie,每個cookie長度不能超過4KB,否則會被截掉.
安全性問題。如果cookie被人攔截了,那人就可以取得所有的session資訊。即使加密也與事無補,因為攔截者並不需要知道cookie的意義,他只要原樣轉發cookie就可以達到目的了。
有些狀態不可能儲存在客戶端。例如,為了防止重複提交表單,我們需要在伺服器端儲存一個計數器。如果我們把這個計數器儲存在客戶端,那麼它起不到任何作用。

 

 

 

 

20、瀏覽器本地儲存

在較高版本的瀏覽器中,js提供了sessionStorageglobalStorage。在HTML5中提供了localStorage來取代globalStorage

html5中的Web Storage包括了兩種儲存方式:sessionStoragelocalStorage

sessionStorage用於本地儲存一個會話(session)中的資料,這些資料只有在同一個會話中的頁面才能訪問並且當會話結束後資料也隨之銷燬。因此sessionStorage不是一種持久化的本地儲存,僅僅是會話級別的儲存。

localStorage用於持久化的本地儲存,除非主動刪除資料,否則資料是永遠不會過期的。

web storage和cookie的區別

Web Storage的概念和cookie相似,區別是它是為了更大容量儲存設計的。Cookie的大小是受限的,並且每次你請求一個新的頁面的時候Cookie都會被髮送過去,這樣無形中浪費了頻寬,另外cookie還需要指定作用域,不可以跨域呼叫。

除此之外,Web Storage擁有setItem,getItem,removeItem,clear等方法,不像cookie需要前端開發者自己封裝setCookie,getCookie

但是cookie也是不可以或缺的:cookie的作用是與伺服器進行互動,作為HTTP規範的一部分而存在 ,而Web Storage僅僅是為了在本地“儲存”資料而生

瀏覽器的支援除了IE及以下不支援外,其他標準瀏覽器都完全支援(ie及FF需在web伺服器裡執行),值得一提的是IE總是辦好事,例如IE7、IE6中的userData其實就是javascript本地儲存的解決方案。通過簡單的程式碼封裝可以統一到所有的瀏覽器都支援web storage

localStoragesessionStorage都具有相同的操作方法,例如setItem、getItemremoveItem

 

 

21、cookie 和session 的區別:

 (1)cookie資料存放在客戶的瀏覽器上,session資料放在伺服器上。
 
(2)cookie不是很安全,別人可以分析存放在本地的COOKIE並進行COOKIE欺騙
 
    考慮到安全應當使用session。
 
(3)session會在一定時間內儲存在伺服器上。當訪問增多,會比較佔用你伺服器的效能
 
     考慮到減輕伺服器效能方面,應當使用COOKIE。
 
 (4)單個cookie儲存的資料不能超過4K,很多瀏覽器都限制一個站點最多儲存20個cookie。
 
 (5)所以個人建議:
 
    將登陸資訊等重要資訊存放為SESSION
 
    其他資訊如果需要保留,可以放在COOKIE中

 

 

 

 

 

 

 

 

 

 

 

 

 

22、DOM操作——怎樣新增、移除、移動、複製、建立和查詢節點。

1)建立新節點

      createDocumentFragment()    //建立一個DOM片段
 
      createElement()   //建立一個具體的元素
 
      createTextNode()   //建立一個文字節點

2)新增、移除、替換、插入

      appendChild()
 
      removeChild()
 
      replaceChild()
 
      insertBefore() //並沒有insertAfter()

3)查詢

      getElementsByTagName()    //通過標籤名稱
 
      getElementsByName()    //通過元素的Name屬性的值(IE容錯能力較強,
      會得到一個數組,其中包括id等於name值的)
 
      getElementById()    //通過元素Id,唯一性

 

 

 

 

 

23、如何實現瀏覽器內多個標籤頁之間的通訊?

    呼叫localstorge、cookies等本地儲存方式

 

 

 

 

 

 

 

null和undefined的區別?

null是一個表示”無”的物件,轉為數值時為0;undefined是一個表示”無”的原始值,轉為數值時為NaN

當宣告的變數還未被初始化時,變數的預設值為undefined

null用來表示尚未存在的物件,常用來表示函式企圖返回一個不存在的物件。

undefined表示”缺少值”,就是此處應該有一個值,但是還沒有定義。典型用法是:

(1)變數被聲明瞭,但沒有賦值時,就等於undefined。
 
 
(2) 呼叫函式時,應該提供的引數沒有提供,該引數等於undefined。
 
 
(3)物件沒有賦值的屬性,該屬性的值為undefined。
 
 
(4)函式沒有返回值時,預設返回undefined。

null表示”沒有物件”,即該處不應該有值。典型用法是:

(1) 作為函式的引數,表示該函式的引數不是物件。
 
  1. 作為物件原型鏈的終點。
 

24、new操作符具體幹了什麼呢?

   (1)建立一個空物件,並且 this 變數引用該物件,同時還繼承了該函式的原型。
 
  (2)屬性和方法被加入到 this 引用的物件中。
 
   (3)新建立的物件由 this 所引用,並且最後隱式的返回 this 。
 
 
 
var obj  = {};
 
obj.__proto__ = Base.prototype;
 
Base.call(obj);

js延遲載入的方式有哪些?

defer和async、動態建立DOM方式(建立script,插入到DOM中,載入完畢後callBack)、按需非同步載入js

call() 和 apply() 的區別和作用?

作用:動態改變某個類的某個方法的執行環境(執行上下文)。

區別參見:[JavaScript學習總結(四)function函式部分][3]

哪些操作會造成記憶體洩漏?

記憶體洩漏指任何物件在您不再擁有或需要它之後仍然存在。
 
垃圾回收器定期掃描物件,並計算引用了每個物件的其他物件的數量。如果一個物件的引用數量為 0(沒有其他物件引用過該物件),或對該物件的惟一引用是迴圈的,那麼該物件的記憶體即可回收。
 
 
 
setTimeout 的第一個引數使用字串而非函式的話,會引發記憶體洩漏。
 
閉包、控制檯日誌、迴圈(在兩個物件彼此引用且彼此保留時,就會產生一個迴圈)

詳見:[詳解js變數、作用域及記憶體][4]

 

 

 

25、列舉IE 與其他瀏覽器不一樣的特性?

(1)IE支援currentStyle,FIrefox使用getComputStyle

(2)IE 使用innerText,Firefox使用textContent

(3)濾鏡方面:IE:filter:alpha(opacity= num);Firefox:-moz-opacity:num

(4)事件方面:IE:attachEvent:火狐是addEventListener

(5)滑鼠位置:IE是event.clientX;火狐是event.pageX

(6)IE使用event.srcElement;Firefox使用event.target

(7)IE中消除list的原點僅需margin:0即可達到最終效果;FIrefox需要設定margin:0;padding:0以及list-style:none

(8)CSS圓角:ie7以下不支援圓角

 

 

 

 

 

 

 

 

 

 

26、javascript物件的幾種建立方式

(1)工廠模式
(2)建構函式模式
(3)原型模式
(4)混合建構函式和原型模式
(5)動態原型模式
(6)寄生建構函式模式
(7)穩妥建構函式模式
 
 
 

27、javascript繼承的6種方法

(1)原型鏈繼承
(2)借用建構函式繼承
(3)組合繼承(原型+借用構造)
(4)原型式繼承
(5)寄生式繼承
(6)寄生組合式繼承

28、建立ajax的過程

    (1)建立`XMLHttpRequest`物件,也就是建立一個非同步呼叫物件.
 
    (2)建立一個新的`HTTP`請求,並指定該`HTTP`請求的方法、`URL`及驗證資訊.
 
    (3)設定響應`HTTP`請求狀態變化的函式.
 
    (4)傳送`HTTP`請求.
 
    (5)獲取非同步呼叫返回的資料.
 
    (6)使用JavaScript和DOM實現區域性重新整理.
 
 
    var xmlHttp = new XMLHttpRequest();
 
    xmlHttp.open('GET','demo.php','true');
 
    xmlHttp.send()
 
    xmlHttp.onreadystatechange = function(){
 
        if(xmlHttp.readyState === 4 & xmlHttp.status === 200){
 
        }
 
    }

 

 

 

 

 

 

 

 

 

 

 

 

29、非同步載入和延遲載入

(1)非同步載入的方案: 動態插入script標籤
(2)通過ajax去獲取js程式碼,然後通過eval執行
(3)script標籤上新增defer或者async屬性
(4)建立並插入iframe,讓它非同步執行js
(5)延遲載入:有些 js 程式碼並不是頁面初始化的時候就立刻需要的,而稍後的某些情況才需要的。

 

 

 

 

30、FlashAjax各自的優缺點,在使用中如何取捨?

  • Flash適合處理多媒體、向量圖形、訪問機器;對CSS、處理文字上不足,不容易被搜尋。

-AjaxCSS、文字支援很好,支援搜尋;多媒體、向量圖形、機器訪問不足。

  • 共同點:與伺服器的無重新整理傳遞訊息、使用者離線和線上狀態、操作DOM

請解釋一下 JavaScript 的同源策略。

概念:同源策略是客戶端指令碼(尤其是Javascript)的重要的安全度量標準。它最早出自Netscape Navigator2.0,其目的是防止某個文件或指令碼從多個不同源裝載。

這裡的同源策略指的是:協議,域名,埠相同,同源策略是一種安全協議。

指一段指令碼只能讀取來自同一來源的視窗和文件的屬性。

為什麼要有同源限制?

我們舉例說明:比如一個黑客程式,他利用Iframe把真正的銀行登入頁面嵌到他的頁面上,當你使用真實的使用者名稱,密碼登入時,他的頁面就可以通過Javascript讀取到你的表單中input中的內容,這樣使用者名稱,密碼就輕鬆到手了。

缺點:

現在網站的JS 都會進行壓縮,一些檔案用了嚴格模式,而另一些沒有。這時這些本來是嚴格模式的檔案,被 merge 後,這個串就到了檔案的中間,不僅沒有指示嚴格模式,反而在壓縮後浪費了位元組。

 

31、事件、IE與火狐的事件機制有什麼區別? 如何阻止冒泡?

(1)我們在網頁中的某個操作(有的操作對應多個事件)。例如:當我們點選一個按鈕就會產生一個事件。是可以被 JavaScript 偵測到的行為。
(2)事件處理機制:IE是事件冒泡、firefox同時支援兩種事件模型,也就是:捕獲型事件和冒泡型事件。;
(3) `ev.stopPropagation()`;注意舊ie的方法 `ev.cancelBubble = true`;

ajax的缺點和在I  E下的問題?

詳情請見:[JavaScript學習總結(七)Ajax和Http狀態字][14]

 

 

32、ajax的缺點

  (1)ajax不支援瀏覽器back按鈕。
  (2)安全問題 AJAX暴露了與伺服器互動的細節。
  (3)對搜尋引擎的支援比較弱。
  (4)破壞了程式的異常機制。
(5)不容易除錯。

 

 

 

 

 

33、IE快取問題

在IE瀏覽器下,如果請求的方法是GET,並且請求的URL不變,那麼這個請求的結果就會被快取。解決這個問題的辦法可以通過實時改變請求的URL,只要URL改變,就不會被快取,可以通過在URL末尾新增上隨機的時間戳引數('t'= + new Date().getTime())

或者:

open('GET','demo.php?rand=+Math.random()',true);//

 

Ajax請求的頁面歷史記錄狀態問題

可以通過錨點來記錄狀態,location.hash。讓瀏覽器記錄Ajax請求時頁面狀態的變化。

還可以通過HTML5history.pushState,來實現瀏覽器位址列的無重新整理改變

 

 

 

 

34、說說你對Promise的理解

依照 Promise/A+ 的定義,Promise 有四種狀態:

pending: 初始狀態, 非 fulfilled 或 rejected.
fulfilled: 成功的操作.
rejected: 失敗的操作.
settled: Promise已被fulfilled或rejected,且不是pending

另外, fulfilled 與 rejected 一起合稱 settled

Promise 物件用來進行延遲(deferred) 和非同步(asynchronous ) 計算。

Promise 的建構函式

構造一個 Promise,最基本的用法如下:

    var promise = new Promise(function(resolve, reject) {
 
        if (...) {  // succeed
 
            resolve(result);
 
        } else {   // fails
 
            reject(Error(errMessage));
 
        }
    });

 

 

 

Promise 例項擁有 then 方法(具有 then 方法的物件,通常被稱為 thenable)。它的使用方法如下:

promise.then(onFulfilled, onRejected)

接收兩個函式作為引數,一個在 fulfilled 的時候被呼叫,一個在 rejected 的時候被呼叫,接收引數就是 future,onFulfilled對應 resolveonRejected 對應 reject

 

 

 

 

35、實現一個函式clone,可以對JavaScript中的5種主要的資料型別(包括Number、String、Object、Array、Boolean)進行值複製

    Object.prototype.clone = function(){
 
            var o = this.constructor === Array ? [] : {};
 
            for(var e in this){
 
                    o[e] = typeof this[e] === "object" ? this[e].clone() : this[e];
 
            }
 
            return o;
    }

 

 

 

 

 

 

 

 

 

36、說說嚴格模式的限制

嚴格模式主要有以下限制:

變數必須聲明後再使用
函式的引數不能有同名屬性,否則報錯
不能使用with語句
不能對只讀屬性賦值,否則報錯
不能使用字首0表示八進位制數,否則報錯
不能刪除不可刪除的屬性,否則報錯
不能刪除變數delete prop,會報錯,只能刪除屬性delete global[prop]
eval不會在它的外層作用域引入變數
eval和arguments不能被重新賦值
arguments不會自動反映函式引數的變化
不能使用arguments.callee
不能使用arguments.caller
禁止this指向全域性物件
不能使用fn.caller和fn.arguments獲取函式呼叫的堆疊
增加了保留字(比如protected、static和interface)
 

設立”嚴格模式”的目的,主要有以下幾個:

消除Javascript語法的一些不合理、不嚴謹之處,減少一些怪異行為;

消除程式碼執行的一些不安全之處,保證程式碼執行的安全;

提高編譯器效率,增加執行速度;

為未來新版本的Javascript做好鋪墊。

注:經過測試IE6,7,8,9均不支援嚴格模式。

 

 

 

 

 

 

 

 

 

 

 

 

37、如何刪除一個cookie

(1)將時間設為當前時間往前一點。

var date = new Date();
 
date.setDate(date.getDate() - 1);//真正的刪除

 

setDate()方法用於設定一個月的某一天。

(2)expires的設定

    document.cookie = 'user='+ encodeURIComponent('name')  + ';expires = ' + new Date(0)

 

<strong><em><b><i>標籤

<strong> 標籤和 <em> 標籤一樣,用於強調文字,但它強調的程度更強一些。
 
em 是 斜體強調標籤,更強烈強調,表示內容的強調點。相當於html元素中的 <i>...</i>;
< b > < i >是視覺要素,分別表示無意義的加粗,無意義的斜體。
 
em 和 strong 是表達要素(phrase elements)。

 

 

 

 

 

 

 

 

 

 

 

 

 

38、編寫一個方法 求一個字串的位元組長度

假設:一個英文字元佔用一個位元組,一箇中文字元佔用兩個位元組

 function GetBytes(str){
 
        var len = str.length;
 
        var bytes = len;
 
        for(var i=0; i<len; i++){
 
            if (str.charCodeAt(i) > 255) bytes++;
 
        }
 
        return bytes;
 
    }
 
alert(GetBytes("你好,as"));