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
的原型是null
。null
沒有任何屬性和方法,也沒有本身的原型。所以,原型鏈的盡頭就是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.同源
所謂同源指的是三個相同 ①:協議相同 ②:域名相同 ③:端口相同