標籤(空格分隔): JavaScript HTML 基礎javascript
Representational State Transfer(表現層狀態轉移)。
URL定位資源,用HTTP動詞(GET POST PUT DELETE)描述操做。
資源、統一接口、URI、無狀態。
應該將API的版本號放入URL;URL中只能有名詞而不能有動詞;API應該提供參數。css
是Node.js模塊系統具體實現的基石html
package.json
包描述文件,存在於包根目錄下bin
存放可執行二進制文件的目錄lib
存放js代碼的目錄doc
存放文檔的目錄test
存放單元測試用例代碼的目錄瀏覽器端的模塊,不能採用「同步加載(synchronous)」,只能採用「異步加載(asynchronous)」。這就是AMD規範誕生的背景。
典型表明require.js前端
模塊定義vue
define(id?: String, dependencies?: String, factory: Function|Object);
id
是模塊的名字。dependencies
是依賴模塊列表,默認值是["require", "exports", "module"]
。factory
是模塊的具體實現。模塊加載html5
require([module], callback);
一個模塊就是一個文件,依賴就近;懶加載(延遲執行);沒有全局require。
典型SeaJSjava
模塊定義node
define(factory);
factory
是函數時,表示是模塊的構造方法。react
define(function(require, exports, module) { // 模塊代碼 });
SeaJS和RequireJS的差別jquery
ES6模塊的設計思想是儘可能的靜態化,使得編譯時就能肯定模塊的依賴關係,以及輸入和輸出的變量。
這一點不一樣於CommonJS和AMD模塊。所以也不能實現動態加載(提案import([path])
用於解決這個問題)。
一個文件就是一個模塊。該文件內部的全部變量,外部沒法獲取,使用export
關鍵字輸出指定變量。
export
命令
as
關鍵字重命名導出變量。對外的接口,必須與模塊內部的變量創建一一對應的關係。好比:
export 1; // 報錯 var m = 1; export m; // 報錯 // 由於1只是一個值不是接口 // 正確應該是這樣 export var m = 1; export { m };
import
命令
as
關鍵字重命名變量名。import
命令輸入的變量是隻讀的,不能改寫接口(好比從新賦值);可是若是變量是個對象,修改屬性是容許的(不建議這麼作)。from
關鍵字指定模塊文件的位置(相對/絕對路徑);.js
後綴能夠省略。import
命令具備提高效果,率先執行。import
命令是靜態執行,不能使用表達式、變量或者在結構語句中。import
只執行一次。使用*
實現全部導出值都加載在as
的對象上,好比:
import * as obj from './module'; obj.a();
雖然obj
是個對象,可是不容許修改它的屬性,好比:obj.a = 'Hello'; // 報錯
。
import
默認輸出(export default
)時候不須要大括號,而其它的則須要。想要在一條import
語句中同時導入默認接口export default
和其它接口,能夠用_
實現:
import _, { momduleA, moduleB as moduleC } from './module';
export default
命令
其它模塊加載該模塊時,import
命令能夠爲該匿名導出接口指定任意名字(即使export
時候是具名接口,在外部模塊視爲無效)。
export default function foo() { }; import bar from './foo';
export default
。export default
就是輸出一個叫作default
的變量或方法,而後容許你爲它取任意名字。export default
後面不能跟變量聲明語句。能夠直接把一個值或變量export default
,好比:
export default 123; var a = 1; export default a;
export
與import
複合寫法
export { foo as bar } from './module'; // 接口更名轉發 export { default } from './module'; // 轉發默認接口 export { foo as default } from './module'; // 轉發具名接口爲默認接口 export { default as foo } from './module'; // 轉發默認接口爲具名接口
模塊的繼承
假設有一個moduleA
模塊,繼承了moduleB
模塊。
// @file moduleA.js export * from 'moduleB'; export var e = 123; export default function() { };
export *
表示輸出moduleB
的全部屬性和方法,且忽略default
方法。
跨模塊常量
創建一個constants
文件夾,各個文件保存不一樣類型的常量,加一個index.js
來合併(轉發)這些常量,使用的時候直接加載index.js
就能夠了。
import()
提案
Promise
對象。import()
與Node的require方法差別在於:異步加載。加載完成後模塊會做爲一個對象成爲then
方法的參數。
可使用對象解構賦值語法:
import('module.js').then((export1, export2) => { // TODO });
同時加載多個模塊
promise.all([ import('moduleA.js'), import('moduleB.js') ]).then(([moduleA, moduleB]) => { // TODO });
zone.js
代理原生異步事件,事件發生觸發tick()
去執行變化檢測。Object.defineProperty()
來劫持數據的getter/setter
實現數據綁定。observer
,對全部屬性進行監聽,有變化通知訂閱者。compile
,根據指令模板替換數據。watcher
鏈接以上二者的聯繫。CORS Cross-Origin Resource Sharing(跨域資源共享)。
它容許向跨源服務器發出XHR請求。
實現關鍵是服務器實現了CORS接口,就能夠跨源通訊。
同時知足兩個條件:
HTTP頭信息不超出如下幾種字段
瀏覽器請求時,在head信息中增長Origin
字段。
服務器根據Origin
指定的源,判斷是否在許可範圍內:
Response Headers
中就不會有Access-Control-Allow-Origin
字段,觸發XHR的onerror
回調。Access-Control-Allow-Origin: https://www.google.com // 必有字段, *(接受任意域名)或者是Request Headers裏的Origin字段值 Access-Control-Allow-Credentials: true // 可選字段,表示容許發送cookie;若是不發送刪除該字段 Access-Control-Expose-Headers: FooBar // 可選字段,XHR的getResponseHeader方法只能拿到Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma字段,想要其餘字段在這裏指定 Content-Type: text/html;charset=utf-8
容許CORS發送cookie
和http
認證信息,服務器須要設置Access-Control-Allow-Credentials
爲true
;瀏覽器端XHR請求須要設置:
var xhr = new XMLHttpRequest(); xhr.withCredentials = true;
若是要發送cookie
,Access-Control-Allow-Origin
不能設置爲*
,必須指定明確,與請求網頁一致的域名。同時,cookie
依舊同源策略,只有服務器域名設置的cookie
纔會上傳,瀏覽器端document.cookie
沒法讀取服務器域名下的cookie
。
非簡單請求,會在正式通訊以前增長一次HTTP查詢請求,叫「預檢請求(preflight)」。
用以詢問服務器當前瀏覽器端網頁所在域名是否在服務器的許可名單之中,以及可使用哪些HTTP動詞和頭信息字段,只有獲得確定答覆纔會發起正式請求,不然報錯。
Preflight請求方法是OPTIONS,表示詢問請求。
關鍵字段Origin
。
Access-Control-Request-Method // 必有字段 表示CORS請求的HTTP方法 Access-Control-Request-Headers // 逗號分隔字符串,指定CORS請求額外發送頭信息的字段
Preflight請求的Response。
Access-Control-Allow-Origin // 表示容許請求的源 Access-Control-Allow-Methods // 必有字段,逗號分隔字符串,表示服務器支持的跨域請求的全部方法 Access-Control-Allow-Headers // 若是request時包含Access-Control-Request-Headers字段,則此response字段必有。逗號分隔字符串,表示服務器支持的全部頭信息字段 Access-Control-Allow-Credentials // 是否容許cookie Access-Control-Max-Age // 可選,單位是秒,表示該條迴應緩存時間
瀏覽器正常請求和迴應
與簡單請求一致。
JSONP只支持GET請求,其優點在於支持老版本瀏覽器。
Same-Origin Policy(同源策略)
1995年網景公司引入瀏覽器。目的是保證用戶信息安全,防止惡意網站竊取數據。
cookie
localStorage
和indexDB
document.domain
共享cookie。片斷標識符
Fragment Indentifier指的是URL中#
後面的部分
父窗口能夠把信息寫入子窗口的片斷標識符
var src = './page-1.html' + '#test'; setTimeout(() => { document.getElementById('iframe').src = src; }, 1000);
子窗口經過監聽hashchange
事件獲得通知:
window.onhashchange = function() { console.log('Page-1 print fragment identifier: ', window.location.hash); }
一樣的,子窗口也能夠改變父窗口的片斷標識符:
parent.location.href = target + '#' + hash;
demo如圖所示:
window.postMessage
HTML5新API:跨文檔通訊(Cross-Document Messaging)。
它容許跨窗口通訊,不管是否同源。
閉包是函數和聲明該函數的詞法環境的組合。
閉包(closure)就是可以讀取其它函數內部變量的函數(定義在一個函數內部的函數)。
本質上,閉包就是將函數內部和函數外部鏈接起來的一座橋樑。
面向對象程序設置(OOP)的目的是在編程中促進更好的靈活性和可維護性、
Object
對象的實例且繼承它全部的屬性和方法。this
關鍵字調用類中的屬性。prototype
屬性。Inheritance(繼承)
一個類能夠繼承另外一個類的特徵。
// 子類 // 調用父類構造器,確保(使用Function#call)「this」在調用過程當中設置正確 Parent.call(this, args); // 同時須要顯示的繼承父類的prototype Child.prototype = Object.create(Parent.prototype); // 設置constructor屬性指向子類 Child.prototype.contructor = Child; // Object.create()僅支持現代瀏覽器(IE9+),有shim方案 functuon createObject(proto) { function ctor() {} ctor.prototype = proto; return new ctor(); }
通用方法:
function extend(Child, Parent) { var F = function() {}; F.prototype = Parent.prototype; Child.prototype = new F(); Child.prototype.constructor = Child; Child.uber = Parent.prototype; // uber 是在模擬 class 時用來表示 super 的(由於super是關鍵字因此不能直接用) }
Polymorphism(多態)
多意思是「許多」,態是「形態」。不一樣類能夠定義相同的方法或屬性。
js只有一種結構:對象。每一個實例對象(object)都有一個私有屬性(稱之爲[[prototype]])指向它的原型對象(prototype)。該原型對象也有一個本身的原型對象,層層向上直到一個對象的原型對象爲null
。根據定義,null
沒有原型,並做爲這個原型鏈中的最後一環節。
幾乎全部的js中的對象都是位於原型鏈頂端的Object
的實例。
prototype
屬性屬於構造函數,這個屬性包含一個對象(prototype對象),全部實例對象須要共享的屬性和方法,都放在這對象裏;那些不須要共享的屬性和方法,放在狗仔函數裏。
data:url scheme
內聯圖片onload
觸發,你當即獲取另外的組件。好比谷歌會在主頁這樣加載搜索結果頁面用到的雪碧圖。www.example.com
,拆分靜態資源到static1.example.com
和static2.example.com
。減小iframe
數量
iframe
優勢:
* 解決緩慢的第三方內容的加載
* 安全沙盒
* 並行下載腳本
iframe
缺點:onload
Expires
或是Cache-Control
Expires
頭部來實現「永不過時」策略,好比圖片。當組件更新後,必須更改文件名。Cache-Control
來幫助瀏覽器進行有條件請求Gzip壓縮組件
針對文本類型的文件(html,腳本,樣式,xml和json等)。圖片或pdf等不該該被gzip。
能夠減少http響應的大小從而減小響應時間。
Content-Encoding: gzip
配置Etag
實體標記(Entity Tag, ETag)是服務器和瀏覽器之間判斷瀏覽器緩存中某個組件是否匹配服務器端原組件的一種機制。實體就是組件:圖片、腳本、樣式等。ETag被當作驗證明體的,且比last-modified
(最後更改)更高效地機制。服務器這樣設置組件的ETag
:
HTTP/1.1 200 OK Last-Modified: Tue, 12 Dec 2006 03:03:59 GMT ETag: "10c24bc-4ab-457e1c1f" Content-Length: 12195
瀏覽器經過If-None-Match
驗證組件,若是ETag匹配,服務器返回304:
GET /i/yahoo.gif HTTP/1.1 Host: us.yimg.com If-Modified-Since: Tue, 12 Dec 2006 03:03:59 GMT If-None-Match: "10c24bc-4ab-457e1c1f" HTTP/1.1 304 Not Modified
src
的img
Expires
日期。<head>
。避免使用CSS表達式(CSS Expressions)
// 背景顏色能夠設置成每小時輪換 background-color: expression( (new Date()).getHours()%2 ? "#B8D4FF" : "#F08A00" );
@import
@import
等效於樣式文件放到頁面底部。AlphaImageLoader
。用PNG8來優雅降級。defer
和async
。onload
事件來開始處理DOM樹,DOMContentLoaded
更快。onload
包含圖片都被下載完畢才執行。pngcrush
或其它工具壓縮png。jpegtran
或其它工具壓縮jpeg。favicon.ico
小且可緩存
Expires
頭部,也許能夠安全設置爲幾個月。<picture>
標籤的問題。條件註釋
操做符 | 範例 | 含義 |
---|---|---|
lt |
[if lt IE 10] |
小於 |
gt |
[if gt IE 9] |
大於 |
lte |
[if lte IE 6] |
小於等於 |
gte |
[if gte IE 5.5 ] |
大於等於 |
! |
[if !IE] |
不等於 |
() |
[if !(IE 7)] |
子表達式 |
& |
[if (gt IE 5)&(lt IE 7)] |
AND |
豎線(md表格語法問題) | [if (IE 6)豎線(IE 7)] |
OR |
好比:
<!--[if !IE]> 除IE外均可識別 <![endif]--> <!--[if IE]> 全部的IE可識別 <![endif]--> <!--[if IE 6]> 僅IE6可識別 <![endif]--> <!--[if lt IE 6]> IE6以及IE6如下版本可識別 <![endif]--> <!--[if gte IE 6]> IE6以及IE6以上版本可識別 <![endif]-->
瀏覽器CSS兼容前綴
-o-transform:rotate(7deg); // Opera -ms-transform:rotate(7deg); // IE -moz-transform:rotate(7deg); // Firefox -webkit-transform:rotate(7deg); // Chrome transform:rotate(7deg); // 統一標識語句
a標籤CSS狀態順序
1 :link
日常狀態
2 :visited
被訪問過以後
3 :hover
鼠標懸浮
4 :active
連接被點擊
求窗口大小
// 瀏覽器窗口可視區域大小(不包括工具欄和滾動條等邊線) var client_w = document.documentElement.clientWidth || document.body.clientWidth; var client_h = document.documentElement.clientHeight || document.body.clientHeight; // 網頁內容實際寬高(包括工具欄和滾動條等邊線) var scroll_w = document.documentElement.scrollWidth || document.body.scrollWidth; var scroll_h = document.documentElement.scrollHeight || document.body.scrollHeight; // 網頁內容實際寬高 (不包括工具欄和滾動條等邊線) var offset_w = document.documentElement.offsetWidth || document.body.offsetWidth; var offset_h = document.documentElement.offsetHeight || document.body.offsetHeight; // 滾動的高度 var scroll_Top = document.documentElement.scrollTop || document.body.scrollTop;
瀏覽器的內核分爲兩個部分,一個是渲染引擎(Rendering Engine),一個是js引擎。如今就是引擎比較獨立,內核更加傾向於說渲染引擎。
Transmission Control Protocol/Internet Protocol(傳輸控制協議/因特網互聯協議)又名網絡通信協議,是Internet最基本的協議,Internet國際互聯網的基礎,由網絡層的IP協議和傳輸層的TCP協議組成。
HyperText Transfer Protocol(超文本傳輸協議),是一種用於分佈式、協做式和超媒體信息系統的應用層協議。HTTP是萬維網的數據通訊基礎。萬維網協議(World Wide Web Consortium, W3C)。
經過HTTP或HTTPS協議請求的資源由統一資源標識符(Uniform Resource Identifiers, URI)來標識。
有國際標準化組織提出的使各類計算機在世界範圍內互連爲網絡的標準框架。
Open System Interconnection Reference Model(開放式系統互聯通訊參考模型)
分層架構(3-tier architecture):界面層、業務邏輯層、數據訪問層。
爲了高內聚低耦合的軟件設計思想。
是爲了動態改變this而生(從新定義函數的執行環境)。
Map對象保存鍵值對。任何值(對象或原始值)均可以覺得一個鍵或一個值。
new Map([iterable]);
iterable能夠是一個數組或者其餘iterable對象,其元素或爲鍵值對,或爲兩個元素的數組。每一個鍵值對都會添加到新的Map。null會被當作undefined。
this
指的是函數運行時所在的環境。
因爲函數能夠在不一樣的運行運行環境中執行,因此須要一種機制,可以在函數體內部得到當前運行環境(context)。這就是this
的由來,它設計的目的就是在函數體內部,指代函數當前的運行環境。
null
表示沒有對象(此處不該該有值)
undefined
表示缺乏值(此處應該有一個值,可是尚未定義)
WebSockets 是一種先進的技術。它能夠在用戶的瀏覽器和服務器之間打開交互式通訊會話。使用此API,您能夠向服務器發送消息並接收事件驅動的響應,而無需經過輪詢服務器的方式以得到響應。
是一個容器,用來爲其內部特定的<img>
元素提供多樣的<source>
元素。瀏覽器會根據當前頁面的佈局以及當前瀏覽的設備區從中選擇最合適的資源。
<picture> <source srcset="./img/1.jpg" media="(max-width: 992px)"> <source srcset="./img/2.jpg" media="(max-width: 1200px)"> <img src="./img/3.jpg" alt="3"> </picture>
函數和變量聲明會置頂,函數聲明在變量聲明之上。因此即使書寫的代碼變量聲明在函數聲明之上,變量聲明也不會被覆蓋。
如下是個典型的題目:
function Foo() { // 沒有用var,變量提高 bar = function() { console.log(1); }; return this; } Foo.bar = function() { console.log(2); }; Foo.prototype.bar = function() { console.log(3); }; var bar = function() { console.log(4); }; bar = function() { console.log(6); }; function bar() { console.log(5); } Foo.bar(); // 2 bar(); //** 6 Foo().bar(); // 1 bar(); //** 1 new Foo.bar(); // 2 new Foo().bar(); // 3 new new Foo().bar(); // 3
使用XMLHttpRequest(XHR)對象能夠與服務器交互。
對於full-duplex(全雙工)通訊,WebSockets能夠是更好的選擇。
XMLHttpRequest.onreadystatechange
當readyState
屬性發生變化時調用的事件。
var xhr = new XMLHttpRequest(), method = 'GET', url = 'https://developer.mozilla.org/'; xhr.open(method, url, true); xhr.onreadystatechange = function() { if (xhr.readyState === XMLHttpRequest.DONE && xhr.status === 200) { console.log(xhr.responseText); } };
XMLHttpRequest.readystate
只讀
返回一個無符號短整型(unsigned short),表示請求的狀態碼。
值 | 狀態 | 描述 |
---|---|---|
0 | UNSENT | 代理被建立,但還沒有調用open() 方法 |
1 | OPENED | open() 方法已經調用 |
2 | HEADERS_RECEIVED | send() 方法已經被調用,而且頭部和狀態已經可獲取 |
3 | LOADING | 下載中,responseText 屬性已經包含部分數據 |
4 | DONE | 下載操做已完成 |
XMLHttpRequest.response
只讀ArrayBuffer
, Blob
, Document
, DOMString
,取決於XMLHttpRequest.responseType
的值。XMLHttpRequest.responseText
只讀DOMString
,包含對請求的響應;若是請求失敗或未發送,返回null。XMLHttpRequest.responseType
定義響應類型的枚舉值。
值 | 描述 |
---|---|
"" |
默認類型,與"text" 相同;DOMString |
"arraybuffer" |
包含二進制數據的JavaScriptArrayBuffer |
"blob" |
包含二進制數據的Blob 對象 |
"document" |
是一個HTMLDocument 或XMLXMLDocument ,取決於接收到的數據的MIME類型 |
"json" |
是一個JavaScript對象,由JOSN解析 |
"text" |
包含在DOMString對象中的文本 |
XMLHttpRequest.reponseURL
只讀XMLHttpRequest.status
只讀
返回無符號短整型(unsigned short)的請求響應狀態。
請求完成前和XMLHttpRequest出錯,status爲0。
XMLHttpRequest.statusText
只讀DOMString
,其中包含HTTP服務器返回的響應狀態。包括整個文本,好比:"200 OK"
。XMLHttpRequest.timeout
XMLHttpRequest.ontimeout
XMLHttpRequest.upload
只讀XMLHttpRequest.withCredentials
Boolean
,用來指定跨域的請求是否應該使用證書(cookie或受權header頭)。XMLHttpRequest.channel
只讀XMLHttpRequest.mozAnon
只讀Boolean
,若是爲真,請求將在沒有cookie和身份驗證header頭的狀況下發送。XMLHttpRequest.mozSystem
只讀Boolean
,若是爲真,則在請求時不會強制執行同源策略。XMLHttpRequest.mozBackgoundRequest
Boolean
,它指示對象是不是後臺服務器端的請求。
XMLHttpRequest.abort()
XMLHttpRequest.getAllResponseHeaders()
XMLHttpRequest.getResponseHeader()
XMLHttpRequest.open()
初始化一個請求。該方法只能在JavaScript代碼中使用,若要在native code中初始化請求,請使用openRequest()
。
xhr.open(method, url, async);
method
HTTP方法url
發送請求的URLasync
默認爲true
,執行異步操做XMLHttpRequest.overrideMimeType()
XMLHttpRequest.send()
發送請求。若是請求是異步的,那麼該方法將在請求發送後當即返回。
void send(); void send(ArrayBuffer data); void send(ArrayBufferView data); void send(Blob data); void send(Document data); void send(DOMString? data); void send(FormData data);
XMLHttpRequest.setRequestHeader()
設置HTTP請求頭的值。您必須在open()
以後,send()
以前調用setRequestHeader()
方法。
ajax優勢
* 改善用戶體驗,頁面無刷新更新數據
* 異步處理服務器通訊,減小頁面等待時間
* 減輕服務器負擔,按需請求數據,減小冗餘請求
* 基於標準被普遍支持
ajax缺點
* 沒法前進後退(能夠經過操做history api來解決),破壞瀏覽器機制
* SEO問題
* 安全問題
src
和href
屬性src用於替代這個元素,而href用於創建這個標籤與外部資源之間的關係。
href (Hypertext Reference) 超文本引用href這個屬性指定web資源的位置,從而定義當前元素(如錨點a)或當前文檔(如連接)與目標錨點或目標資源之間的聯繫。
src (Source)源這個屬性是將資源嵌入到當前文檔中元素所在的位置。
for(var i = 0; i < 5; i++) { setTimeout(function() { console.log(i); // 5 5 5 5 5 }, 200); };
塊級做用域能夠解決這個問題:
for(let i = 0; i < 5; i++) { setTimeout(function() { console.log(i); // 0 1 2 3 4 }, 200); };
JavaScript代碼是先聲明後執行,解析的時候js引擎總會從最近的一個域,向外層查找。
如下是個經典題目:
var a = 1; function b() { console.log(a); // undefined var a = 2; console.log(a); // 2 } b();
咱們來剖析一下:1: 首先聲明變量a;2:聲明函數b;3:賦值a爲1;4:調用函數b;5:進入函數b;6:聲明變量a;7:執行第一個console;8:爲a賦值爲2;9:執行第二個console。
執行第一個console的時候,a已經被聲明可是沒有賦值,咱們知道js中聲明一個未賦值的變量其值是undefined;並且因爲a已經在b函數做用域聲明,引擎也不會去函數做用域外查找。
再好比這個題目:
var foo = 1; (function() { var foo = foo || 2; // js先聲明後執行;變量被聲明瞭js引擎就不會去當前函數做用域外查找 console.log(foo); // 2 })();