一.Js中如何对dom元素进行删除和复制呢
①父元素.removeChild(子元素);
②被复制的元素.cloneNode(bool);bool是一个布尔值
1或true:表示复制元素本身以及复制该元素下的所有子元素。
0或false:表示仅仅复制元素本身,不复制该元素下的子元素。
二.Js垃圾回收机制是什么请简述
①概念
js的垃圾回收机制是为了防止内存泄漏(已经不需要的某一块内存还一直存在着),垃圾回收机制就是不停歇的寻找这些不再使用的变量,并且释放掉它所指向的内存。
在JS中,JS的执行环境会负责管理代码执行过程中使用的内存。
②变量的生命周期
当一个变量的生命周期结束之后,它所指向的内存就会被释放。js有两种变量,局部变量和全局变量,局部变量是在他当前的函数中产生作用,当该函数结束之后,该变量内存会被释放,全局变量的话会一直存在,直到浏览器关闭为止
③js垃圾回收方式有两种方式: 标记清除、引用计数
标记清除:
大部分浏览器使用这种垃圾回收,当变量进入执行环境(声明变量)的时候,垃圾回收器将该变量进行了标记,当该变量离开环境的时候,将其再度标记,随之进行删除。
引用计数:
这种方式常常会引起内存的泄露,主要存在于低版本的浏览器。它的机制就是跟踪某一个值得引用次数,当声明一个变量并且将一个引用类型赋值给变量得时候引用次数加1,当这个变量指向其他一个时引用次数减1,当为0时出发回收机制进行回收
三.请说出你对this的理解
①this的概述
this是Javascript语言的一个关键字,它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用
②this指向
1.与事件体连用,代表触发事件的元素本身
2.与普通函数连用,代表调用该函数的对象
3.与构造函数连用时,代表new出来的对象
4.与箭头函数连用时,箭头函数没有this 是,他的this是他父元素的前缀
③修改this指向的方式
1.使用that
2.使用.bind( )
Object.bind(this,obj1,obj2,obj3) :如果 bind 的第一个参数为空,则默认指向全局对象
bind()方法只会返回一个函数,并不会执行函数。
3.使用.apply()
Object.apply(this,arguments):apply 只能写两个参数,第一个参数表示改变后的调用这个函数的对象,即this要指向的对象;第二个参数是一个数组,用于存放要传的参数,可以用arguments获得。如果 apply 的第一个参数为空,则默认指向全局对象
4.使用.call()
Object.call(this,obj1,obj2,obj3) :call 可以写多个参数,第一个参数表示改变后的调用这个函数的对象,即this要指向的对象;如果 call 的第一个参数为空,则默认指向全局对象
四.函数的节流和防抖请描述
节流就是减少流量,将频繁触发的事件减少,并每隔一段时间执行。即,控制事件触发的频率
防抖就是防止抖动,避免事件的重复触发
五.DOM怎样添加、移除、移动、复制、创建和查找节点
①创建 :document.createElement("标签名") 返回值:创建好的标签
②尾部追加 :父节点.appendChild(子节点) 返回值:无
③删除: 节点.remove() 父节点.removeChild(子节点) 返回值:无
④插入(eg: 在第2个之前插入一个创建好的节点)
语法:父节点.insertBefore(新节点,谁的前面的那个谁) 返回值:无
⑤替换 (eg: 创建一个新的,把 原有的替换掉)
语法: 旧节点父节点.replaceChild(新节点,旧节点) 返回值:无
⑥克隆节点:节点.cloneNode(true/false) ()内什么都不写,默认就是false
注意点:true代表克隆自身标签以及后代的所有内容
false只代表克隆自身标签 返回值:克隆出来的
六.解释一下什么是 promise ?包含状态与方法
①Promise的概念
Promise是ES6提供的原生的类(构造函数), 用来传递异步操作的消息。它代表了某个未来才会知道结果的事件(通常是一个异步操作)
②Promise的两个特点
1.对象的状态不受外界影响
Promise 有三种状态:Pending(进行中)、Resolved(已完成,又称 Fulfilled)和 Rejected(已失败)
2.一旦状态改变,就不会再变
状态改变,只有两种可能:从 Pending 变为 Resolved 和从 Pending 变为 Rejected
③Promise的作用:解决回调地狱的问题
④Promise类的方法:
1. 对象方法:then,catch
then方法:
功能:把then方法的参数传给resolve和reject。 promise对象.then(resolve回调函数,reject回调函数);
参数:then方法的第一个参数是resolvethen方法的第二个参数是reject。
返回值:promise对象本身,所以,then调用完毕后,还可以继续调用then(即:链式调用)
Promise中then方法的数据传递
上一个then的返回值(结果)是下一个then的参数(输入)
catch方法:
它和then的第二个参数一样,用来指定reject的回调
2.类方法: all ,race
all方法:
功能: Promise.all可以并行执行多个异步操作,并且在一个回调中处理所有的返回数据。返回的数据与传的参数数组的顺序是一样的。当所有的异步操作都成功才表示成功 。
参数:数组。数组里是若干个返回promise对象的函数(异步操作);
返回值:promise对象。promise对象的then方法的回调函数的参数是 所有promise对象的resolve的参数(数组形式)
用Promise.all来执行,all接收一个数组参数,两个异步操作是并行执行的,等到它们都执行完后才会进到then里面。而两个异步操作返回的数据都在then里面,all会把所有异步操作的结果放进一个数组中传给then,就是上面的results
race方法:
功能:也是并发,但是,与all不同之处时,当一个异步操作完成(resolve或reject)时,就调用方法了。即:多个异步操作,同时执行,谁快就用谁的结果,所以,结果不再是数组。
⑤总结Promise的使用步骤
1、找到(曾经的)异步操作的代码,放在Prmoise构造函数的参数(函数)里 2、参数(函数)的第一个参数resolve是成功时调用的函数,对应then方法(函数)的第一个参数 3、参数(函数)的第二个参数reject是失败时调用的函数,对应then方法(函数)的第二个参数
七.解释一下JS的展开操作符?什么是解构?
展开操作符...作用就是展开数组或字符串为一个新数组。
解构就是按照一定的模式或者规则,在数组和对象中提取值,并且对变量进行赋值的操作。优点:简洁易读,语义清晰明了,也方便在复杂数据中对数据字段的获取。
八.如何判断数据的类型是否是数组类型?有哪些方法?
①typeof 判断变量类型:在JS中数组是一种特殊的对象, typeof 方法会返 Object
② Array.isArray 判断变量类型:返回值为布尔值,如果是数组则为 true,否则false
③ instanceof 判断数组类型:实例化一个对象时,该对象的原型链中包含它所属类的原型对象,利用这个特性,可以使用 instanceof 来判断该对象是否为数组类型
九.Dom操作的api有哪些?
①节点查找相关的API:
document.getElementById ;//根据ID查找元素,大小写敏感,有多个结果,返回第一个 document.getElementsByClassName ;//根据类名查找元素,多个类名用空格分隔,返回一个 document.getElementsByTagName ;//根据标签查找元素,表示查询所有标签,返回一个 document.getElementsByName ;//根据元素的name属性查找,返回一个 NodeList document.querySelector ;//返回单个Node,如果匹配到多个结果,只返回第一个 document.querySelectorAll ;//返回一个 NodeList
②节点创建修改相关的API:
创建 :document.createElement("标签名") 返回值:创建好的标签
尾部追加 :父节点.appendChild(子节点) 返回值:无
删除: 节点.remove() 父节点.removeChild(子节点) 返回值:无
插入:父节点.insertBefore(新节点,谁的前面的那个谁) 返回值:无
替换 : 旧节点父节点.replaceChild(新节点,旧节点) 返回值:无
克隆节点:节点.cloneNode(true/false)
③节点关系API:
父找子: childNodes children firstElementChild lastElementChild
子找父: parentNode
兄弟节点: nextElementSibling previousElementSibling