前端常见重点知识

一、数组的常用方法有哪些?

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;

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,843评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,538评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,187评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,264评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,289评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,231评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,116评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,945评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,367评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,581评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,754评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,458评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,068评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,692评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,842评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,797评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,654评论 2 354

推荐阅读更多精彩内容