2020小总结

384 阅读4分钟

1、创建、添加、移除、复制 DOM 节点

1.创建元素节点

document.createElement() 方法 用于创建元素,接受一个参数,即要创建元素的标签名,返回创建的元素节点

 var div = document.createElement("div"); //创建一个div元素
 div.id = "myDiv"; //设置div的id
 div.className = "box"; //设置div的class

创建元素后还要把元素添加到文档树中

2.添加元素节点

appendChild() 方法 用于向childNodes列表的末尾添加一个节点,返回要添加的元素节点

 var ul = document.getElementByIdx("myList"); //获得ul
 var li = document.createElement("li"); //创建li
 li.innerHTML = "项目四"; //向li内添加文本
 ul.appendChild(li); //把li 添加到ul子节点的末尾

apendChild()方法还可以添加已经存在的元素,会将元素从原来的位置移到新的位置

 var ul = document.getElementById("myList"); //获得ul
 ul.appendChild(ul.firstChild); //把ul的第一个元素节点移到ul子节点的末尾

sertBefore()方法,如果不是在末尾插入节点,而是想放在特定的位置上,用这个方法,该方法接受2个参数,第一个是要插入的节点,第二个是参照节点,返回要添加的元素节点

 var ul = document.getElementById("myList"); //获得ul
 var li = document.createElement("li"); //创建li
 li.innerHTML= "项目四"; //向li内添加文本
 ul.insertBefore(li,ul.firstChild); //把li添加到ul的第一个子节点前
 var ul = document.getElementById("myList"); //获得ul
 var li = document.createElement("li"); //创建li
 li.innerHTML= "项目四"; //向li内添加文本
 ul.insertBefore(li,ul.lastChild); //把li添加到ul的最后一个子节点(包括文本节点)之前
 var ul = document.getElementById("myList"); //获得ul
 var li = document.createElement("li"); //创建li
 li.innerHTML= "项目四"; //向li内添加文本
 var lis = ul.getElementsByTagName("li") //获取ul中所有li的集合
 ul.insertBefore(li,lis[1]);     //把li添加到ul中的第二个li节点前

添加后:

3.移除元素节点

removeChild() 方法,用于移除节点,接受一个参数,即要移除的节点,返回被移除的节点,注意被移除的节点仍然在文档中,不过文档中已没有其位置了

 var ul = document.getElementById("myList"); //获得ul
 var fromFirstChild = ul.removeChild(ul.firstChild); //移除ul第一个子节点
 var ul = document.getElementById("myList"); //获得ul
 var lis = ul.getElementsByTagName("li") //获取ul中所有li的集合
 ul.removeChild(lis[0]);       //移除第一个li,与上面不同,要考虑浏览器之间的差异
4.替换元素节点

replaceChild()方法,用于替换节点,接受两个参数,第一参数是要插入的节点,第二个是要替换的节点,返回被替换的节点

 var ul = document.getElementById("myList"); //获得ul
 var fromFirstChild = ul.replaceChild(ul.firstChild); //替换ul第一个子节点
 var ul = document.getElementById("myList"); //获得ul;
 var li = document.createElement("li"); //创建li
 li.innerHTML= "项目四"; //向li内添加文本
 var lis = ul.getElementsByTagName("li") //获取ul中所有li的集合
 var returnNode = ul.replaceChild(li,lis[1]); //用创建的li替换原来的第二个li
5.复制节点

cloneNode()方法,用于复制节点, 接受一个布尔值参数, true 表示深复制(复制节点及其所有子节点), false 表示浅复制(复制节点本身,不复制子节点)

 var ul = document.getElementById("myList"); //获得ul
 var deepList = ul.cloneNode(true); //深复制
 var shallowList = ul.cloneNode(false); //浅复制

2、数组 pop()、push()、shift()、unshift() 的作用

shift():从集合中把第一个元素删除,并返回这个元素的值。
unshift(): 在集合开头添加一个或更多元素,并返回新的长度
push():在集合中添加元素,并返回新的长度
pop():从集合中把最后一个元素删除,并返回这个元素的值。

3、千分位分割数字:1234567890.11 -> 1,234,567,890.11

方法一:数字类型

let str = 1234567890.11;
str.toLocaleString() //1,234,567,890.11

方法二:字符串类型

let reg = /(\d)(?=(?:\d{4})+$)/g;
let str = '1234567890.11';
let target = str.replace(reg, '$1,'); //1,234,567,890.11

4、数组去重多种方式实现

通过遍历新数组来去重

	//1
    Array.prototype.unique1 = function(){
        var arr1 = []; //定义一个新数组
        for(var i=0;i<this.length;i++){
          if(arr1.indexOf(this[i]) == -1){//判断目标数组中在原数组里是否存在
            arr1.push(this[i]);
          } 
        } 
        return arr1;
    }
    
    // 2
    Array.prototype.unique2 = function(){
      var hash = {}; //定义一个hash表
      var arr1 = []; //定义一个新数组
      for(var i=0;i<this.length;i++){
        if(!hash[this[i]]){
          hash[this[i]] = true;
          arr1.push(this[i]);
        }
      }
      return arr1;  
    }

Set实现去重

const a=Array.from(new Set([1,1,2,2,3,4,5,6]))
console.log(a); //1,2,3,4,5,6

5、用 CORS 进行跨域,简单请求和复杂请求有什么不同?

1、简单请求

一个简单的请求大致如下:

HTTP方法是下列之一

HEAD  //HEAD请求和GET本质是一样的,但是HEAD请求不含数据,只有HTTP头部信息
GET
POST

HTTP头信息不超出以下几种字段

Accept
Accept-Language
Content-Language
Last-Event-ID
Content-Type,但仅能是下列之一
application/x-www-form-urlencoded
multipart/form-data
text/plain

简单请求的部分响应头及解释如下:

Access-Control-Allow-Origin(必含)- 不可省略,否则请求按失败处理。该项控制数据的可见范围,如果希望数据对任何人都可见,可以填写"*"。
Access-Control-Allow-Credentials(可选) – 该项标志着请求当中是否包含cookies信息,只有一个可选值:true(必为小写)。如果不包含cookies,请略去该项,而不是填写false。这一项与XmlHttpRequest2对象当中的withCredentials属性应保持一致,即withCredentials为true时该项也为true;withCredentials为false时,省略该项不写。反之则导致请求失败。
Access-Control-Expose-Headers(可选) – 该项确定XmlHttpRequest2对象当中getResponseHeader()方法所能获得的额外信息。通常情况下,getResponseHeader()方法只能获得如下的信息:
Cache-Control
Content-Language
Content-Type
Expires
Last-Modified
Pragma
当你需要访问额外的信息时,就需要在这一项当中填写并以逗号进行分隔

任何一个不满足上述要求的请求,即被认为是复杂请求。一个复杂请求不仅有包含通信内容的请求,同时也包含预请求(preflight request)。

2、复杂请求

复杂请求表面上看起来和简单请求使用上差不多,但实际上浏览器发送了不止一个请求。其中最先发送的是一种"预请求",此时作为服务端,也需要返回"预回应"作为响应。预请求实际上是对服务端的一种权限请求,只有当预请求成功返回,实际请求才开始执行。

预请求以OPTIONS形式发送,当中同样包含域,并且还包含了两项CORS特有的内容:

Access-Control-Request-Method – 该项内容是实际请求的种类,可以是GET、POST之类的简单请求,也可以是PUT、DELETE等等。
Access-Control-Request-Headers – 该项是一个以逗号分隔的列表,当中是复杂请求所使用的头部。

显而易见,这个预请求实际上就是在为之后的实际请求发送一个权限请求,在预回应返回的内容当中,服务端应当对这两项进行回复,以让浏览器确定请求是否能够成功完成。

复杂请求的部分响应头及解释如下:

Access-Control-Allow-Origin(必含) – 和简单请求一样的,必须包含一个域。
Access-Control-Allow-Methods(必含) – 这是对预请求当中Access-Control-Request-Method的回复,这一回复将是一个以逗号分隔的列表。尽管客户端或许只请求某一方法,但服务端仍然可以返回所有允许的方法,以便客户端将其缓存。
Access-Control-Allow-Headers(当预请求中包含Access-Control-Request-Headers时必须包含) – 这是对预请求当中Access-Control-Request-Headers的回复,和上面一样是以逗号分隔的列表,可以返回所有支持的头部。这里在实际使用中有遇到,所有支持的头部一时可能不能完全写出来,而又不想在这一层做过多的判断,没关系,事实上通过request的header可以直接取到Access-Control-Request-Headers,直接把对应的value设置到Access-Control-Allow-Headers即可。
Access-Control-Allow-Credentials(可选) – 和简单请求当中作用相同。
Access-Control-Max-Age(可选) – 以秒为单位的缓存时间。预请求的的发送并非免费午餐,允许时应当尽可能缓存。

一旦预回应如期而至,所请求的权限也都已满足,则实际请求开始发送。

6、了解过排序算法吗?说一下冒泡排序和快速排序

冒泡排序:

比较相邻的元素。如果第一个比第二个大,就交换他们两个。
对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
针对所有的元素重复以上的步骤,除了最后一个。
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

 //冒泡排序
  const bubbleSortOne = (arr) => {
    for (let i = 0; i < arr.length - 1; i++) {
      for (let j = i + 1; j < arr.length; j++) {
        if (arr[i] > arr[j]) {
          // 调换位置
		  [arr[i], arr[j]] = [arr[j], arr[i]];
        }
      }
    }

    return arr;
  };

  console.log(bubbleSortOne([2, 1, 3,5,6,4])); // [ 1, 2, 3, 4, 5, 6 ]
快速排序:

先从数列中取出一个数作为“基准”。
分区过程:将比这个“基准”大的数全放到“基准”的右边,小于或等于“基准”的数全放到“基准”的左边。
再对左右区间重复第二步,直到各区间只有一个数。

var quickSort = function(arr) {
    if (arr.length <= 1) { return arr; }
    var pivotIndex = Math.floor(arr.length / 2);   //基准位置(理论上可任意选取)
    var pivot = arr.splice(pivotIndex, 1)[0];  //基准数
    var left = [];
    var right = [];
    for (var i = 0; i < arr.length; i++){
        if (arr[i] < pivot) {
            left.push(arr[i]);
        } else {
            right.push(arr[i]);
        }
    }
    return quickSort(left).concat([pivot], quickSort(right));  //链接左数组、基准数构成的数组、右数组
};