一、数组的常用方法有哪些?
1、Array.length
返回或设置一个数组中的元素个数,设置 length 属性的值来截断任何数组
2、Array.from() :
对伪数组或可迭代对象(包括arguments Array,Map,Set,String…)转换成数组对象
3、Array.isArray()
用于确定传递的值是否是一个 Array
4、concat()
方法用于合并两个或多个数组。此方法不会更改现有数组,而是返回一个新数组。
5、copyWithin(target, start, end)
浅复制数组的一部分到同一数组中的另一个位置
6、fill()
用一个固定值填充一个数组中从起始索引到终止索引内的全部元素
7、filter()
创建一个新数组, 其包含通过所提供函数实现的测试的所有元素
8、find()
返回数组中满足提供的测试函数的第一个元素的值
9、findIndex()
返回数组中满足提供的测试函数的第一个元素的值
10、forEach()
方法对数组的每个元素执行一次提供的函数
11、includes()
用来判断一个数组是否包含一个指定的值,如果是,酌情返回 true或 false
12、indexOf()
返回在数组中可以找到一个给定元素的第一个索引,如果不存在,则返回-1
13、join()
返回在数组中可以找到一个给定元素的第一个索引,如果不存在,则返回-1
14、lastIndexOf()
返回指定元素(也即有效的 JavaScript 值或变量)在数组中的最后一个的索引,如果不存在则返回 -1。从数组的后面向前查找
15、pop()
从数组中删除最后一个元素,并返回该元素的值。此方法更改数组的长度
16、push()
将一个或多个元素添加到数组的末尾
17、reduce()
累加器和数组中的每个元素(从左到右)应用一个函数
18、reduceRight()
接受一个函数作为累加器(accumulator)和数组的每个值(从右到左)将其减少为单个值。
19、Reverse
方法将数组中元素的位置颠倒。
20、shift()
从数组中删除第一个元素,并返回该元素的值。此方法更改数组的长度
21、Slice
返回一个从开始到结束(不包括结束)选择的数组的一部分浅拷贝到一个新数组对象
22、sort()
当的位置对数组的元素进行排序,并返回数组。
23、splice()
通过删除现有元素和/或添加新元素来更改一个数组的内容
24、toLocaleString()
返回一个字符串表示数组中的元素。数组中的元素将使用各自的 toLocaleString 方法转成字符串,这些字符串将使用一个特定语言环境的字符串(例如一个逗号 “,”)隔开
25、toString()
返回一个字符串,表示指定的数组及其元素
26、unshift()
将一个或多个元素添加到数组的开头,并返回新数组的长度
二、JavaScript字符串的常用方法有哪些?
1、string.charAt(postion)
charAt方法返回在string中的position位置处的字符。如果position小于0或者大于字符串的长度,返回空字符串。由于js没有字符类型,返回的仍为一个字符串
2、string.concat(string...)
concat方法把其他的字符串连接在一起构造成一个新的字符串。和“+”的作用一致
3、string.indexOf(searchString,position)
indexOf方法在string中查找另一个字符串。如果它被找到,返回第一个匹配字符的位置,否则返回-1.可选参数position可设置为从某个指定位置开始查找。例如判断标签是否含有指定类名。
4、 string.replace(serachValue,replaceValue)
replace方法对string进行查找和替换操作,并返回一个新的字符串。参数searchValue是一个字符串(还可以是正则表达式)的话,只会在第一次出现的地方被替换。
5、string.slice(start,end)
slice方法复制string的一部分来构造一个新的字符串,新的字符串长度等于end-start。
6、string.split(separtor,limit)
split方法把这个string分割成片段来创建一个字符串数组。可选参数limit可以限制被分割的片段数。如果separator是一个空字符,会返回一个单字符的数组,这在需要把一个字符转化为一个数组是经常用到。
7、string.substring(start,end)
substring方法获取字符串的子字符串。作用和slice一样
8、转换为大写和小写
toUpperCase() 把字符串转换为大写 toLowerCase()把字符串转换为小写
9、search()
搜索特定值的字符串,并返回匹配的位置
10、match()
在字符串内检索指定的值,或找到一个或多个正则表达式的匹配,匹配不到返回Null,类似 indexOf() 和 lastIndexOf(),但是它返回指定的值,而不是字符串的位置
三、== 和 ===区别,分别在什么情况使用?
1、等于操作符用两个等于号( == )表示,如果操作数相等,则会返回 true,等于操作符(==)在比较中会先进行类型转换,再确定操作数是否相等。
两个都为简单类型,字符串和布尔值都会转换成数值,再比较;
简单类型与引用类型比较,对象转化成其原始类型的值,再比较;
两个都为引用类型,则比较它们是否指向同一个对象;
null 和 undefined 相等;
存在 NaN 则返回 false;
2、全等操作符由 3 个等于号( === )表示,只有两个操作数在不转换的前提下相等才返回 true。即类型相同,值也需相同。
=是赋值运算符,==是关系运算符; ===是全等运算符
”==”是判断值是否相等,
”===”是判断值及类型是否完全相等。
”==”比较时会进行类型转换,“===”则不会
例如:
alert('55' == 55); //true
alert('55' === 55); //false
四、说说你对闭包的理解?
使用闭包主要是为了设计私有的方法和变量。
闭包的优点是可以避免全局变量的污染;缺点是闭包会常驻内存,增加内存使用量,使用不当很容易造成内存泄漏。在JavaScript中,函数即闭包,只有函数才会产生作用域。
闭包有3个特性:
(1)函数嵌套函数。
(2)在函数内部可以引用外部的参数和变量。
(3)参数和变量不会以垃圾回收机制回收。
五、Javascript本地存储的方式有哪些?区别及应用场景?
1、方式
javaScript本地缓存的方法我们主要讲述以下四种:
cookie
sessionStorage
localStorage
indexedDB
2、区别
关于cookie、sessionStorage、localStorage三者的区别主要如下:
存储大小:cookie数据大小不能超过4k,sessionStorage和localStorage虽然也有存储大小的限制,但比cookie大得多,可以达到5M或更大
有效时间:localStorage存储持久数据,浏览器关闭后数据不丢失除非主动删除数据;sessionStorage数据在当前浏览器窗口关闭后自动删除;cookie设置的cookie过期时间之前一直有效,即使窗口或浏览器关闭
数据与服务器之间的交互方式,cookie的数据会自动的传递到服务器,服务器端也可以写cookie到客户端;sessionStorage和localStorage不会自动把数据发给服务器,仅在本地保存
3、应用场景
标记用户与跟踪用户行为的情况,推荐使用cookie
适合长期保存在本地的数据(令牌),推荐使用localStorage
敏感账号一次性登录,推荐使用sessionStorage
存储大量数据的情况、在线文档(富文本编辑器)保存编辑历史的情况,推荐使用indexedDB
六、css选择器有哪些?优先级?哪些属性可以继承?
1、关于css属性选择器常用的有:
id选择器(#box),选择id为box的元素
类选择器(.one),选择类名为one的所有元素
标签选择器(div),选择标签为div的所有元素
后代选择器(#box div),选择id为box元素内部所有的div元素
子选择器(.one>one_1),选择父元素为.one的所有.one_1的元素
相邻同胞选择器(.one+.two),选择紧接在.one之后的所有.two元素
群组选择器(div,p),选择div、p的所有元素
还有一些使用频率相对没那么多的选择器:伪类选择器
2、CSS选择器的优先级:内联 > ID选择器 > 类选择器 > 标签选择器
3、在css中,继承是指的是给父元素设置一些属性,后代元素会自动拥有这些属性
关于继承属性,可以分成:字体系列属性、文本系列属性、元素可见性、表格布局属性、列表属性、引用、光标属性
继承中比较特殊的几点:a 标签的字体颜色不能被继承、h1-h6标签字体的大下也是不能被继承的
七、css中,有哪些方式可以隐藏页面元素?区别?
1、opacity : 0;本质上是把元素的透明度设为0,这样看起来就把元素元素隐藏了,但是仍然占据着空间,且可以进行交互
2、visiblity : hidden;与上一个方法效果类似, 占据空间,但是不可以交互
3、overflow : hidden ; 这个只是隐藏了元素溢出的部分,但是占据空间且不可交互
4、display : none ; 这是彻底隐藏元素,元素从文档流中消失,既不占用空间,也不影响布局
5、z-index : 999 ; 原理是将层级置于最下面,这样就被其他元素覆盖了,看起来隐藏
6、transform : scale(0,0) ; 平面交换。将元素缩放为0,但是仍然占据空间,但不可交互
7、通过绝对定位移到可视区域外
8、块级元素宽高为0
八、元素水平垂直居中的方法有哪些?如果元素不定宽高呢?
1、第一种: display: flex;
justify-content: center;
align-items: center;
2、第二种: position: absolute;
left:0;
right: 0;
top:0;
bottom: 0;
margin:auto;
3、第三种 : position: absolute;
left:50%;
top:50%;
transform: translate(-50%,-50%);
4、第四种(需要知道元素的宽高): width: 200px;
height: 200px;
position: absolute;
left:50%;
top:50%;
margin-left:-100px;
margin-top:-100px;
5、第六种:grid网格布局: display: grid;
justify-content: center;
align-items: center;
6、第六种:table布局
设置父元素为display:table-cell,子元素设置 display: inline-block。利用vertical和text-align可以让所有的行内块级元素水平垂直居中。
上述方法中,不知道元素宽高大小仍能实现水平垂直居中的方法有:利用定位+margin:auto
利用定位+transform
利用定位+margin:负值
flex布局
grid布局
九、CSS3新增了哪些新特性?
1、边框
css3新增了三个边框属性,分别是:
border-radius:创建圆角边框
box-shadow:为元素添加阴影
border-image:使用图片来绘制边框
box-shadow
设置元素阴影,设置属性如下:
水平阴影
垂直阴影
模糊距离(虚实)
阴影尺寸(影子大小)
阴影颜色
内/外阴影
其中水平阴影和垂直阴影是必须设置的
2、背景
新增了几个关于背景的属性,分别是background-clip、background-origin、background-size和background-break
background-clip
用于确定背景画区,有以下几种可能的属性:
background-clip: border-box; 背景从border开始显示
background-clip: padding-box; 背景从padding开始显示
background-clip: content-box; 背景显content区域开始显示
background-clip: no-clip; 默认属性,等同于border-box
通常情况,背景都是覆盖整个元素的,利用这个属性可以设定背景颜色或图片的覆盖范围
background-origin
当我们设置背景图片时,图片是会以左上角对齐,但是是以border的左上角对齐还是以padding的左上角或者content的左上角对齐? border-origin正是用来设置这个的
background-origin: border-box; 从border开始计算background-position
background-origin: padding-box; 从padding开始计算background-position
background-origin: content-box; 从content开始计算background-position
默认情况是padding-box,即以padding的左上角为原点
background-size
background-size属性常用来调整背景图片的大小,主要用于设定图片本身。有以下可能的属性:
background-size: contain; 缩小图片以适合元素(维持像素长宽比)
background-size: cover; 扩展元素以填补元素(维持像素长宽比)
background-size: 100px 100px; 缩小图片至指定的大小
background-size: 50% 100%; 缩小图片至指定的大小,百分比是相对包 含元素的尺寸
background-break
元素可以被分成几个独立的盒子(如使内联元素span跨越多行),background-break 属性用来控制背景怎样在这些不同的盒子中显示
background-break: continuous; 默认值。忽略盒之间的距离(也就是像元素没有分成多个盒子,依然是一个整体一样)
background-break: bounding-box; 把盒之间的距离计算在内;
background-break: each-box; 为每个盒子单独重绘背景
3、文字
word-wrap
语法:word-wrap: normal|break-word
normal:使用浏览器默认的换行
break-all:允许在单词内换行
text-overflow
text-overflow设置或检索当当前行超过指定容器的边界时如何显示,属性有两个值选择:
clip:修剪文本
ellipsis:显示省略符号来代表被修剪的文本
text-shadow
text-shadow可向文本应用阴影。能够规定水平阴影、垂直阴影、模糊距离,以及阴影的颜色
text-decoration
CSS3里面开始支持对文字的更深层次的渲染,具体有三个属性可供设置:
text-fill-color: 设置文字内部填充颜色
text-stroke-color: 设置文字边界填充颜色
text-stroke-width: 设置文字边界宽度
4、颜色
css3新增了新的颜色表示方式rgba与hsla
rgba分为两部分,rgb为颜色值,a为透明度
hala分为四部分,h为色相,s为饱和度,l为亮度,a为透明度
5、transition 过渡
transition属性可以被指定为一个或多个CSS属性的过渡效果,多个属性之间用逗号进行分隔,必须规定两项内容:
过度效果
持续时间
语法如下:
transition: CSS属性,花费时间,效果曲线(默认ease),延迟时间(默认0)
上面为简写模式,也可以分开写各个属性
transition-property: width;
transition-duration: 1s;
transition-timing-function: linear;
transition-delay: 2s;
6、transform 转换
transform属性允许你旋转,缩放,倾斜或平移给定元素
transform-origin:转换元素的位置(围绕那个点进行转换),默认值为(x,y,z):(50%,50%,0)
使用方式:
transform: translate(120px, 50%):位移
transform: scale(2, 0.5):缩放
transform: rotate(0.5turn):旋转
transform: skew(30deg, 20deg):倾斜
7、animation 动画
动画这个平常用的也很多,主要是做一个预设的动画。和一些页面交互的动画效果,结果和过渡应该一样,让页面不会那么生硬
animation也有很多的属性
animation-name:动画名称
animation-duration:动画持续时间
animation-timing-function:动画时间函数
animation-delay:动画延迟时间
animation-iteration-count:动画执行次数,可以设置为一个整数,也可以设置为infinite,意思是无限循环
animation-direction:动画执行方向
animation-paly-state:动画播放状态
animation-fill-mode:动画填充模式
8、渐变
颜色渐变是指在两个颜色之间平稳的过渡,css3渐变包括
linear-gradient:线性渐变
background-image: linear-gradient(direction, color-stop1, color-stop2, ...);
radial-gradient:径向渐变
linear-gradient(0deg, red, green);
9、其他
关于css3其他的新特性还包括flex弹性布局、Grid栅格布局,除此之外,还包括多列布局、媒体查询、混合模式等等......
十、谈谈 JavaScript 中的类型转换机制
JS中有六种简单数据类型:undefined、null、boolean、string、number、symbol,以及引用类型:object
常见的类型转换有:
强制转换(显示转换)
自动转换(隐式转换)
显示转换,即我们很清楚可以看到这里发生了类型的转变,常见的方法有:
Number()
parseInt()
String()
Boolean()
1、Number()
将任意类型的值转化为数值
Number转换的时候是很严格的,只要有一个字符无法转成数值,整个字符串就会被转为NaN
2、parseInt()
parseInt相比Number,就没那么严格了,parseInt函数逐个解析字符,遇到不能转换的字符就停下来
3、String()
可以将任意类型的值转化成字符串
4、Boolean()
可以将任意类型的值转为布尔值,
隐式转换
在隐式转换中,我们可能最大的疑惑是 :何时发生隐式转换?
我们这里可以归纳为两种情况发生隐式转换的场景:
比较运算(==、!=、>、<)、if、while需要布尔值地方
算术运算(+、-、*、/、%)
除了上面的场景,还要求运算符两边的操作数不是同一类型
自动转换为布尔值
在需要布尔值的地方,就会将非布尔值的参数自动转为布尔值,系统内部会调用Boolean函数
可以得出个小结:
undefined
null
false
+0
-0
NaN
""
除了上面几种会被转化成false,其他都被转化成true
自动转换成字符串
遇到预期为字符串的地方,就会将非字符串的值自动转为字符串
具体规则是:先将复合类型的值转为原始类型的值,再将原始类型的值转为字符串
常发生在+运算中,一旦存在字符串,则会进行字符串拼接操作
自动转换成数值
除了+有可能把运算子转为字符串,其他运算符都会把运算子自动转成数值
null转为数值时,值为0 。undefined转为数值时,值为NaN
1、JavaScript中如何检测一个变量是一个String类型?请写出函数实现
方法1、
function isString(obj){
return typeof(obj) === "string"? true: false;
// returntypeof obj === "string"? true: false;
}
方法2、
function isString(obj){
return obj.constructor === String? true: false;
}
方法3、
function isString(obj){
return Object.prototype.toString.call(obj) === "[object String]"?true:false;
}
如:
var isstring = isString('xiaoming');
console.log(isstring); // true
2、请用js去除字符串空格?
方法一:使用replace正则匹配的方法
去除所有空格:str = str.replace(/\s*/g,"");
去除两头空格:str = str.replace(/^\s*|\s*$/g,"");
去除左空格:str = str.replace( /^\s*/,“”);
去除右空格:str = str.replace(/(\s*$)/g, "");
str为要去除空格的字符串,实例如下:
var str = " 23 23 ";
var str2 = str.replace(/\s*/g,"");
console.log(str2); // 2323
方法二:使用str.trim()方法
str.trim()局限性:无法去除中间的空格,实例如下:
var str = " xiao ming ";
var str2 = str.trim();
console.log(str2); //xiao ming
同理,str.trimLeft(),str.trimRight()分别用于去除字符串左右空格。
方法三:使用jquery,$.trim(str)方法
$.trim(str)局限性:无法去除中间的空格,实例如下:
var str = " xiao ming ";
var str2 = $.trim(str)
console.log(str2); // xiao ming
实例如下:
function showWindowHref(){
var sHref = window.location.href;
var args = sHref.split('?');
if(args[0] == sHref){
return "";
}
var arr = args[1].split('&');
var obj = {};
for(var i = 0;i< arr.length;i++){
var arg = arr[i].split('=');
obj[arg[0]] = arg[1];
}
return obj;
}
var href = showWindowHref(); // obj
console.log(href['name']); // xiaoming
3、js 字符串操作函数
concat()– 将两个或多个字符的文本组合起来,返回一个新的字符串。
indexOf()– 返回字符串中一个子串第一处出现的索引。如果没有匹配项,返回-1。
charAt()– 返回指定位置的字符。
lastIndexOf()– 返回字符串中一个子串最后一处出现的索引,如果没有匹配项,返回-1。
match()– 检查一个字符串是否匹配一个正则表达式。
substr()函数--返回从string的startPos位置,长度为length的字符串
substring()– 返回字符串的一个子串。传入参数是起始位置和结束位置。
slice()– 提取字符串的一部分,并返回一个新字符串。
replace()– 用来查找匹配一个正则表达式的字符串,然后使用新字符串代替匹配的字符串。
search()– 执行一个正则表达式匹配查找。如果查找成功,返回字符串中匹配的索引值。否则返回-1。
split()– 通过将字符串划分成子串,将一个字符串做成一个字符串数组。
length– 返回字符串的长度,所谓字符串的长度是指其包含的字符的个数。
toLowerCase()– 将整个字符串转成小写字母。
toUpperCase()– 将整个字符串转成大写字母。
4、怎样添加、移除、移动、复制、创建和查找节点?
1)创建新节点
createDocumentFragment() //创建一个DOM片段
createElement() //创建一个具体的元素
createTextNode() //创建一个文本节点
2)添加、移除、替换、插入
appendChild() //添加
removeChild() //移除
replaceChild() //替换
insertBefore() //插入
3)查找
getElementsByTagName() //通过标签名称
getElementsByName() //通过元素的Name属性的值
getElementById() //通过元素Id,唯一性
5、写出3个使用this的典型应用
1)、在html元素事件属性中使用,如:
<input type=”button” onclick=”showInfo(this);” value=”点击一下”/>
2)、构造函数
function Animal(name, color) {
this.name = name;
this.color = color;
}
3)、input点击,获取值
<input type="button" id="text" value="点击一下" />
<script type="text/javascript">
var btn = document.getElementById("text");
btn.onclick = function() {
alert(this.value); //此处的this是按钮元素
}
</script>
4)、apply()/call()求数组最值
var numbers = [5, 458 , 120 , -215 ];
var maxInNumbers = Math.max.apply(this, numbers);
console.log(maxInNumbers); // 458
var maxInNumbers = Math.max.call(this,5, 458 , 120 , -215);
console.log(maxInNumbers); // 458
6、比较typeof与instanceof?
相同点:JavaScript中typeof和instanceof常用来判断一个变量是否为空,或者是什么类型的。
typeof的定义和用法:返回值是一个字符串,用来说明变量的数据类型。
细节:
1)、typeof一般只能返回如下几个结果:
number,boolean,string,function,object,undefined。
2)、typeof来获取一个变量是否存在,如if(typeof a!="undefined"){alert("ok")},而不要去使用if(a)因为如果a不存在(未声明)则会出错。
3)、对于Array,Null等特殊对象使用typeof一律返回object,这正是typeof的局限性。
Instanceof定义和用法:instanceof用于判断一个变量是否属于某个对象的实例。
实例演示:
a instanceof b?alert("true"):alert("false"); //a是b的实例?真:假
var a = new Array();
alert(a instanceof Array); // true
alert(a instanceof Object) // true
如上,会返回true,同时alert(a instanceof Object)也会返回true;这是因为Array是object 的子类。
function test(){};
var a = new test();
alert(a instanceof test) // true
细节:
(1)、如下,得到的结果为‘N’,这里的instanceof测试的object是指js语法中的object,不是指dom模型对象。
if (window instanceof Object){ alert('Y')} else { alert('N');} // 'N'
7、如何理解闭包?
1)定义和用法:当一个函数的返回值是另外一个函数,而返回的那个函数如果调用了其父函数内部的其它变量,如果返回的这个函数在外部被执行,就产生了闭包。
2)表现形式:使函数外部能够调用函数内部定义的变量。
3)实例如下:
(1)、根据作用域链的规则,底层作用域没有声明的变量,会向上一级找,找到就返回,没找到就一直找,直到window的变量,没有就返回undefined。这里明显count是函数内部的flag2的那个count。
var count=10; //全局作用域 标记为flag1
function add(){
var count=0; //函数全局作用域 标记为flag2
return function(){
count+=1; //函数的内部作用域
alert(count);
}
}
var s = add()
s();//输出1
s();//输出2
4)变量的作用域
要理解闭包,首先必须理解Javascript特殊的变量作用域。
变量的作用域分类:全局变量和局部变量。
特点:
1、函数内部可以读取函数外部的全局变量,在函数外部无法读取函数内的局部变量。
2、函数内部声明变量的时候,一定要使用var命令。如果不用的话,你实际上声明了一个全局变量!
5)使用闭包的注意点
(1)滥用闭包,会造成内存泄漏:由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
(2)会改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。
8、谈谈垃圾回收机制方式及内存管理
回收机制方式
1、定义和用法:垃圾回收机制(GC:Garbage Collection),执行环境负责管理代码执行过程中使用的内存。
2、原理:垃圾收集器会定期(周期性)找出那些不在继续使用的变量,然后释放其内存。但是这个过程不是实时的,因为其开销比较大,所以垃圾回收器会按照固定的时间间隔周期性的执行。
3、实例如下:
function fn1() {
var obj = {name: 'hanzichi', age: 10};
}
function fn2() {
var obj = {name:'hanzichi', age: 10};
return obj;
}
var a = fn1();
var b = fn2();
fn1中定义的obj为局部变量,而当调用结束后,出了fn1的环境,那么该块内存会被js引擎中的垃圾回收器自动释放;在fn2被调用的过程中,返回的对象被全局变量b所指向,所以该块内存并不会被释放。
4、垃圾回收策略:标记清除(较为常用)和引用计数。
标记清除:
定义和用法:当变量进入环境时,将变量标记"进入环境",当变量离开环境时,标记为:"离开环境"。某一个时刻,垃圾回收器会过滤掉环境中的变量,以及被环境变量引用的变量,剩下的就是被视为准备回收的变量。
到目前为止,IE、Firefox、Opera、Chrome、Safari的js实现使用的都是标记清除的垃圾回收策略或类似的策略,只不过垃圾收集的时间间隔互不相同。
引用计数:
定义和用法:引用计数是跟踪记录每个值被引用的次数。
基本原理:就是变量的引用次数,被引用一次则加1,当这个引用计数为0时,被视为准备回收的对象。
内存管理
1、什么时候触发垃圾回收?
垃圾回收器周期性运行,如果分配的内存非常多,那么回收工作也会很艰巨,确定垃圾回收时间间隔就变成了一个值得思考的问题。
IE6的垃圾回收是根据内存分配量运行的,当环境中的变量,对象,字符串达到一定数量时触发垃圾回收。垃圾回收器一直处于工作状态,严重影响浏览器性能。
IE7中,垃圾回收器会根据内存分配量与程序占用内存的比例进行动态调整,开始回收工作。
2、合理的GC方案:(1)、遍历所有可访问的对象;(2)、回收已不可访问的对象。
3、GC缺陷:(1)、停止响应其他操作。
4、GC优化策略:(1)、分代回收(Generation GC);(2)、增量GC。
9、开发过程中遇到的内存泄露情况,如何解决的?
1、定义和用法:
内存泄露是指一块被分配的内存既不能使用,又不能回收,直到浏览器进程结束。C#和Java等语言采用了自动垃圾回收方法管理内存,几乎不会发生内存泄露。我们知道,浏览器中也是采用自动垃圾回收方法管理内存,但由于浏览器垃圾回收方法有bug,会产生内存泄露。
2、内存泄露的几种情况:
(1)、当页面中元素被移除或替换时,若元素绑定的事件仍没被移除,在IE中不会作出恰当处理,此时要先手工移除事件,不然会存在内存泄露。
实例如下:
<div id="myDiv">
<input type="button" value="Click me" id="myBtn">
</div>
<script type="text/javascript">
var btn = document.getElementById("myBtn");
btn.onclick = function(){
document.getElementById("myDiv").innerHTML = "Processing...";
}
</script>
解决方法如下:
<div id="myDiv">
<input type="button" value="Click me" id="myBtn">
</div>
<script type="text/javascript">
var btn = document.getElementById("myBtn");
btn.onclick = function(){
btn.onclick = null;
document.getElementById("myDiv").innerHTML = "Processing...";
}
</script>
(2)、由于是函数内定义函数,并且内部函数--事件回调的引用外暴了,形成了闭包。闭包可以维持函数内局部变量,使其得不到释放。
实例如下:
function bindEvent(){
var obj=document.createElement("XXX");
obj.onclick=function(){
//Even if it's a empty function
}
}
解决方法如下:
function bindEvent(){
var obj=document.createElement("XXX");
obj.onclick=function(){
//Even if it's a empty function
}
obj=null;
}