javascript 的基础(理论知识)

yfisaboy 2019-12-27

01、JavaSript有哪些垃圾回收机制?

标记清除( mark and sweep )

这是JavaScr i pt 最常见的垃圾回收方式。当变量进入执行环境的时候,比如在函数中声明一个变量,垃圾回收器将其标记为“进入环境” 。当变量离开环境的时候(函数执行结束),将其标记为“离开环境”。垃圾回收器会在运行的时候给存储在内存中的所有变量加上标记,然后去掉环境中的变量,以及被环境中变量所引用的变量(闭包)的标记。在完成这些之后仍然存在的标记就是要删除的变量。

引用计数( reference counting)

在低版本的IE 中经常会发生内存泄漏,很多时候就是因为它采用引用计数的方式进行垃圾回收。引用计数的策略是跟踪记录每个值被使用的次数。当声明了一个变量并将一个引用类型赋值给该变量的时候, 这个值的引用次数就加1 。如果该变量的值变成了另外一个,则这个值的引用次数就减1 。当这个值的引用次数变为0 的时候,说明没有变量在使用,这个值没法被访问。因此, 可以将它占用的空间回收,这样垃圾回收器会在运行的时候清理引用次数为0 的值占用的空间。在IE中虽然JavaScript 对象通过标记清除的方式进行垃圾回收,但是BOM 与DOM 对象是用引用计数的方式回收垃圾的。也就是说, 只要涉及BOM 和DOM , 就会出现循环引用问题。

02、列举几种类型的DO M 节点

有以下几类DOM 节点。

• 整个文档是一个文档( Document )节,点。

• 每个HTML 标签是一个元素( E l ement )节点。

• 每一个HTML 属性是一个属性( Attribute )节点。. 包含在HTML 元素中的文本是文本( Text )节点。

03、谈谈JavaSript 标签中defer 和async 属性的区别。

( 1 ) defer 属性规定是否延迟执行脚本,直到页面加载为止。async 属性规定脚本一旦可用,就异步执行。

( 2) defer 并行加载JavaScript 文件, 会按照页面上script 标签的顺序执行。async 并行加载JavaScript 文件,下载完成立即执行,不会按照页面上JavaScript 标签的顺序执行。

04、说说你对闭包的理解。

使用闭包主要是为了设计私有的方法和支量。闭包的优点是可以避免全局变量的污染;

缺点是闭包会常驻内存, 增加内存使用量,使用不当很容易造成内存泄漏。

在JavaScript 中,函数即闭包,只有函数才会产生作用域。

闭包有3 个特性。

( I )函数嵌套函数。

( 2 )在函数内部可以引用外部的参数和支量。

( 3 )参数和变量不会以垃圾回收机制回收。

05、解释一下unshift ()方法。

该方法在数组启动时起作用,与push ()不同。它将参数成员添加到数组的顶部。下面给出一段示例代码。

var name= [ ” ] ohn ” ]name unshift (”char lie”);name unshi ft ( ” ] oseph”,” Jane " ) ;cons ole log (name );

输出生口下所示。[ ” joseph H ,” Jane ”,” char lie ”,” john ” ]

06、encodeURI ()和decodeURI ()的作用是什么?

encodeURI()用于将URL 转换为十六进制编码。而decodeURI()用于将编码的URL转换回正常URL 。

07、为什么不建议在JavaScript 中使用innerHTML?

通过innerHTML 修改内容, 每次都会刷新,因此很慢。在innerHTML 中没有验证的机会, 因此更容易在文档中插入错误代码,使网页不稳定。

08、如何在不支持JavaScript 的旧浏览器中隐藏JavaScrpit 代码?

在<script>标签之后的代码中添加“<!一” , 不带引号。

在</script>标签之前添加“刀…>”,代码中没有引号。

旧浏览器现在将JavaScript 代码视为一个长的HTML 注释, 而支持JavaScript 的浏览器则将“< !一” 和“// …>” 作为一行注释。

09、在DOM 操作中怎样创建、添加、移除、替换、插入和查找节点?

具体方法如下。

( 1 ) 通过以下代码创建新节点。createDocurnentFragrnent ()      // 创建一个DOM 片段

              createElernent()                    // 创建一个具体的元素

              creat eTextNode( )                //创建一个文本节点

( 2 ) 通过以下代码添加、移除、替换、插入节,点。

appendChild()

removeChild ( )

replaceChild ()

insertBefore () //并没有inse r tAf t er ()
( 3 )通过以下代码查找节点。

getElernentsByTagNarne()       //通过标签名称查找节点

getE l erne 口tsByNarne ()       //通过元素的name 属性的值查找节点( IE 容错能力较强, 会得到一个数                                           

              //组, 其中包括id 等于name 值的节点)

getElernentByid()                     //通过元素 Id 查找节点, 具有唯一性

10、如何实现浏览器内多个标签页之间的通信?

调用Jocalstorge 、cookie 等数据存储通信方式。

相关推荐