@stkevintan
2017-04-12T14:35:57.000000Z
字数 10667
阅读 880
Web
__proto__
指向其原型对象Function.prototype
除外)有prototype
属性,初始值为空对象,如果把此函数当作构造函数(custructor
)调用,则会创建并返回一个新的对象,并将这个对象的__proto__
指向函数的prototype
Obect
Array
) 的__proto__
都为Function.prototype
Function.prototype
的__proto__
也为Object.prototype
Function.prototype
像普通函数一样可以调用,但总是返回undefined
Function.prototype
没有prototype
属性Function
的prototype
属性与__proto__
相同,都指向函数Function.prototype
.Function
的实例, 默认的prototype
是一个空对象Function.prototype
其实是个另类的函数,由Object直接派生,再生成Function
所有的内建有:
null
undefined
number
string
object
boolean
symbol
值得注意的事项有:
typeof null === "object";
typeof undefined === "undefined"
typeof function(){} === "function"
typeof typeof 42; // "string"
xhr
对象xhr.responseType
为json
xhr.timeout
xhr.responseType
为blob
function sendAjax() {
//构造表单数据
var formData = new FormData();
formData.append('username', 'johndoe');
formData.append('id', 123456);
//创建xhr对象
var xhr = new XMLHttpRequest();
//设置xhr请求的超时时间
xhr.timeout = 3000;
//设置响应返回的数据格式
xhr.responseType = "text";
//创建一个 post 请求,采用异步
xhr.open('POST', '/server', true);
//注册相关事件回调处理函数
xhr.onload = function(e) {
if(this.status == 200||this.status == 304){
alert(this.responseText);
}
};
// 或者
xhr.addEventListener("readystatechange",function(e){
if(e.target.readyState===4&&e.target.status===200){
....
}
})
xhr.ontimeout = function(e) { ... };
xhr.onerror = function(e) { ... };
xhr.upload.onprogress = function(e) { ... };
//发送数据
xhr.send(formData);
}
DOMString getAllResponseHeaders();
DOMString getResponseHeader(DOMString header);
//两者无法获得set-cookie,或在cors的时候只能获得简单的头部信息.
void setRequestHeader(DOMString header, DOMString value);
//setRequestHeader必须在open()方法之后,send()方法之前调用,否则会抛错
//setRequestHeader可以调用多次,最终的值不会采用覆盖override的方式,而是采用追加append的方式。
值 | xhr.response 数据类型 |
说明 |
---|---|---|
"" | String 字符串 | 默认值 |
"text" | String 字符串 | |
"document" | Document对象 | 希望返回xml数据时使用 |
"json" | javascript对象 | 存在兼容问题,IE10/11支持 |
"blob" | Blob对象 | |
"arrayBuffer" | arrayBuffer对象 |
XML Level 1不支持该属性,只能返回纯文字,或者使用下面方法手动接受图片数据
var xhr = new XMLHttpRequest();
//向 server 端获取一张图片
xhr.open('GET', '/path/to/image.png', true);
// 这行是关键!
//将响应数据按照纯文本格式来解析,字符集替换为用户自己定义的字符集
xhr.overrideMimeType('text/plain; charset=x-user-defined');
xhr.onreadystatechange = function(e) {
if (this.readyState == 4 && this.status == 200) {
//通过 responseText 来获取图片文件对应的二进制字符串
var binStr = this.responseText;
//然后自己再想方法将逐个字节还原为二进制数据
for (var i = 0, len = binStr.length; i < len; ++i) {
var c = binStr.charCodeAt(i);
//String.fromCharCode(c & 0xff);
var byte = c & 0xff;
}
}
};
xhr.send();
值 | 状态 | 描述 |
---|---|---|
0 |
UNSENT (初始状态,未打开) |
此时xhr 对象被成功构造,open() 方法还未被调用 |
1 |
OPENED (已打开,未发送) |
open() 方法已被成功调用,send() 方法还未被调用。注意:只有xhr 处于OPENED 状态,才能调用xhr.setRequestHeader() 和xhr.send() ,否则会报错 |
2 |
HEADERS_RECEIVED (已获取响应头) |
send() 方法已经被调用, 响应头和响应状态已经返回 |
3 |
LOADING (正在下载响应体) |
响应体(response entity body )正在下载中,此状态下通过xhr.response 可能已经有了响应数据 |
4 |
DONE (整个数据传输过程结束) |
整个数据传输过程结束,不管本次请求是成功还是失败 |
xhr.timeout
计时从send()
即loadstart
开始send()
之后再设置此xhr.timeout
,但计时起始点仍为调用xhr.send()
方法的时刻。xhr
为一个sync
同步请求时,xhr.timeout
必须置为0
,否则会抛错。分为上传和下载
xhr.upload
对象的onprogress
事件xhr
对象的onprogress
事件xhr.send(data)
中,如果是Get、Head请求,data会被自动忽略.否则,浏览器会根据data类型自动设置Content-type.
data
是 Document
类型,同时也是HTML Document
类型,则content-type
默认值为text/html;charset=UTF-8
;否则为application/xml;charset=UTF-8
;data
是 DOMString
类型,content-type
默认值为text/plain;charset=UTF-8
;data
是 FormData
类型,content-type
默认值为multipart/form-data; boundary=[xxx]
data
是其他类型,则不会设置content-type
的默认值Access-Control-Allow-Origin
xhr.withCredentials=true
才能携带cookies,服务器也要设置允许接受:Access-Control-Allow-Credentials:true
XDomainRequest
jquery版本的ajax可以使用下面方法来扩展原有的xhr
var progress;
$.ajax({
url: a_cross_domain_url,
xhrFields: {
withCredentials: true,
onprogress:function(e){
if(e.lengthComputable)progress = e.loaded / e.total;
}
}
});
其中四次挥手后面客户端还要等待两个周期是防止最后一个ACK信号丢失而使得服务器无法关闭的情况.
当服务器如果检测到2个周期内没收到ACK信号则会重发FIN请求,此时客户端还能正常响应.
总的来说:客户端给服务器一次没听清楚的机会
var man = {}
Object.defineProperty(man, 'name', {
value: 'kid', // 值
writable: true, // 是否可写
enumerable: true, // 是否可枚举
configurable: true // 除 writable外其他Descriptor属性是否可覆盖
});
Object.getOwnPropertyDescriptor(man,'name');
// {
// value: 'kid',
// writable: true,
// enumerable: true,
// configurable: true
// }
Object.defineProperties(man, {
name: {
value: 'kid',
writable: false
},
age: {
//访问器,Vue中实现数据绑定
get: function(){},
set: function(age){}
}
})
configurable 特性
为false
(即该特性为non-configurable),那么除了writable
外,其他特性都不能被修改.configurable
为 false,则其 writable 特性也只能修改为 false。IE<=8 兼容问题:
不支持 addEventListener, 不支持事件捕获. 不支持stopProgagation和preventDefault. 没有target而是srcElement.
document.attachEvent("onclick",function(e){
e.returnValue = false; // preventDefault()
e.cancelBubble = true; // stopPropagation()
});
// polyfill
(function () {
if (window.addEventListener) return;
var exts = [window, HTMLDocument.prototype, Element.prototype];
for (var i = 0; i < exts.length; i++) {
if (!exts[i]) continue;
exts[i].addEventL1istener = addEventListener;
exts[i].removeEventListener = removeEventListener;
exts[i].dispatchEvent = dispatchEvent;
}
var registry = [];
// add event
function addEventListener(type, listener) {
var target = this;
registry.unshift([target, type, listener, function (e) {
e.currentTarget = target;
e.preventDefault = function () { e.returnValue = false };
e.stopPropagation = function () { e.cancelBubble = true };
e.target = e.srcElement || target;
listener.call(target, e);
}]);
target.attachEvent("on" + type, registry[0][3]);
}
// remove event
function removeEventListener(type, listener) {
for (var i = 0; i < registry.length; i++) {
var c = registry[i];
if (c[0] === this && c[1] === type && c[2] === listener) {
return this.detachEvent("on" + type, registry.splice(i, 1)[0][3]);
}
}
}
//dispatch event
function dispatchEvent(e) {
return this.fireEvent("on" + e.type, e);
}
})();
forEach,map,filter,reduce都不能用
window.getComputedStyle,Element都不支持,只支持element.currentStyle.
Element.getBoundingClientRect 不能得到height和width
getElementsByClassName
querySelector和querySelectorAll只支持CSS2.1和下面四种CSS选择器:
// ie 6~7
// 用于在IE6和IE7浏览器中,支持Element.querySelectorAll和Element.querySelector方法
if (!document.querySelectorAll) {
document.querySelectorAll = function (selectors) {
var style = document.createElement('style'), elements = [], element;
document.documentElement.firstChild.appendChild(style);
document._qsa = [];
style.styleSheet.cssText = selectors + '{x-qsa:expression(document._qsa && document._qsa.push(this))}';
window.scrollBy(0, 0);
style.parentNode.removeChild(style);
while (document._qsa.length) {
element = document._qsa.shift();
element.style.removeAttribute('x-qsa');
elements.push(element);
}
document._qsa = null;
return elements;
};
}
if (!document.querySelector) {
document.querySelector = function (selectors) {
var elements = document.querySelectorAll(selectors);
return (elements.length) ? elements[0] : null;
};
}
var qsaWorker = (function () {
var idAllocator = 10000;
function qsaWorkerShim(element, selector) {
var needsID = element.id === "";
if (needsID) {
++idAllocator;
element.id = "__qsa" + idAllocator;
}
try {
return document.querySelectorAll("#" + element.id + " " + selector);
}
finally {
if (needsID) {
element.id = "";
}
}
}
function qsaWorkerWrap(element, selector) {
return element.querySelectorAll(selector);
}
// Return the one this browser wants to use
return document.createElement('div').querySelectorAll ? qsaWorkerWrap : qsaWorkerShim;
})();
支持HTMLElement.click()
let style = getComputedStyle(document.documentElement,null);
style.getPropertyValue('color');
style.setPropertyValue('color','red','important');
Object.defineProperty && Object.defineProperties // ie8 only work in DOM object.
Object.getOwnPropertyDescriptor // ie8 also ok
Object.getPrototypeOf(object) // es5 - only object, es6 - primitive && object
Object.getOwnPropertyNames(object) //es5 - only object, es6 - primitive && object
Object.keys(object) //es5 - only object, es6 - primitive && object
Object.freeze && Object.isFrozen
Object.preventExtensions() && Object.isExtensiable(object)
document.addEventListener("DOMContentLoaded",function(){, // IE > 8 ,});
document.attachEvent("onreadystatechange",function(e){
if(document.readyState=== 'complete'){, // IE = 8, }});// 使用上方的polyfill
document.addEventListener("readystatechange",function(e){
if(document.readyState === 'complete'){ // IE >= 8 }})
/*** 使用递归的方式先序遍历DOM树,
* @param node 根节点,
* */
function traversal(node){
//对node的处理
if(node && node.nodeType === 1){ console.log(node.tagName); }
var i = 0, childNodes = node.childNodes,item;
for(; i < childNodes.length ; i++){
item = childNodes[i];
if(item.nodeType === 1){
//递归先序遍历子节点
traversal(item);
}
}
}
因为文档片段存在与内存中,并不在DOM树中,所以将子元素插入到文档片段时不会引起页面回流(reflow)(对元素位置和几何上的计算)。因此,使用文档片段document fragments 通常会起到优化性能的作用(better performance)。
var ul = document.getElementsByTagName("ul")[0]; // assuming it exists
var docfrag = document.createDocumentFragment();
var browserList = ["Internet Explorer", "Mozilla Firefox", "Safari", "Chrome", "Opera"];
browserList.forEach(function(e) {
var li = document.createElement("li");
li.textContent = e;
docfrag.appendChild(li);
});
ul.appendChild(docfrag);
// a list with well-known web browsers
页可见区域宽: document.body.clientWidth;
网页可见区域高: document.body.clientHeight;
网页可见区域宽: document.body.offsetWidth (包括边线的宽);
网页可见区域高: document.body.offsetHeight (包括边线的宽);
网页正文全文宽: document.body.scrollWidth;
网页正文全文高: document.body.scrollHeight;
网页被卷去的高: document.body.scrollTop;
网页被卷去的左: document.body.scrollLeft;
网页正文部分上: window.screenTop;
网页正文部分左: window.screenLeft;
屏幕分辨率的高: window.screen.height;
屏幕分辨率的宽: window.screen.width;
屏幕可用工作区高度: window.screen.availHeight;
render
getInitialState
getDefaultProps
componentWillMount
componentDidMount 在此发起ajax请求
componentWillReceiveProps 在该函数中调用 this.setState() 将不会引起第二次渲染。
shouldComponentUpdate
componentWillUpdate 在props和state改变时候调用,不能调用this.setState()
componentDidUpdate
componentWillUnmount
传入的props.children是一个函数,然后render里面调用this.props.children(this.state.user)
前者数据一个在state里面后者数据在DOM里。
解决children可能不为array的情况
object React.Children.map(object children, function fn [ object context])
React.Children.forEach(object children, function fn [object context])
number React.Children.count(object children)
JSON(Javascript Object Notation) 是一種輕量級的數據交換格式。易於人閱讀和編寫。同時也易於機器解析和生成。它基於Javascript Programming Language,Standard ECMA-262 3rd Edition - December 1999的一個子集。JSON採用完全獨立於語言的文本格式,但是也使用了類似於C語言家族的習慣(包括C, C++, C#,Java, Javascript, Perl, Python等)。這些特性使JSON成為理想的數據交換語言。
XML(EXtensible Markup Language),XML是一種類似於HTML的標記語言,XML是用來描述數據的,可以用來標記數據、定義數據類型,是一種允許用戶對自己的
標記語言進行定義的源語言。 XML使用DTD(document type definition)文檔類型定義來組織數據;格式統一,跨平台和語言,早已成為業界公認的標準。
XML是標準通用標記語言 (SGML) 的子集,非常適合 Web 傳輸。XML 提供統一的方法來描述和交換獨立於應用程式或供應商的結構化數據。