JavaScript面试题

 

 


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 设置一个值的时候到底发生了什么?用户代理按照以下步骤:

  1. 给定的值被解析为 HTML 或者 XML (取决于文档类型),结果就是 DocumentFragment 对象代表元素新设置的 DOM 节点。
  2. 如果元素内容被替换成 <template>  元素,<template> 元素的 content 属性会被替换为步骤1中创建的新的 DocumentFragment
  3. 对于其他所有元素,元素的内容都被替换为新的 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)作为对象原型链的终点。

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值