1、JavaScript的基本类型有哪些?引用类型有哪些?
基本数据类型:Number、String、Boolean、Null、undefined
引用数据类型:function、Object、Array
2、null与undefined的区别?
null:表示对象被定义了,但值未设置。相当于一个对象没有设置指针地址就是null。null通过typeof判断类型是‘object’。null == null,null === null,null == undefined,null !== undefined。
undefined:是一个全局对象的属性,当变量没有被赋值、函数没有返回值、访问对象不存在某个属性、函数定义了形参但没有传递实参时,都是undefined。undefined通过typeof判断类型是‘undefined’;undefined == undefined,undefined === undefined。
总结:undefined表示一个变量的初始状态,而null则表示一个变量被人为设置为空对象,而不是原始状态。在实际过程中,不需要对变量赋值 undefined,当需要释放一个对象时,直接赋值null即可。让一个变量为空,直接给该变量赋值null即可。
3、什么是伪数组?如何将其转化为真实的数组?
伪数组:
a、具有length属性
b、按索引的方式存储数据
c、不具有数组的 push()、pop()等方法
伪数组--->真实数组:
a、在ES6中,使用Array.from()
b、[].slice.call(eleArr)或者Array.prototype.slice.call(eleArr)
4、src与href的区别?
src:指向外部资源的位置,指向的内容将会嵌入到文档中当前标签所在位置
href:指向网络资源的位置,建立和当前元素(锚点)或当前文档(链接)之间的链接
5、JavaScript中的作用域、预解析与变量声明提升?
a、作用域:指变量的有效范围,在一定空间内对数据进行读写操作。
(1)全局作用域:最外层函数定义的变量拥有全局作用域,即对其内部所有函数,都可以访问。
(2)局部作用域:只有在固定的代码片段内可以访问到,对于函数外部无法访问。
(3)块级作用域:所有的代码块都可以划分变量的作用域。
b、预解析:JS代码是由浏览器中的JavaScript解析器执行。JavaScript解析器执行JS代码时,分两个过程:预解析过程 和 代码执行过程。
预解析过程:
(1)将变量的声明提升到当前作用域的最前面,只会提升声明,不会提升赋值。
(2)将函数的声明提升到当前作用域的最前面,只会提升声明,不会提示调用。
(3)先提升 var,后提升function。
6、变量提升与函数提升的区别
a、变量提升:预编译期间会将变量声明与函数声明提升到其对应作用域的最顶端,函数内声明的变量只会提升到该函数作用域的最顶端
b、函数提升:(1)函数提升只会提升函数声明方式写法,函数表达式的写法不存在函数提升;(2)函数提升的优先级大于变量提升的优先级,即函数提升在变量提升之上。
7、什么是作用域链?
a、代码在一个环境中执行时,会创建变量对象的一个作用域链。
b、子级作用域返回父级作用域中寻找变量,称之为作用域链。
8、什么是事件冒泡?如何阻止事件冒泡?
Dom事件流包括三个阶段:事件捕获阶段、处于目标阶段、事件冒泡阶段。
a、事件捕获:当鼠标点击或触发dom事件时,浏览器会从根节点开始由外到内进行事件传播,即点击子元素,若父元素通过事件捕获方式注册了对应的事件,则先触发父元素绑定的事件。
b、事件冒泡:与事件捕获相反,事件冒泡顺序是由内到外进行事件传播,直到根节点。
c、dom标准事件流的触发先后顺序:先捕获后冒泡,即当触发dom事件时,先进行事件捕获,捕获到事件源后通过事件传播进行事件冒泡。
d、阻止事件冒泡:
(1)event.stopPropagation()
(2)return false
(3)event.preventDefault()
9、什么是页面重绘和回流?
a、重绘:当元素自身的宽高,布局,以及显示或隐藏没有改变,只是改变了元素的外观风格时,就产生重绘。例如,改变了元素的background-color...。
b、回流:当render tree 的一部分或全部的元素因改变了自身的宽高、布局、显示或隐藏,或者元素内部的文字结构发生变化,导致需要重新构建页面时,就产生回流。
c、结论:回流必然触发重绘,而重绘不一定触发回流。
10、JavaScript有几种方法判断变量的类型?
typeof、instanceof、Object.prototype.toString.call()(对象原型链判断方法)、constructor(用于引用数据类型)
a、typeof:常用于判断基本数据类型。对于引用数据类型除了function返回‘function’,其余全部返回‘object’。
b、instanceof:主要用于区分引用数据类型。验证当前类型的原型prototype是否出现在实例的原型链__proto__上,只要在它的原型链上,则结果都为true。
c、constructor:主要用于检测引用数据类型。获取实例的构造函数判断和某个类是否相同,如果相同则说明该数据符合那个数据类型,这个方法不会把原型链上的其他类也加进来,避免了原型链的干扰。
d、Object.prototype.toString.call(数据):适用于所有类型的判断检测。返回结果是该数据类型的字符串。