1、JavaScript有哪些垃圾回收机制?
有以下垃圾回收机制。
标记清除( mark and sweep)
这是 JavaScript最常见的垃圾回收方式。当变量进入执行环境的时候,比如在函数中声明一个变量,垃圾回收器将其标记为“进入环境”。当变量离开环境的时候(函数执行结束),将其标记为“离开环境”。
垃圾回收器会在运行的时候给存储在内存中的所有变量加上标记,然后去掉环境中的变量,以及被环境中变量所引用的变量(闭包)的标记。在完成这些之后仍然存在的标记就是要删除的变量。
引用计数( reference counting)
在低版本的E中经常会发生内存泄漏,很多时候就是因为它采用引用计数的方式进行垃圾回收。引用计数的策略是跟踪记录每个值被使用的次数。
当声明了一个变量并将个引用类型赋值给该变量的时候,这个值的引用次数就加1.如果该变量的值变成了另外一个,则这个值的引用次数减1.当这个值的引用次数变为0的时候,说明没有变量在使用,这个值没法被访问。
因此,可以将它占用的空间回收,这样垃圾回收器会在运行的时候清理引用次数为0的值占用的空间在正中虽然 JavaScript对象通过标记清除的方式进行垃圾回收,但是BOM与DOM对象是用引用计数的方式回收垃圾的。
也就是说,只要涉及BOM和DOM,就会出现循环引用问题
2、列举几种类型的DOM节点
有以下几类DOM节点。
整个文档是一个文档( Document)节点。
每个HTML标签是一个元素( Element)节点。
每一个HTML属性是一个属性( Attribute)节点。
包含在HTML元素中的文本是文本(Text)节点。
3、谈谈 script标签中 defer和 async属性的区别。
区别如下。
(1) defer属性规定是否延迟执行脚本,直到页面加载为止, async属性规定脚本一旦可用,就异步执行。
(2) defer并行加载 JavaScript文件,会按照页面上 script标签的顺序执行, async并行加载 JavaScript文件,下载完成立即执行,不会按照页面上 script标签的顺序执行。
4、说说你对闭包的理解。
使用闭包主要是为了设计私有的方法和变量。闭包的优点是可以避免全局变量的污染;缺点是闭包会常驻内存,增加内存使用量,使用不当很容易造成内存泄漏。在JavaScript中,函数即闭包,只有函数才会产生作用域闭包有3个特性
(1)函数嵌套函数。
(2)在函数内部可以引用外部的参数和变量
(3)参数和变量不会以垃圾回收机制回收
5、encodeR0和 decodeR0的作用是什么?
encodeURI()用于将URL转换为十六进制编码。而 decodeURI()用于将编码的URL转换回正常URL。
6、为什么不建议在 JavaScript中使用 innerHTML?
通过 innerHTML修改内容,每次都会刷新,因此很慢。在 innerHTML中没有验证的机会,因此更容易在文档中插入错误代码,使网页不稳定。
7、如何在不支持 JavaScript的旧浏览器中隐藏 JavaScript代码?
在< script>标签之后的代码中添加“<!–”,不带引号。
在< /script>标签之前添加“//–>”,代码中没有引号。
旧浏览器现在将 JavaScript代码视为一个长的HTML注释,而支持 JavaScript的浏览器则将"<!-"和"//–>"作为一行注释。
8、如何实现浏览器内多个标签页之间的通信?
调用 localstorge、 cookie等数据存储通信方式
9、null和 undefined的区别是什么?
null是一个表示“无”的对象,转为数值时为0;undefined是一个表示“无”的原始值,转为数值时为NaN。
当声明的变量还未初始化时,变量的默认值为 undefined 。
null用来表示尚未存在的对象,常用来表示函数企图返回一个不存在的对象。
undefined表示“缺少值”,即此处应该有一个值,但是还没有定义,典型用法是如下。
(1)如果变量声明了,但没有赋值,它就等于 undefined
(2)当调用函数时,如果没有提供应该提供的参数,该参数就等于 undefined。
(3)如果对象没有赋值,该属性的值为 undefined。
(4)当函数没有返回值时,默认返回 undefined。
null表示“没有对象”,即此处不应该有值,典型用法是如下。
(1)作为函数的参数,表示该函数的参数不是对象。
(2)作为对象原型链的终点。
10、new操作符的作用是什么?
作用如下:
(1)创建一个空对象。
(2)由this变量引用该对象
(3)该对象继承该函数的原型(更改原型链的指向)
(4)把属性和方法加入到this引用的对象中。
(5)新创建的对象由this引用,最后隐式地返回this,过程如下: