标签(空格分隔): 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 })();