[关闭]
@stkevintan 2017-04-12T14:35:57.000000Z 字数 10667 阅读 880

前端记事簿

Web


原型链

  1. 所有的对象都有__proto__ 指向其原型对象
  2. 只有函数(Function.prototype除外)有prototype属性,初始值为空对象,如果把此函数当作构造函数(custructor)调用,则会创建并返回一个新的对象,并将这个对象的__proto__指向函数的prototype
  3. 一切函数(包括Obect Array) 的__proto__都为Function.prototype
  4. Function.prototype__proto__ 也为Object.prototype

关于Function.prototype

  1. Function.prototype像普通函数一样可以调用,但总是返回undefined
  2. Function.prototype没有prototype属性
  3. Functionprototype属性与__proto__相同,都指向函数Function.prototype.
  4. 普通函数实际上是Function的实例, 默认的prototype是一个空对象
  5. 所以,Function.prototype其实是个另类的函数,由Object直接派生,再生成Function

类型

所有的内建有:

  1. null
  2. undefined
  3. number
  4. string
  5. object
  6. boolean
  7. symbol

值得注意的事项有:

  1. typeof null === "object";
  2. typeof undefined === "undefined"
  3. typeof function(){} === "function"
  4. typeof typeof 42; // "string"

Ajax

  1. function sendAjax() {
  2. //构造表单数据
  3. var formData = new FormData();
  4. formData.append('username', 'johndoe');
  5. formData.append('id', 123456);
  6. //创建xhr对象
  7. var xhr = new XMLHttpRequest();
  8. //设置xhr请求的超时时间
  9. xhr.timeout = 3000;
  10. //设置响应返回的数据格式
  11. xhr.responseType = "text";
  12. //创建一个 post 请求,采用异步
  13. xhr.open('POST', '/server', true);
  14. //注册相关事件回调处理函数
  15. xhr.onload = function(e) {
  16. if(this.status == 200||this.status == 304){
  17. alert(this.responseText);
  18. }
  19. };
  20. // 或者
  21. xhr.addEventListener("readystatechange",function(e){
  22. if(e.target.readyState===4&&e.target.status===200){
  23. ....
  24. }
  25. })
  26. xhr.ontimeout = function(e) { ... };
  27. xhr.onerror = function(e) { ... };
  28. xhr.upload.onprogress = function(e) { ... };
  29. //发送数据
  30. xhr.send(formData);
  31. }

request header

  1. DOMString getAllResponseHeaders();
  2. DOMString getResponseHeader(DOMString header);
  3. //两者无法获得set-cookie,或在cors的时候只能获得简单的头部信息.
  4. void setRequestHeader(DOMString header, DOMString value);
  5. //setRequestHeader必须在open()方法之后,send()方法之前调用,否则会抛错
  6. //setRequestHeader可以调用多次,最终的值不会采用覆盖override的方式,而是采用追加append的方式。

responseType

xhr.response数据类型 说明
"" String 字符串 默认值
"text" String 字符串
"document" Document对象 希望返回xml数据时使用
"json" javascript对象 存在兼容问题,IE10/11支持
"blob" Blob对象
"arrayBuffer" arrayBuffer对象

XML Level 1不支持该属性,只能返回纯文字,或者使用下面方法手动接受图片数据

  1. var xhr = new XMLHttpRequest();
  2. //向 server 端获取一张图片
  3. xhr.open('GET', '/path/to/image.png', true);
  4. // 这行是关键!
  5. //将响应数据按照纯文本格式来解析,字符集替换为用户自己定义的字符集
  6. xhr.overrideMimeType('text/plain; charset=x-user-defined');
  7. xhr.onreadystatechange = function(e) {
  8. if (this.readyState == 4 && this.status == 200) {
  9. //通过 responseText 来获取图片文件对应的二进制字符串
  10. var binStr = this.responseText;
  11. //然后自己再想方法将逐个字节还原为二进制数据
  12. for (var i = 0, len = binStr.length; i < len; ++i) {
  13. var c = binStr.charCodeAt(i);
  14. //String.fromCharCode(c & 0xff);
  15. var byte = c & 0xff;
  16. }
  17. }
  18. };
  19. xhr.send();

readyState

状态 描述
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 (整个数据传输过程结束) 整个数据传输过程结束,不管本次请求是成功还是失败

Timeout

  1. xhr.timeout计时从send()loadstart开始
  2. 可以在send()之后再设置此xhr.timeout,但计时起始点仍为调用xhr.send()方法的时刻。
  3. xhr为一个sync同步请求时,xhr.timeout必须置为0,否则会抛错。

progress

分为上传和下载

Content-Type

xhr.send(data)中,如果是Get、Head请求,data会被自动忽略.否则,浏览器会根据data类型自动设置Content-type.

跨域

  1. 服务器需要设置Access-Control-Allow-Origin
  2. 默认跨域请求不带cookies,必须手动设置xhr.withCredentials=true才能携带cookies,服务器也要设置允许接受:Access-Control-Allow-Credentials:true
  3. IE 8/9 需要使用XDomainRequest

Jquery

  1. jquery版本的ajax可以使用下面方法来扩展原有的xhr

    1. var progress;
    2. $.ajax({
    3. url: a_cross_domain_url,
    4. xhrFields: {
    5. withCredentials: true,
    6. onprogress:function(e){
    7. if(e.lengthComputable)progress = e.loaded / e.total;
    8. }
    9. }
    10. });

HTTP Code

  1. 2xx 成功, 200 OK, 201 Created,202 Accepted,204 No Content, 205 Reset Content, 206 Partial Content
  2. 3xx 重定向, 300 Multiple Choises,301 Move Permanently, 302 Found(临时的),304 Not Modified,307 Temporary Redirect(有些浏览器不支持)
  3. 4xx 客户端错误, 400 Bad Request,401 Unauthorized, 403 Forbidden,404 Not Found
  4. 5xx 服务器错误, 502 Bad Gateway,503 Service Unavailable

三次握手和四次挥手

其中四次挥手后面客户端还要等待两个周期是防止最后一个ACK信号丢失而使得服务器无法关闭的情况.

当服务器如果检测到2个周期内没收到ACK信号则会重发FIN请求,此时客户端还能正常响应.

总的来说:客户端给服务器一次没听清楚的机会

属性封装

  1. var man = {}
  2. Object.defineProperty(man, 'name', {
  3. value: 'kid', // 值
  4. writable: true, // 是否可写
  5. enumerable: true, // 是否可枚举
  6. configurable: true // 除 writable外其他Descriptor属性是否可覆盖
  7. });
  8. Object.getOwnPropertyDescriptor(man,'name');
  9. // {
  10. // value: 'kid',
  11. // writable: true,
  12. // enumerable: true,
  13. // configurable: true
  14. // }
  15. Object.defineProperties(man, {
  16. name: {
  17. value: 'kid',
  18. writable: false
  19. },
  20. age: {
  21. //访问器,Vue中实现数据绑定
  22. get: function(){},
  23. set: function(age){}
  24. }
  25. })
  1. 如果属性已经存在,Object.defineProperty()将尝试根据描述符中的值以及对象当前的配置来修改这个属性。
  2. 如果描述符的configurable 特性false(即该特性为non-configurable),那么除了writable外,其他特性都不能被修改.
  3. 如果一个属性的configurable为 false,则其 writable 特性也只能修改为 false。
  4. 上述规则如果违背,则会得到一个TypeError

兼容问题

IE<=8 兼容问题:

  1. 不支持 addEventListener, 不支持事件捕获. 不支持stopProgagation和preventDefault. 没有target而是srcElement.

    1. document.attachEvent("onclick",function(e){
    2. e.returnValue = false; // preventDefault()
    3. e.cancelBubble = true; // stopPropagation()
    4. });
    5. // polyfill
    6. (function () {
    7. if (window.addEventListener) return;
    8. var exts = [window, HTMLDocument.prototype, Element.prototype];
    9. for (var i = 0; i < exts.length; i++) {
    10. if (!exts[i]) continue;
    11. exts[i].addEventL1istener = addEventListener;
    12. exts[i].removeEventListener = removeEventListener;
    13. exts[i].dispatchEvent = dispatchEvent;
    14. }
    15. var registry = [];
    16. // add event
    17. function addEventListener(type, listener) {
    18. var target = this;
    19. registry.unshift([target, type, listener, function (e) {
    20. e.currentTarget = target;
    21. e.preventDefault = function () { e.returnValue = false };
    22. e.stopPropagation = function () { e.cancelBubble = true };
    23. e.target = e.srcElement || target;
    24. listener.call(target, e);
    25. }]);
    26. target.attachEvent("on" + type, registry[0][3]);
    27. }
    28. // remove event
    29. function removeEventListener(type, listener) {
    30. for (var i = 0; i < registry.length; i++) {
    31. var c = registry[i];
    32. if (c[0] === this && c[1] === type && c[2] === listener) {
    33. return this.detachEvent("on" + type, registry.splice(i, 1)[0][3]);
    34. }
    35. }
    36. }
    37. //dispatch event
    38. function dispatchEvent(e) {
    39. return this.fireEvent("on" + e.type, e);
    40. }
    41. })();
  2. forEach,map,filter,reduce都不能用

  3. window.getComputedStyle,Element都不支持,只支持element.currentStyle.

  4. Element.getBoundingClientRect 不能得到height和width

  5. getElementsByClassName

  6. querySelector和querySelectorAll只支持CSS2.1和下面四种CSS选择器:

    1. a ~ b
    2. [attr^=val]
    3. [attr$=val]
    4. [attr*=val]
    1. // ie 6~7
    2. // 用于在IE6和IE7浏览器中,支持Element.querySelectorAll和Element.querySelector方法
    3. if (!document.querySelectorAll) {
    4. document.querySelectorAll = function (selectors) {
    5. var style = document.createElement('style'), elements = [], element;
    6. document.documentElement.firstChild.appendChild(style);
    7. document._qsa = [];
    8. style.styleSheet.cssText = selectors + '{x-qsa:expression(document._qsa && document._qsa.push(this))}';
    9. window.scrollBy(0, 0);
    10. style.parentNode.removeChild(style);
    11. while (document._qsa.length) {
    12. element = document._qsa.shift();
    13. element.style.removeAttribute('x-qsa');
    14. elements.push(element);
    15. }
    16. document._qsa = null;
    17. return elements;
    18. };
    19. }
    20. if (!document.querySelector) {
    21. document.querySelector = function (selectors) {
    22. var elements = document.querySelectorAll(selectors);
    23. return (elements.length) ? elements[0] : null;
    24. };
    25. }
    26. var qsaWorker = (function () {
    27. var idAllocator = 10000;
    28. function qsaWorkerShim(element, selector) {
    29. var needsID = element.id === "";
    30. if (needsID) {
    31. ++idAllocator;
    32. element.id = "__qsa" + idAllocator;
    33. }
    34. try {
    35. return document.querySelectorAll("#" + element.id + " " + selector);
    36. }
    37. finally {
    38. if (needsID) {
    39. element.id = "";
    40. }
    41. }
    42. }
    43. function qsaWorkerWrap(element, selector) {
    44. return element.querySelectorAll(selector);
    45. }
    46. // Return the one this browser wants to use
    47. return document.createElement('div').querySelectorAll ? qsaWorkerWrap : qsaWorkerShim;
    48. })();
  7. 支持HTMLElement.click()

window.getComputedStyle

  1. let style = getComputedStyle(document.documentElement,null);
  2. style.getPropertyValue('color');
  3. style.setPropertyValue('color','red','important');

EMCA 5新增API,(IE >= 9)

  1. Object.defineProperty && Object.defineProperties // ie8 only work in DOM object.
  2. Object.getOwnPropertyDescriptor // ie8 also ok
  3. Object.getPrototypeOf(object) // es5 - only object, es6 - primitive && object
  4. Object.getOwnPropertyNames(object) //es5 - only object, es6 - primitive && object
  5. Object.keys(object) //es5 - only object, es6 - primitive && object
  6. Object.freeze && Object.isFrozen
  7. Object.preventExtensions() && Object.isExtensiable(object)
  1. Object.getOwnPropertyNames能够获得所有可枚举和不可枚举的属性,Object.keys则只会获得可枚举的属性.
  2. freeze是全部无法修改, seal仅仅可以更改属性的值(不能删除), extension只是不能添加新元素.

检测文档加载

  1. document.addEventListener("DOMContentLoaded",function(){, // IE > 8 ,});
  2. document.attachEvent("onreadystatechange",function(e){
  3. if(document.readyState=== 'complete'){, // IE = 8, }});// 使用上方的polyfill
  4. document.addEventListener("readystatechange",function(e){
  5. if(document.readyState === 'complete'){ // IE >= 8 }})

先序遍历DOM树

  1. /*** 使用递归的方式先序遍历DOM树,
  2. * @param node 根节点,
  3. * */
  4. function traversal(node){
  5. //对node的处理
  6. if(node && node.nodeType === 1){ console.log(node.tagName); }
  7. var i = 0, childNodes = node.childNodes,item;
  8. for(; i < childNodes.length ; i++){
  9. item = childNodes[i];
  10. if(item.nodeType === 1){
  11. //递归先序遍历子节点
  12. traversal(item);
  13. }
  14. }
  15. }

documentFragment

因为文档片段存在与内存中,并不在DOM树中,所以将子元素插入到文档片段时不会引起页面回流(reflow)(对元素位置和几何上的计算)。因此,使用文档片段document fragments 通常会起到优化性能的作用(better performance)。

  1. var ul = document.getElementsByTagName("ul")[0]; // assuming it exists
  2. var docfrag = document.createDocumentFragment();
  3. var browserList = ["Internet Explorer", "Mozilla Firefox", "Safari", "Chrome", "Opera"];
  4. browserList.forEach(function(e) {
  5. var li = document.createElement("li");
  6. li.textContent = e;
  7. docfrag.appendChild(li);
  8. });
  9. ul.appendChild(docfrag);
  10. // 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;

React

生命周期

回调渲染模式

传入的props.children是一个函数,然后render里面调用this.props.children(this.state.user)

Controlled Component和Uncontrolled Component

前者数据一个在state里面后者数据在DOM里。

Children API

解决children可能不为array的情况

  1. object React.Children.map(object children, function fn [ object context])
  2. React.Children.forEach(object children, function fn [object context])
  3. number React.Children.count(object children)

JSON和XML

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 提供統一的方法來描述和交換獨立於應用程式或供應商的結構化數據。

网络安全

  1. XSS
  2. CSRF
  3. DDOS

#

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注