1、JavaScript有哪些垃圾回收机制
有以下垃圾回收机制。
标记清除( mark and sweep)
这是 JavaScript最常见的垃圾回收方式。当变量进入执行环境的时候,比如在函数中声明一个变量,垃圾回收器将其标记为“进入环境”。当变量离开环境的时候(函数执行结束),将其标记为“离开环境”。
垃圾回收器会在运行的时候给存储在内存中的所有变量加上标记,然后去掉环境中的变量,以及被环境中变量所引用的变量(闭包)的标记。在完成这些之后仍然存在的标记就是要删除的变量。
引用计数( reference counting)
在低版本的E中经常会发生内存泄漏,很多时候就是因为它采用引用计数的方式进行垃圾回收。引用计数的策略是跟踪记录每个值被使用的次数。
当声明了一个变量并将个引用类型赋值给该变量的时候,这个值的引用次数就加1.如果该变量的值变成了另外一个,则这个值的引用次数减1.当这个值的引用次数变为0的时候,说明没有变量在使用,这个值没法被访问。
因此,可以将它占用的空间回收,这样垃圾回收器会在运行的时候清理引用次数为0的值占用的空间在正中虽然 JavaScript对象通过标记清除的方式进行垃圾回收,但是BOM与DOM对象是用引用计数的方式回收垃圾的。
也就是说,只要涉及BOM和DOM,就会出现循环引用问题
2、谈谈 script标签中 defer和 async属性的区别。
区别如下。
(1) defer属性规定是否延迟执行脚本,直到页面加载为止, async属性规定脚本一旦可用,就异步执行。
(2) defer并行加载 JavaScript文件,会按照页面上 script标签的顺序执行, async并行加载 JavaScript文件,下载完成立即执行,不会按照页面上 script标签的顺序执行。
3、说说你对闭包的理解。
使用闭包主要是为了模拟私有的方法和变量。闭包的优点是可以避免全局变量的污染;缺点是闭包会常驻内存,增加内存使用量,使用不当很容易造成内存泄漏。在JavaScript中,函数即闭包,只有函数才会产生作用域闭包有3个特性
(1)函数嵌套函数。
(2)在函数内部可以引用外部的参数和变量
(3)参数和变量不会以垃圾回收机制回收
4、encodeR0和 decodeR0的作用是什么?
encodeURIComponent()
函数通过将一个,两个,三个或四个表示字符的UTF-8编码的转义序列替换某些字符的每个实例来编码 URI (对于由两个“代理”字符组成的字符而言,将仅是四个转义序列)
decodeURIComponent()
方法用于解码由 encodeURIComponent
方法或者其它类似方法编码的部分统一资源标识符(URI)
5为什么不建议在 JavaScript中使用 innerHTML?
当给 innerHTML
设置一个值的时候到底发生了什么?用户代理按照以下步骤:
- 给定的值被解析为 HTML 或者 XML (取决于文档类型),结果就是
DocumentFragment
对象代表元素新设置的 DOM 节点。 - 如果元素内容被替换成
<template>
元素,<template>
元素的content
属性会被替换为步骤1中创建的新的DocumentFragment
。 - 对于其他所有元素,元素的内容都被替换为新的
DocumentFragment
节点。
缺点
- 通过 innerHTML修改内容,每次都会刷新,因此很慢。在 innerHTML中没有验证的机会,因此更容易在文档中插入错误代码,使网页不稳定。
- 用
innerHTML
插入文本到网页中并不罕见。但这有可能成为网站攻击的媒介,从而产生潜在的安全风险问题。
6、如何在不支持 JavaScript的旧浏览器中隐藏 JavaScript代码?
在<script>标签之后的代码中添加“<!-– ”,不带引号。
在</script>标签之前添加“// –->”,代码中没有引号。
旧浏览器现在将JavaScript代码视为一个长的HTML注释。而支持JavaScript的浏览器则将“<! – ”和“// – >”作为一行注释。
如:
<script><!--
alert();
// --></script>
7、null和 undefined的区别是什么?
数值转换
console.log(undefined+1) //NaN
console.log(null-1) //-1
typeof
console.log(typeof undefined);//undefined
console.log(typeof null);//object
null是一个表示“无”的对象,转为数值时为0;undefined是一个表示“无”的原始值,转为数值时为NaN。
当声明的变量还未初始化时,变量的默认值为 undefined 。
null用来表示尚未存在的对象,常用来表示函数企图返回一个不存在的对象。
undefined表示“缺少值”,即此处应该有一个值,但是还没有定义,典型用法是如下。
(1)如果变量声明了,但没有赋值,它就等于 undefined
(2)当调用函数时,如果没有提供应该提供的参数,该参数就等于 undefined。
(3)如果对象没有赋值,该属性的值为 undefined。
(4)当函数没有返回值时,默认返回 undefined。
null表示“没有对象”,即此处不应该有值,典型用法是如下。
(1)作为函数的参数,表示该函数的参数不是对象。
(2)作为对象原型链的终点。