web前端 -- JavaScript总结

JavaScript 简介

js全称JavaScript,它是一门具有面向对象能力的,在浏览器上执行的,客户端脚本语言。

JavaScript 引入

放在 <script>标签之间

<script>

  alert(“hello world !”);

</script>

放在外部js文件中

<script src=”a.js”></script>

script标签的几个属性

charset:可选。编码方式。可忽略。

src:可选。包含要执行代码的外部文件。

type,可选,type="text/javascript",可忽略

JavaScript 输出

window.alert():弹出警告框。

document.write():将内容写到 HTML 文档中,(如果在文档已完成加载后执行 document.write,整个 HTML 页面将被覆盖)。

innerHTML:写入到 HTML 元素。

console.log():写入到浏览器的控制台。

JavaScript 变量

用于存储数据值。

1、使用 var 关键词来声明变量。

2、= 号用于为变量赋值。

先定义,后赋值

var a;

a=7;

定义的同时赋值

var b=8;

JavaScript 变量命名规则

1、第一字符必须是:字母、下划线 、$中的一种。

2、其他字符可以是字母、下划线、$或数字。

3、不能把关键字、保留字,作为标识符。

4、变量名区分大小写。

5、推荐驼峰命名法,首字母小写。

6、关键字有true,false,name,break,catch,continue,for,function,return,switch,throw,try,var,while,if,in,do,else,new,case,default,delete,finally,instanceof,typeof,throw,this,void,with等等。

变量的默认值undefined。

同时定义多个变量,变量间用逗号隔开:var a=7,b,c;

JavaScript 数据类型

简单数据类型:字符串(String)、数字(Number)、布尔(Boolean)、空(Null)、未定义(Undefined)、Symbol 。(Symbol 是 ES6 引入了一种新的原始数据类型,表示独一无二的值)

复杂数据类型:对象(Object)、数组(Array)、函数(Function)。

1、String:字符串

表示方法:要用双引号,或者单引号括起来;

\n:换行,\\:单斜杠,\":双引号,\':单引号

2、Number:数字

整型(整数);

浮点型(小数):(八进制:0开头,十六进制:0x开头,);若数字小于1大于0,可省略前面的0;

科学计数(e);

保留小数:toFixed(2),会四舍五入;

非数值(NAN):可以通过Number.NaN得到NaN值,例(0/0);任何与NaN进行运算的结果均为NaN;NaN与自身不相等(NaN不与任何值相等)。根据 isNaN()函数判断一个值是否为:NaN

3、Boolean:布尔

4、Null:空

5、Undefined:未定义

6、Object:对象

有两个值(字面量):true:真,false:假,区分大小写。

var a = {};

====================追加属性

var a={};

a.age=3;

||等同于

a["age"]=3;

||等同于

var abc="age";

a[abc]=3;

====================追加方法

a.eat=function (){}

====================删除对象属性,方法

语法:delete 对象名.属性名 delete 对象名.方法名

var obj={

  “age”:34,

  run:function(){}

}

delete obj.age;
================遍历对象的所有属性
语法:for in

for(var key in obj){

}

7、Array:数组

8、Function:函数

JavaScript 传值与传址的区别

传值:针对的是简单数据类型,就是把字面量完整的复制一份传过去,拷贝的值和原始的值是完全独立、互不影响的。

传址:在赋值过程中,变量实际上存储的是数据的地址(对数据的引用),而不是原始数据或者是数据的拷贝。如果值通过一个地址发生了改变,这个改变也会通过原始地址表现出来。

JavaScript 数据类型转换

1、字符串转数字:

Number("字符串");

parseFloat("字符串"):浮点数。

parseInt("字符串"):整数。

只包含数值的字符串,会直接转成成十进制数值,如果包含前导0,即自动去掉;

如果字符串是空,那么直接转成成0;

如果不是以上字符串类型,则返回NaN;

2、数字转字符串:

num.toString();

String(num);

num+ " " 或 num+ ' '

3、布尔转数字:

Number(true):1,Number(false):0;

4、数字转布尔:

0: false,非0:true;

JavaScript 作用域

JavaScript 变量生命周期在它声明时初始化。如果变量在函数内没有声明(没有使用 var 关键字),该变量为全局变量。

局部变量:函数参数只在函数内起作用,函数内使用 var 声明的变量只能在函数内容访问,在函数执行完毕后销毁。

全局变量:变量在函数外定义,在 JavaScript 程序的任何地方都可以访问,在页面关闭后销毁。

JavaScript 数组方法

arr.concat():连接两个或更多的数组,连接后的数组。

arr.map():返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值。

arr.every():检测数值元素的每个元素是否都符合条件。

arr.forEach():用于调用数组的每个元素,并将元素传递给回调函数。

arr.join():把数组的所有元素放入一个字符串。

arr.indexOf():搜索数组中的元素,并返回它所在的位置。

arr.lastIndexOf():搜索数组中的元素,并返回它最后出现的位置。

arr.pop():删除数组的最后一个元素并返回删除的元素。

arr.push():向数组的末尾添加一个或更多元素,并返回新的长度。

arr.shift():删除并返回数组的第一个元素。

arr.unshift():向数组的开头添加一个或更多元素,并返回新的长度。

arr.split():选取数组的一部分,并返回一个新数组。

arr.splice:从数组中添加或删除元素。

arr.toString():把数组转换为字符串,并返回结果。

arr.valueOf():返回数组对象的原始值。

JavaScript 字符串方法

str.concat():连接两个或多个字符串,返回连接后的字符串。

str.charAt():返回指定索引位置的字符。

str.indexOf():返回字符串中检索指定字符第一次出现的位置,如果没有返回-1。

str.lastIndexOf():返回字符串中检索指定字符最后一次出现的位置。

str.splice():提取字符串的片断,并在新的字符串中返回被提取的部分。

str.split():把字符串分割为子字符串数组。

str.substr():从起始索引号提取字符串中指定数目的字符,str.substr(from,length)。

str.substring():提取字符串中两个指定的索引号之间的字符,str.substring(from,to)。

str.toUpperCase():把字符串转换为大写。

str.toLowerCase():把字符串转换为小写。

str.trim(): 移除字符串首尾空白。

str.toString():返回字符串对象值。

str.valueOf():返回某个字符串对象的原始值。

JavaScript 运算符优先级

递增++和递减--

1、在没有赋值操作,前置和后置是一样的。

2、在赋值时,如果运算符前置,那么会先累加或累减再赋值,

3、如果是后置运算符,则先赋值再累加或累减。

从高到低排列:

一元运算符:++(自增),--(自减),!(逻辑非)

算术运算符:*(乘),/(除),+(加),-(减),%(取余)

比较(关系)运算符:==(等于),!=(不等于),===(全等于),!==(不全等于),>=(大于等于),<=(小于等于)

逻辑运算符:&&(逻辑与),||(逻辑或)

赋值运算符:=,+=,-=,*=,/=,%=

复杂的运算符,不要依靠优先级,应该添加小括号表明优先级

JavaScript 条件语句

if 语句:

if (condition)
{
    当条件为 true 时执行的代码
}

if...else 语句:

if (condition)
{
    当条件为 true 时执行的代码
}
else
{
    当条件不为 true 时执行的代码
}

if...else if....else 语句:

if (condition1)
{
    当条件 1 为 true 时执行的代码
}
else if (condition2)
{
    当条件 2 为 true 时执行的代码
}
else
{
  当条件 1 和 条件 2 都不为 true 时执行的代码
}

switch 语句:

break 语句用于跳出循环,只能用在循环或 switch 中。

continue 用于跳过本次循环执行下次循环,只能用在循环中。

switch(n)
{
    case 1:
        执行代码块 1
        break;
    case 2:
        执行代码块 2
        break;
    default:
        与 case 1 和 case 2 不同时执行的代码
}

JavaScript 循环语句

for 循环:

for (语句 1; 语句 2; 语句 3)
{
    被执行的代码块
}

for/in 语句循环遍历对象的属性:

 for...in 循环中的代码块将针对每个属性执行一次

for (属性名 in 对象)
{
    被执行的代码块
}

while 循环:

while (条件)
{
    需要执行的代码
}

do/while 循环:

在检查条件是否为真之前执行一次代码块,然后如果条件为真的话,就会重复这个循环。

do
{
    需要执行的代码
}
while (条件);

JavaScript typeof操作符

typeof string:string。

typeof number:number。

typeof NAN:number。

typeof boolean:boolean。

typeof object:object。

typeof array:object。

typeof null:object。

typeof undefined:undefined。

typeof function:function。

JavaScript 正则表达式

语法:/正则表达式主体/修饰符(可选)

修饰符:i:不区分大小写,g:全局匹配,m:多行匹配。

正则表达式模式:[abc]:查找方括号之间的任何字符,[0-9]:查找任何从 0 至 9 的数字,(x|y):查找任何以 | 分隔的选项。

search():检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串,并返回子串的起始位置。

replace():在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串。

test():检测一个字符串是否匹配某个模式,如果字符串中含有匹配的文本,则返回 true,否则返回 false。

exec() :检索字符串的匹配。该函数返回一个数组,其中存放匹配的结果。如果未找到匹配,则返回值为 null。

JavaScript Math对象

Math.sin(x) :正弦。

Math.cos(x) :余弦。

Math.tan(x) :正切。

Math.sqrt(x) :平方根。

Math.asin(x) :反正弦值。

Math.acos(x) :反余弦值。

Math.atan(x):反正切值。

Math.max(a,b,c,... ) :最高值。

Math.min(a,b,c,... ) :最低值。

Math.abs(x) :绝对值。

Math.random() :随机数。

Math.round(x):四舍五入。

Math.ceil(x) :上取舍。

Math.floor(x):下取舍。

JavaScript 日期Date() 

var d = new Date();

d.getDate():日期 (1 ~ 31)。

d.getDay():某一天 (0 ~ 6)。

d.getFullYear():四位数字返回年份。

d.getMonth():月份 (0 ~ 11),月份是从0开始的。

d.getHours():小时 (0 ~ 23)。

d.getMinutes():分钟 (0 ~ 59)。

d.getSeconds():秒数 (0 ~ 59)。

d.getMilliseconds():毫秒(0 ~ 999)。

d.getTime():1970 年 1 月 1 日至今的毫秒数。

d.parse():1970年1月1日午夜到指定日期(字符串)的毫秒数。

获取时间戳:

var d = new  Date();

var timestamp = Date.parse(d);//毫秒值被转化为000 ,不准确!

var timestamp = d.valueOf();

var timestamp = d.getTime();

JavaScript 错误

try 和 catch:

try {
    ...    //异常的抛出,测试代码块的错误。
} catch(e) {
    ...    //异常的捕获与处理,处理错误。
} finally {
    ...    //结束处理,不论之前的 try 和 catch 中是否产生异常都会执行该代码块。
}

throw 语句:允许我们创建自定义错误

try {
    ...    //异常的抛出
    if(x == '') throw "值为空"
} catch(e) {
    ...    //异常的捕获与处理
} finally {
    ...    //结束处理
}

JavaScript 调试

1、console.log() ;

2、debugger ;

JavaScript 变量提升

1、正常情况下,变量应该先定义、后使用。

2、若先使用后定义,就会触发变量提升,变量会被提到最前面声明,然后再在正常的位置处赋值。

3、使用变量必须声明变量 。                                                

Dom.innerHTML(a);

Var a=9;

|| 浏览器的兼容性会把上面的错误代码转换为下面无错的

Var a;

Dom.innerHTML(a);

a=9;

JavaScript 严格模式(use strict)

"use strict" 的目的是指定代码在严格条件下执行。在脚本或函数的头部添加 "use strict"。

优点:消除代码运行的一些不安全之处,保证代码运行的安全;提高编译器效率,增加运行速度;为未来新版本的Javascript做好铺垫。

限制:变量不声明不可使用;函数参数名不许重复;数字不许使用8进制。

JavaScript 表单验证

disabled:禁用。

max:最大值。

min:最小值。

required:必填。

pattern:正则表达式。

readonly:只读。

JavaScript this关键字

1、在方法中,this 表示该方法所属的对象。

2、如果单独使用,this 表示全局对象。

3、在函数中,this 表示全局对象。

4、在函数中,在严格模式下,this 是未定义的(undefined)。

5、在事件中,this 表示接收事件的元素。

6、类似 call() 和 apply() 方法可以将 this 引用到任何对象。

1、call函数
函数是特殊的对象,每个函数都有一个call方法,它可以改变函数内this的指向。
语法:对象1.方法1.call(对象2,参数1,参数2,参数3...)
执行上面的语句后,方法1中的this会指向对象2
var cat = {
	name:"加菲喵",
	sayName(a,b){
		console.log("i am:"+this.name);
		console.log(a,b);
	}
}
var dog = {
	name:"欧弟",
	sayName(){
		console.log("我是:"+this.name);
	}
}
cat.sayName.call(dog,5,7);
2、apply函数
applay功能和call一样,区别是参数的传递方式需要用数组
cat.sayName.apply(dog,[5,7]);
3、bind函数
bind永久改变函数内this的指向,无论进行什么操作,指向都不变。
语法:var 函数1=函数2.bind(对象1)
执行上面的代码之后,函数1中的this永远指向对象1

JavaScript let 和 const

let 和 const 属于es6语法,都是块级元素。

let 声明的变量只在 let 命令所在的代码块内有效,不能重复定义。

const 声明一个只读的常量,一旦声明,常量的值就不能改变。

JavaScript JSON

JSON 英文全称 JavaScript Object Notation,是一种轻量级的数据交换格式,是独立的语言易于理解。

JSON.parse():字符串转换为对象。

JSON.stringify(): 对象转换为 JSON 字符串。

javascript void

href="#"与href="javascript:void(0)"的区别

# 包含了一个位置信息,默认的锚是#top 也就是网页的上端。

而javascript:void(0), 仅仅表示一个死链接。

在页面很长的时候会使用 # 来定位页面的具体位置,格式为:# + id

如果你要定义一个死链接请使用 javascript:void(0) 。

JavaScript Promise

 eval()函数将字符串作为js代码来执行;

resolve 代表一切正常,reject 是出现异常时所调用的:

new Promise(function (resolve, reject) {
    // 要做的事情...
});

JavaScript 箭头函数

1、多个参数

(参数1,参数2,...,参数n) => {函数声明} 

2、当只有一个参数时,圆括号是可选的:

(单一参数) => {函数声明}  或  单一参数 => {函数声明}

3、没有参数的函数应该写成一对圆括号:

() => {函数声明}

JavaScript 函数参数

arguments,是存放函数所有参数的数组;在函数内,可以通过arguments对象来接收传递进来的参数。

参数默认值为undefined,若调用的时候实参传入不够,那么此参数就按照默认值处理;若传入的实参过多,多余的实参会被忽略。

JavaScript 闭包

闭包其实就是一个函数,它可以读取函数内部的局部变量,实现闭包的过程如下:

父子函数嵌套时,子函数作为返回值返回,当子函数在父函数外部执行的时候,可以访问到父函数内部的变量。

优点:函数执行完毕,保存它的局部变量;在函数外部读取函数内部的变量。

缺点:闭包会导致父函数内部的变量不能及时释放,容易引起内存泄漏。

JavaScript HTML DOM HTML

创建标签元素:document.createElement("元素名");

创建文本内容:document.createTextNode("文本内容");

获取当前节点的父节点:document.parentNode();

1、通过 id 查找:document.getElementById("id名");

2、通过标签名查找:document.getElementById("id名").getElementsByTagName("标签名");

3、通过name名查找:document.getElementsByName(“name名”);

4、通过类名查找:document.getElementsByClassName("类名");

5、通过 innerHTML 改变:document.getElementById("id名").innerHTML= 新的HTML;

6、通过 attribute 改变:document.getElementById("id名").attribute = 新属性值;

7、通过 appendChild 追加:document.getElementById("id名").appendChild("追加内容");

8、通过 insertBefore 追加:document.getElementById("id名").insertBefore("追加内容");

9、通过 removeChild 移除:document.getElementById("id名").removeChild("移除内容");

10、通过 replaceChild 替换:document.getElementById("id名").replaceChild("替换内容");

11、获取输入框的值:document.getElementById("id名").value;

JavaScript HTML DOM CSS

1、通过 style 改变样式:

document.getElementById("id名").style.css属性名= "css属性值";

document.getElementById("id名").style[css属性名]=" css属性值";

2、setAttribute:

元素dom.setAttribute("style","属性名: 属性值;。。。");

3、设置cssText:

元素dom.style.cssText="属性名: 属性值;。。。";

4、修改className (推荐):

元素dom.className = “class名”;

JavaScript HTML DOM 事件

1、鼠标事件

onclick:鼠标单击。

ondblclick:鼠标双击。

onmouseover:鼠标移入(触发一次)。

onmouseout:鼠标移出。

onmousemove:鼠标在元素上移动(持续触发)。

oncontextmenu:鼠标右键。

onmousedown:鼠标按下。

onmouseup:鼠标松开。

2、表单事件

onfocus:表单获取焦点。

onblur:表单失去焦点。

onchange:表单改变,并失去焦点(text,textarea)。

3、键盘事件

onkeydown:键盘被按下,若不松手,会持续触发。

onkeyup:键盘弹起后触发。

4、其它事件

onload:进入页面时执行。

onunload:离开页面时执行。

JavaScript HTML DOM EventListener

addEventListener():向指定元素添加事件,允许向同一个元素添加多个事件,同个元素添加不同类型的事件。

语法:element.addEventListener(事件,函数,useCapture)。

useCapture:可选的,默认为false冒泡,true为捕捉。

removeEventListener():移除事件的监听。

语法:element.removeEventListener(事件,函数)。

JavaScript 定时器

setTimeout():定时器,执行1次。clearTimeout():取消定时器

语法:setTimeout(“要执行的代码”, 等待的毫秒数) 或 setTimeout(函数名||匿名函数, 等待的毫秒数)。

setInterval():定时器,不停的执行。clearInterval():取消定时器

语法:setInterval(“要执行的代码”, 等待的毫秒数) 或 setInterval(函数名||匿名函数, 等待的毫秒数)。

JavaScript 操作dom(元素属性)

读取dom:id.getAttribute(“属性名”);

修改dom:id.setAttribute(“属性名”,”属性值”);

移除dom:removeAttribute(“属性名”);

注意:IE6及更低版本不支持removeAttribute()方法。

JavaScript 事件冒泡

 当父子容器发生嵌套,父子容器都添加了点击事件,事件将先触发子容器,再触发父容器。

阻止事件冒泡,指的是只触发子容器,不再向父容器触发。

event.stopPropagation();

event.stopImmediatePropagation();

JavaScript 事件委托

事件委托,也叫事件代理,指的是,利用js的事件冒泡机制,通过事件的target属性,使用一个事件,管理一系列事件。

target:指的是触发事件的目标元素。

currentTarget:currentTarget 事件绑定的元素。

JavaScript 常用的Window方法

alert():警告框。

confirm():确认框。

prompt:输入提示框。

print:打印。

JavaScript history

history.back():后退。

history.forward():前进。

history.go(num):向前或向后num步。

history.go(0):刷新当前页面。

JavaScript dom尺寸与鼠标坐标

1 相对于父元素偏移坐标:

event.offsetX:以事件发生者左上顶角为原点,x 轴方向偏移量。

event.offsetY:以事件发生者左上顶角为原点,y 轴方向偏移量。

注意:不兼容 Mozilla(火狐)

2 相对于文档偏移坐标:

event.pageX :以文档窗口左上顶角为原点,x 轴方向偏移量。

event.pageY:以文档窗口左上顶角为原点,y 轴方向偏移量。

JavaScript 存储

1、localStorage:

localStorage可以将数据永久存储到本地,除非主动删除,或者清除浏览器缓存,空间大小:5M,只能存储字符串。

兼容性:

在IE8以上的IE版本才支持localStorage这个属性。

localStorage属于永久性存储,如果存储内容多的话会消耗内存空间,会导致页面变卡。

注:遵循同源策略,只能操作当前域下的数据(协议,域名,端口号一致)

存储写入:localStorage.setItem(key,data);

存储读取:localStorage.getItem(key);若找不到,就返回null。

删除数据:删除指定数据:localStorage.removeItem("x1");  或  删除所有数据:localStorage.clear();

2、sessionStorage:

sessionStorage 与 localStorage 的语法一样,但保存数据的生命周期与 localStorage 不同。

sessionStorage。在关闭了浏览器窗口后就会被销毁。

存储写入:sessionStorage .setItem(key,data);

存储读取:sessionStorage .getItem(key);若找不到,就返回null。

删除数据:删除指定数据:sessionStorage .removeItem("x1");  或  删除所有数据:sessionStorage .clear();

3、cookie存储

cookie,可以翻译为“小甜品,小饼干”,是存储在浏览器端的一些数据。它有如下特点:

每个域名下最多有20个cookie(不同浏览器略有区别);

cookie最大占用空间为4k;

cookie具有有效日期的概念,超过有效期,就会被自动删除;

cookie有域名限制,只有设置的域名才可以访问,若不设置,会默认限制为创建的域名;

每次都会携带在HTTP头中,如果使用cookie保存过多数据会带来性能问题;

只能存储字符串。

cookie语法:key=value;[expires=date];[path=path];[domain=somewhere.com]; [secure]

中括号是可选,name=value是必选。

expires=date 失效时间,若不声明,则浏览器关闭后失效

path=path 访问路径,当设置了路径,只有设置那个路径文件才可以访问

domain=domain 访问域名,只有设置的域名才可以访问

secure 安全设置,必须通过HTTPS传输才能获取

1 添加cookie
var date = new Date(); //创建一个

date.setDate(date.getDate() + 7); //设置过期日期

document.cookie = "user=yaoming;expires=" + date;

2 读取cookie
document.cookie

得到的值格式如下:”age=17; num=90; ...num2=9”

3 删除某个cookie
把他的过期时间设置为0,或者过去,让他过期

document.cookie = "user= ; expires=" + new Date(0);

JavaScript localStorage,sessionStorage,cookie对比

相同点:他们都是在本地存储数据;都遵循同源策略;都是只能存储字符串。

不同点:

存储大小:cookie大小4k;localStorage,sessionStorage大小5M。

生命周期:cookie,根据自己的设置;localStorage,永久有效,除非主动删除;sessionStorage,仅在当前会话下有效,关闭页面或浏览器后被清除。

JavaScript 阻止表单提交

1 onclick的return false法
<input type="submit" value="提交" onclick="return false"/>
<form action="a.php">
	<input type="submit" value="提交" onclick="return test()"/>
</form>
function test(){
        return false;
}
<form action="a.php">
	<input type="submit" value="提交" id=”x1” />
</form>
x1.onclick=function (){
        return false;
}
2 event.preventDefault();
event.preventDefault();

JavaScript 重置表单

form里嵌套type为reset的按钮

<input type=”reset”/>

<button type="reset">按钮</button>

用form对象的reset()函数

表单id.reset();

JavaScript 表单内容获取

语法:表单id.elements[“表单name”].value;

例如:

读: alert(form1.elements[“age”].value);

写: form1.elements[“age”].value=“888”;

checkbox复选框的值获取

<form id="form1" action="a.php" method="post">
	<input type="checkbox" value="1" name="book">1111
	<input type="checkbox" value="5" name="book">222
	<input type="checkbox" value="8" name="book">333	
</form>
var arr = form1.elements["book"];		
for(var i=0;i<arr.length;i++){
	if(arr[i].checked){
		console.log(arr[i].value);
	}
}

JavaScript 默认行为

默认行为指的是元素在点击后,自动执行某些行为,例如:a链接的跳转,表单的submit提交

阻止默认行为(submit和a跳转)

1、event.preventDefault() ;  // 非ie(ie11+)
2、event.returnValue = false ; // ie
3、return false;

JavaScript 立即执行函数

立即执行函数,就是立即执行的匿名函数,他的作用是生成一个独立的作用域,避免污染全局变量,它有如下8种使用方式:

1、(function(){}()),推荐使用。

2、(function(){})()。

3、[function(){}()]。

4、+function(){}()。

5、-function(){}()。

6、~function(){}()。

7、void function(){}()。

8、!function(){}()。

JavaScript `模板字符串

模板字符串,用反单引号``表示,它有如下作用:

1、和单、双引号一样,表示字符串

2、可换行

var str=`

<ul>

<li>11</li>

<li>22</li>

</ul>

`

3、字符串中可嵌入变量和表达式

var a=“罗玉凤”;

var str=`你好:${a}`;

var str1=`你好:${a+1}`;

JavaScript 控制对象属性Object.defineProperty

Object.defineProperty可以控制对象属性的,例如是否可被for in 循环到,是否可修改,是否可删除,默认值,修改之前进行拦截

语法:Object.defineProperty(对象名, ”属性名”, {数据描述符})

1、属性描述符-数据描述符

var obj={};

Object.defineProperty(obj,”age”,{

configurable:true,//能否通过delete删除此属性

enumerable:true,//能否被for in循环到

value:18,//给此属性赋值

writable:true//此属性是否可被修改

})

2、属性描述符-访问器描述符

var obj={_age:0};

Object.defineProperty(obj,”age”,{

configurable:true,//能否通过delete删除此属性

enumerable:true,//能否被for in循环到

get(){

return this._age;

}

set(val){

this._age=val;

}

})

JavaScript 浏览器

垃圾回收机制:当程序在运行的时候,需要申请内存来存储变量,若此变量不再使用,符合垃圾回收条件,浏览器会不定时把它清理掉,这就叫垃圾回收。

垃圾回收方式:标记清除法;引用计数法。

内存泄漏:程序中,不再使用的变量,不能得到及时的清理,就会引起内存泄露,导致程序越用越卡。

标记清除法:浏览器先给内存中的所有变量加上标记;从全局变量window开始,递归遍历它的所有属性,再遍历它属性的属性,依次类推,直到找到所有属性;那些在步骤2中找不到的属性,就要被垃圾回收机制清理掉。

引用计数法:浏览器给所有变量标记被引用次数;若引用次数为0,此可以被垃圾回收。

注意:此方法有内存泄露的风险,它不能解决循环引用的问题。

 

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值