js的基本类型有哪些?引用类型有哪些?null和undefined的区别
js变量的值有两种:
1.基本类型值:存放在栈内存的简单数据类型。如Number、String 、Boolean、Null和Undefined这物种
2.引用类型值:存放在堆内存的中的对象。如Object 、Array 、Function 、Data
null :表示变量不存在,常常用作函数返回一个不存在的对象
Undefined:存在但是未定义,比如变量声明没有赋值,该变量就是undefined;调用函数中需要提供的参数没有提供,该参数就是undefiend;函数没有返回值,接收这个函数的变量就是Undefined等等
如何判断一个变量是Array类型?如何判断一个变量是Number类型?(都不止一种)
先说一下。检测类型的操作符typeof 它可以检测出string、function、object、number等,但是检测不了Array,检测Array,返回的值是’object’
所以需要使用其他方法去检测是否为数组类型:
- ES5提供了Array.isArray(‘要检测的变量’)方法,如果是,返回true
- Object.prototype.toString.call(要检测的变量),数组返回”[object Array]”
从构造函数入手,obj instanceof Array
是否为数字类型
1.使用typeof
2.使用isNaN
JS常见的dom操作api
- DOM的创建 :
document.createElement('div')
DOM的查询:
//DOM的查询获取 var el = document.getElementById('xxx'); //获取父元素、父节点 var parent = ele.parentNode;//只读,没有兼容性问题 //获取子节点: var nodes = ele.childNodes; //当前元素的第一个/最后一个子元素节点 var el = ele.firstChild;
DOM的更改
// 添加、删除子元素 ele.appendChild(el); ele.removeChild(el); // 替换子元素 ele.replaceChild(el1, el2); // 插入子元素 parentElement.insertBefore(newElement, referenceElement); //克隆元素 ele.cloneNode(true) //该参数指示被复制的节点是否包括原节点的所有属性和子节点
属性操作
// 获取一个{name, value}的数组 var attrs = el.attributes;
还有获取、设置标签属性:
getAttribute
、setAttribute
;判断、移除标签属性hasAttribute
removeAttribute
解释一下事件冒泡和事件捕获
一个完整的JS事件流是从window开始,最后回到window的一个过程
事件捕获指的是从document到触发事件的那个节点,即自上而下的去触发事件。相反的,事件冒泡是自下而上的去触发事件。
先说一下事件捕获:事件是从最上层也是最不精确的对象document开始进行触发,然后到代码指定的精确元素去触发
ele.addEventListener(事件,function,boolean)
假如父级有点击事件,子级也有点击事件,如果是设置了addEventListener最后一个参数为true,点击时候,就会先执行父级,在执行子级。。。
如果第3个参数设置为true,那么事件在捕获阶段就开始触发
设置为false,在冒泡阶段触发
假如父级有点击事件,子级也有点击事件,如果是设置了addEventListener最后一个参数为false,点击时候,就会先执行子级,在执行父级。。。
并且在子级的时候可以组织向上冒泡,最终结果就是只执行子级的点击事件
可以使用e.stopPropagation();
对闭包的理解?什么时候构成闭包?闭包的实现方法?闭包的优缺点?
闭包从形式上来看是 function return function;
我们都知道js中的变量有全局变量和局部变量两种,根据圆形链,子对象会一级一级地向上寻找所有父对象的变量。所以,父对象的所有变量,对子对象都是可见的,反之则不成立;function内的局部变量 可以通过 function return function 拿到全局去操作,这形成了闭包
缺点:
function是属于引用类型,所以函数内是存放在堆内存中;如果将函数的私有变量return 出来,就会造成内存的泄露