溫習JavaScript

1.布爾值:undefined,null,false,0,NaN,""或''(空字符串) 都會視爲false ;空數組[],空對象{},都會視爲true數組

2.js操做對象用點和中括號的區別 例如,var obj = {name:'alhh'}   obj.name 用點的時候後面須要跟一個指定的屬性名稱,用中括號的時候,裏面是字符串或者是變量 var obj = name ;obj[name] 瀏覽器

3.屬性的讀取一個是用點,一個是放在方括號中,放在方括號中須要必須使用引號,不然會被認爲是變量 obj['a'],方括號內還可使用表達式,數字不須要加引號由於會自動轉化爲字符串安全

4.函數體內部聲明的函數,做用域綁定在函數體內部閉包

5.閉包能夠簡單理解爲:定義在一個函數內部的函數,本質上,閉包就是將函數內部和函數外部鏈接起來的一座橋樑app

閉包還能夠形象的理解爲中國的父子關係 父函數包裹着子函數,父裏面定義的局部變量子均可以訪問(父母老是毫無保留的對待孩子),父不能訪問子裏面定義的變量,除非子return出去(父母不會直接去索取孩子的東西,除非孩子本身給)異步

注意:外層函數每次運行,都會生產新的閉包,而這個閉包又會保存外層函數的內部變量,因此內存消耗很大,所以不能濫用閉包,不然會形成網頁的性能問題函數

6.當即調用的函數表達式,能夠避免污染全局變量 性能

(function(){ /* code */ }());
// 或者
(function(){ /* code */ })(); //分號是必須的

7.eval 接受一個字符串做爲參數,並將這個字符串當作語句執行,若是不是字符串,就原樣返回,若是字符串沒法按照語句執行就會報錯,eval沒有本身的做用域,都在當前做用域執行,所以會修改當前做用域的變量,形成安全問題,爲了防止這種風險,JavaScript規定,若是有嚴格模式‘use strict’ eval內部聲明的變量,不會影響外部,可是仍會修改外部變量不推薦使用,通常用在解析JSON字符串,可是能夠用JSON.parse代替。除了eval()是直接調用,其餘都是別名調用,window.eval(' ...')or eval.call(null,',,') eval的別名調用,做用域都是全局做用域ui

8.foreach不返回值,只用來操做數據,若是數組遍歷的目的是用來獲得返回值,那麼使用map方法.this

9.Javascript提供apply,call,bind這三個方法,來切換/固定this的指向.①.call參數是一個對象,若是參數爲空,null,undefined則默認傳入全局對象.也能夠傳入多個參數,第一個參數是this所要指向的對象,後面的參數是函數調用時所需的參數,例如

function add(a, b) {
  return a + b;
}

add.call(this, 1, 2) // 3

 

②.apply方法與call相似,惟一區別是func.apply(thisValue,[arg1,arg2,...]),apply接收一個數組做爲函數執行時的參數,這樣就會有一些應用 ,

1.找出數組最大的元素

var a =[23,45,6,77] 
Math.max.apply(null,a)
//77

2.將數組的空元素變爲undefined

 Array.apply(null,[a,,b]) //['a',undefined,'b']
//空元素和undefined的區別在於,使用forEach遍歷數組的時候會跳過空元素,可是不會跳過undefined,undefined會被打印出來

 

3.轉換相似數組對象,另外,利用數組對象的slice方法,能夠將一個相似數組的對象(好比arguments對象)轉爲真正的數組。

Array.prototype.slice.apply({0: 1, length: 1}) // [1]
Array.prototype.slice.apply({0: 1}) // []
Array.prototype.slice.apply({0: 1, length: 2}) // [1, undefined]
Array.prototype.slice.apply({length: 1}) // [undefined]

③.bind用於將函數體內的this綁定到某一個對象上,而後返回一個新的函數

注意事項:1.每一次返回一個新的函數,這樣會產生一些問題,好比監聽事件的時候不能這樣

element.addEventListener('click', o.m.bind(o));
element.removeEventListener('click', o.m.bind(o));
//這樣綁在一個匿名函數上面,沒法取消綁定

正確的應該這樣

var listener = o.m.bind(o);
element.addEventListener('click', listener);
//  ...
element.removeEventListener('click', listener);

 10.原型鏈:Object.prototype對象有沒有它的原型呢?回答是Object.prototype的原型是nullnull沒有任何屬性和方法,也沒有本身的原型。所以,原型鏈的盡頭就是null

 11.異步-定時器 例如,用戶輸入後當即將字母轉換成大寫的(會有不少相似的應用)

<input type="text" id="input-box">

//這樣子是達不到目的的,它只能將本次輸入前的字符轉爲大寫的,由於瀏覽器還沒收到新的文本,document.getElementById('input-box').onkeypress = function (event) { this.value = this.value.toUpperCase(); }

可是使用setTimeout改寫,就能夠了

document.getElementById('input-box').onkeypress = function() {
  var self = this;
  setTimeout(function() {
    self.value = self.value.toUpperCase();
  }, 0);
}
//放在setTimeout之中,就能使得它在瀏覽器接收到文本後再觸發

12.異步-Promise

const p1 = new Promise((resolve, reject) => {
  resolve('hello');
})
.then(result => result)
.catch(e => e);

const p2 = new Promise((resolve, reject) => {
  throw new Error('報錯了');
})
.then(result => result)
.catch(e => e);

Promise.all([p1, p2])
.then(result => console.log(result))
.catch(e => console.log(e));
// ["hello", Error: 報錯了]

注意,若是做爲參數的 Promise 實例,本身定義了catch方法,那麼它一旦被rejected,並不會觸發Promise.all()catch方法。

Promise.race方法一樣是將多個 Promise 實例,包裝成一個新的 Promise 實例。

13.同源 

所謂同源指的是三個相同 ①:協議相同 ②:域名相同 ③:端口相同

相關文章
相關標籤/搜索