来源 |
前端程序员面试秘籍
01、JavaSript有哪些垃圾回收机制?
标记清除( mark and sweep ) 这是JavaScr i pt 最常见的垃圾回收方式。当变量进入执行环境的时候,比如在函数 中声明一个变量,垃圾回收器将其标记为“进入环境” 。 当变量离开环境的时候(函数执 行结束),将其标记为“离开环境”。 垃圾回收器会在运行的时候给存储在内存中的所有变量加上标记,然后去掉环境中 的变量,以及被环境中变量所引用的变量(闭包)的标记。在完成这些之后仍然存在的 标记就是要删除的变量。 引用计数( reference counting) 在低版本的IE 中经常会发生内存泄漏,很多时候就是因为它采用引用计数的方式进 行垃圾回收。引用计数的策略是跟踪记录每个值被使用的次数。当声明了一个变量并将一个引用类型赋值给该变量的时候, 这个值的引用次数就加1 。如果该变量的值变成了另外一个,则这个值的引用次数就减1 。 当这个值的引用次数变为0 的时候,说明没有变量在使用,这个值没法被访问。 因此, 可以将它占用的空间回收,这样垃圾回收器会在 运行的时候清理引用次数为0 的值占用的空间。 在IE中虽然JavaScript 对象通过标记清除的方式进行垃圾回收,但是BOM 与DOM 对象 是用引用计数的方式回收垃圾的。也就是说, 只要涉及BOM 和DOM , 就会出现循环引用问题。
( 3 )通过以下代码查找节点。 getElernentsByTagNarne() //通过标签名称查找节点 getE l erne 口tsByNarne () //通过元素的name 属性的值查找节点( IE 容错能力较强, 会得到一个数 //组, 其中包括id 等于name 值的节点) getElernentByid() //通过元素 Id 查找节点, 具有唯一性
15、哪些操作会造成内存泄漏? 内存泄漏抬不再拥有或需要任何对象( 数据)之后,它们仍然存在于内存中。 提示:垃圾回收器定期扫描对象,并计算引用了每个对象的其他对象的数量。如果 一个对象的引用数量为0 (没有其他对象引用过该对象),或对该对象的唯一引用是循环的,那么该对象占用的内存立即被回收。 如果setTimeout 的第一个参数使用字符串而非函数,会引发内存泄漏。 闭包、控制台日志、循环(在两个对象彼此引用且彼此保留时,就会产生一个循环) 等会造内存泄漏。
执行hello ()后, hello ()闭包内部的变量会存在,而闭包内部函数的内部变量不会存 在,使得JavaScript 的垃圾回收机制不会收回hello ()占用的资源,因为h e llo ()中内部函数的执行需要依赖hello ()中的变量。
35、如何分配对象属性? 将属性分配给对象的方式与赋值给变量的方式相同。例如,表羊对象的操作值 以下列方式分配给” submit ”:docume nt.form.action = ” submit ” 。
01、JavaSript有哪些垃圾回收机制?
标记清除( mark and sweep ) 这是JavaScr i pt 最常见的垃圾回收方式。当变量进入执行环境的时候,比如在函数 中声明一个变量,垃圾回收器将其标记为“进入环境” 。 当变量离开环境的时候(函数执 行结束),将其标记为“离开环境”。 垃圾回收器会在运行的时候给存储在内存中的所有变量加上标记,然后去掉环境中 的变量,以及被环境中变量所引用的变量(闭包)的标记。在完成这些之后仍然存在的 标记就是要删除的变量。 引用计数( reference counting) 在低版本的IE 中经常会发生内存泄漏,很多时候就是因为它采用引用计数的方式进 行垃圾回收。引用计数的策略是跟踪记录每个值被使用的次数。当声明了一个变量并将一个引用类型赋值给该变量的时候, 这个值的引用次数就加1 。如果该变量的值变成了另外一个,则这个值的引用次数就减1 。 当这个值的引用次数变为0 的时候,说明没有变量在使用,这个值没法被访问。 因此, 可以将它占用的空间回收,这样垃圾回收器会在 运行的时候清理引用次数为0 的值占用的空间。 在IE中虽然JavaScript 对象通过标记清除的方式进行垃圾回收,但是BOM 与DOM 对象 是用引用计数的方式回收垃圾的。也就是说, 只要涉及BOM 和DOM , 就会出现循环引用问题。
var name= [ ” ] ohn ” ]
name unshift (”char lie”);
name unshi ft ( ” ] oseph”,” Jane " ) ;
cons ole log (name );
输出生口下所示。
[ ” joseph H ,” Jane ”,” char lie ”,” john ” ]
( 3 )通过以下代码查找节点。 getElernentsByTagNarne() //通过标签名称查找节点 getE l erne 口tsByNarne () //通过元素的name 属性的值查找节点( IE 容错能力较强, 会得到一个数 //组, 其中包括id 等于name 值的节点) getElernentByid() //通过元素 Id 查找节点, 具有唯一性
15、哪些操作会造成内存泄漏? 内存泄漏抬不再拥有或需要任何对象( 数据)之后,它们仍然存在于内存中。 提示:垃圾回收器定期扫描对象,并计算引用了每个对象的其他对象的数量。如果 一个对象的引用数量为0 (没有其他对象引用过该对象),或对该对象的唯一引用是循环的,那么该对象占用的内存立即被回收。 如果setTimeout 的第一个参数使用字符串而非函数,会引发内存泄漏。 闭包、控制台日志、循环(在两个对象彼此引用且彼此保留时,就会产生一个循环) 等会造内存泄漏。
function GetBytes (str ) {
var len = str . length ;
var bytes = len ;
for (var i=0 ; i<len ; i++) {
if ( str . charCodeAt ( 工) > 255 ) bytes++ ;
}
retu rn bytes ;
}
alert(GetBytes ( ” hello 爱创课堂!” ) );
function hello () { //函数执行完毕, 变量仍然存在
var num = 100 ;
var showResu l t= function ( ) { alert (num ); }
num++ ;
return showResult ;
}
var showResult= hello ();
showResult ( )// 执行结果: 弹出10 1
执行hello ()后, hello ()闭包内部的变量会存在,而闭包内部函数的内部变量不会存 在,使得JavaScript 的垃圾回收机制不会收回hello ()占用的资源,因为h e llo ()中内部函数的执行需要依赖hello ()中的变量。
function read.P.jaxFile (url) {
//创建xhr
var xhr = new XMLHttpRequest() ;
//监听状态
xhr . onreadysta techange = function () {
//监听状态值是4
if (xhr . readyState === 4 晶晶xhr.status === 200) {
console . log(xhr . responseText)
}
}
//打开请求
xhr . open ( ’ GET ', url , true)
// 发送数据
xhr . send(null)
}
function readinputFile (id) {
var file= document . getElementByid(id) . files[O] ;
// 实例化FileReader
var reader= new FileReader ();
// 读取文件
reader . readAsText(file)
// 监听返回
reader . on load = function (data) {
console . log(data , this . result)
}
}
35、如何分配对象属性? 将属性分配给对象的方式与赋值给变量的方式相同。例如,表羊对象的操作值 以下列方式分配给” submit ”:docume nt.form.action = ” submit ” 。
var str = ” aaaabbbccccddfgh ”;
function dealStr (str) {
var obj = {) ;
for (var i = 0 ; i < str. l ength; i++ ) {
var v = str . charAt {i );
if (obj[v] && ob][ v) . value===v ) {
++ob][ v] . count
) else {
obj[v] = {
count : 1 ,
value : v
}
}
return obj ;
}
var obj= dealStr (str) ;
for (key in obj) {
console . log(obj[key) . value + ’ = ’ + obj [key] . count)
}
function trim(str) {
if (str && typeof str == =” s tring ” ){
return str . replace ( /^\ s+ l \s +$/ g , ”” ) ;
//去除前后空白符
}
}
var arrl = ['a ' ];
var arr2 = [ ' b ' ,'c' ] ;
var arr3 = [ 'C ', [ 'd ' ] ,' e ' , undefined , null];
var concat = (function () {
// 去重合并arrl 和arr2
var concat = function (arrl , arr2) {
for (var i = 0, len = arr2 . length J 工< len ; i++) {
~arrl . indexOf (arr2 [ i]) || arrl . push (arr2 [i])
}
// 返回数组去重合并方法
return function () {
var result = [] ;
for (var i = 0 , len = arguments length ; i < len; i++) {
_concat(result , arguments[i])
}
return result
}
})()
执行co ncat (arrl, arr2 , arr3 )后, 会返回[' a ', null, undefined,' e ',[’d '],'c ' , 'b'] 。
prototype . trim = function () {
return this . replace (/^\s+ | \s+$/g ,"" ) ;
var str = ” 12345678901 010 - 12345678 爱创课堂0418 - 1234567 13812345678 ”;
var reg=/(l\d{lO)) I (0\d{2 , 3)\ - \d{7 , 8J)/g ;
alert(str . match(reg) ;
测试“ 1234567890 1 010- 12345678 爱创课堂0418-1234567 13812345678 ”,得到的结果应该是:[ 12345678901 , 010-12345678, 0418-1234567, 13812345678 ] 。
var x=l, y=2 ,
z=
x+y ;
< ! DOCTYPE html>
<html lang="en" >
<head>
<meta charset=" UTF-8" >
<title >爱创课堂一一专业前端技术培训II 学校</ title>
</head>
<body>
<p id= " ickt ">ickt</p>
<script type=” text/javascript ">
function addNode () {
var p = document . createElement ( 'p ’ );
var textNode = document . createTextNode ( ’ 爱创课堂’ );
p . appendChild(textNode) ;
document . getElementByid ( ’ ickt ') . appendCh 工ld(p)
addNode ()
</script>
</body>
</html>
- setTimeout (如nction , delay )函数用于启动在所属延迟之后调用特定功能的定时器。
- setlnterval ( function , delay )函数用于在捉到的延迟中重复执行给定的功能,只有在取消时才停止。
- cl earl nte r飞1 al ( id )函数指示定时器停止。
document . getElementByid (”myText ” ) . style . fontSize = "20? ;
可以通过以下方式改变元素的类。
document . getElementByid (”myText ”) . c l assName = ”anyclass ”;
<script language=" JavaScript" type=" text/javascript ">
< 1-- location . href =" http : //newhost/newpa th/newfile . htm l " ; //-- >
</script>
document . write " I m a " good " boy "
document . write " I m a \ " good \ "boy "
var colors = [ "red ","blue ","green" ] ;
colors . pop ();
// colors : [ " red ","blue" ]
try{
执行代码
) catch (exp ) {
抛出错误提示信息
) finally {
无论try /catch 的结果如何都会执行
}
- Load time errors ,该错误发生于加载网页时,例如出现语法错误等状况,称为加载时间错误,并且会动态生成错误。
- Run time errors , 由于在HTML 语言中滥用命令而导致的错误。
- Logical Errors ,这是由于在具有不同操作的函数上执行了错误逻辑而发生的错误。
- 中括号语法,比如obj [" class "] = 12 。
- 点语法, 比如obj.class= 12 。
var anon=function( ) {
a lert ( ’ I am a nonymous ’);
}
a non();