32、JavaScript介绍
阅读原文时间:2023年07月09日阅读:3

32.1、JavaScript概述:

1、JavaScript的历史:

1992年Nombas开发出C-minus-minus(C--)的嵌入式脚本语言(最初绑定在CEnvi软件中),后将其改名ScriptEase(客户端执行的语言)。

Netscape(网景)接收Nombas的理念,(Brendan Eich)在其Netscape Navigator 2.0产品中开发出一套livescript的脚本语言,Sun和Netscape共同完成,

后改名叫Javascript。

微软随后模仿,在其IE3.0的产品中搭载了一个JavaScript的克隆版叫Jscript,为了统一三家,ECMA(欧洲计算机制造协会)定义了ECMA-262规范,国际标

准化组织及国际电工委员会(ISO/IEC)也采纳 ECMAScript 作为标准(ISO/IEC-16262)。从此,Web 浏览器就开始努力(虽然有着不同的程度的成功

和失败)将 ECMAScript 作为 JavaScript 实现的基础。EcmaScript是规范。

2、ECMAScript:

(1)尽管 ECMAScript 是一个重要的标准,但它并不是 JavaScript 唯一的部分,当然,也不是唯一被标准化的部分。实际上,一个完整的 JavaScript 实

现是由以下 3 个不同部分组成的:

1)核心:ECMAScript。

2)文档对象模型(DOM):Document object model (整合js,css,html)。

3)浏览器对象模型(BOM):Broswer object model(整合js和浏览器)。

4)Javascript 在开发中绝大多数情况是基于对象的,也是面向对象的。

(2)简单的说,ECMAScript描述了以下内容:

1)语法

2)类型

3)语句

4)关键字

5)保留字

6)运算符

7)对象(封装、继承、多态)基于对象的语言,使用对象。

3、JavaScript的引入方式:

(1)直接编写:

(2)导入文件式:

32.2、JavaScript基础:

1、变量:

(1)举例:

x=5

y=6

z=x+y

在代数中,我们使用字母(比如 x)来保存值(比如 5)。通过上面的表达式 z=x+y,我们能够计算出 z 的值为 11。

在 JavaScript 中,这些字母被称为变量。

(2)变量的特点:

0)变量是弱类型的(很随便)。

1)声明变量时不用声明变量类型,全都使用var关键字。

var a;

2)一行可以声明多个变量.并且可以是不同类型。

var name="lc", age=20, job="it";

3)声明变量时可以不用var,如果不用var,那么它是全局变量。

4)变量命名时,首字符只能是字母、下划线、$符,三选一,且区分大小写,x与X是两个变量。

(3)变量还应遵守以下某条著名的命名规则:

1)Camel 标记法:

首字母是小写的,接下来的字母都以大写字符开头。

例如:var myTestValue = 0, mySecondValue = "hi";

2)Pascal 标记法:

首字母是大写的,接下来的字母都以大写字符开头。

例如:Var MyTestValue = 0, MySecondValue = "hi";

3)匈牙利类型标记法:

在以 Pascal 标记法命名的变量前附加一个小写字母(或小写字母序列),说明该变量的类型。

例如:i 表示整数,s 表示字符串,Var iMyTestValue = 0, sMySecondValue = "hi";

(4)注意:

function func1(){

var a = 123;

b=456

}

func1();

//alert(a);

//alert(b);

//不推荐

2、基础规范:

(1)每行结束可以不加分号, 没有分号会以换行符作为每行的结束。

a=1

b=2

//正确

a=1;

b=2;

//正确

a=1;b=2;

//正确

a=1 b=2;

//错误

(2)注释支持多行注释和单行注释(/* */ //)。

(3)使用{}来封装代码块。

3、常量和标识符;

(1)常量 :直接在程序中出现的数据值。

(2)标识符:

1)由不以数字开头的字母、数字、下划线(_)、美元符号($)组成。

2)常用于表示函数、变量等的名称。

3)例如:_abc、$abc、abc、abc123是标识符,而1abc不是。

4)JavaScript语言中代表特定含义的词称为保留字,不允许程序再定义为标识符。

4、数据类型:

(1)图示:

1)

2)

(2)数字类型(Number):

1)简介:

最基本的数据类型。

不区分整型数值和浮点型数值。

所有数字都采用64位浮点格式存储,相当于Java和C语言中的double格式。

number最小值:-1.7976931348623157E+308。

number最大值:1.7976931348623157E+308。

当设定的数字超过number则会显示成-Infinity,Infinity表示无穷大,也就是JavaScript也不知道它到底有多大。

2)整数:

在JavaScript中10进制的整数由数字的序列组成。

3)浮点数:

使用小数点记录数据,例如:3.4,5.6。

使用指数记录数据,例如:4.3e23 = 4.3 x 10^23。

4)16进制和8进制数的表达:

16进制数据前面加上0x,八进制前面加0。

16进制数是由0-9,A-F等16个字符组成。

8进制数由0-7等8个数字组成。

16进制和8进制与2进制的换算。

示例:

# 2进制: 1111 0011 1101 0100 <-----> 16进制:0xF3D4 <-----> 10进制:62420

# 2进制: 1 111 001 111 010 100 <-----> 8进制:0171724

(3)字符串(String):

1)简介:

是由Unicode字符、数字、标点符号组成的序列。

字符串常量首尾由单引号或双引号括起。

JavaScript中没有字符类型。

常用特殊字符在字符串中的表达。

字符串中部分特殊字符必须加上右划线(\)。

常用的转义字符,\n:换行、\':单引号、\":双引号、\\:右划线。

2)String数据类型的使用:

Unicode的插入方法。

/*

输出结果:

*/

(4)布尔型(Boolean):

1)简介:

Boolean类型仅有两个值:true和false,也代表1和0,实际运算中true=1,false=0。

布尔值也可以看作on/off、yes/no、1/0对应true/false。

Boolean值主要用于JavaScript的控制语句,例如:

if (x==1){

y=y+1;

}else{

y=y-1;

}

(5)Null & Undefined:

1)Undefined类型:

Undefined 类型只有一个值,即 undefined,当声明的变量未初始化时,该变量的默认值是 undefined。

当函数无明确返回值时,返回的也是值 "undefined"。

2)Null类型:

另一种只有一个值的类型是 Null,它只有一个专用值 null,即它的字面量。值 undefined 实际上是从值

null 派生来的,因此 ECMAScript 把它们定义为相等的。尽管这两个值相等,但它们的含义不同。

undefined 是声明了变量但未对其初始化时赋予该变量的值,null 则用于表示尚未存在的对象。如果函数

或方法要返回的是对象,那么找不到该对象时,返回的通常是 null。

(6)数据类型转换:

1)简介:

JavaScript属于松散类型的程序语言。

变量在声明的时候并不需要指定数据类型。

变量只有在赋值的时候才会确定数据类型。

表达式中包含不同类型数据,在计算过程中会强制进行类别转换。

2)数字 + 字符串:数字转换为字符串。

3)数字 + 布尔值:true转换为1,false转换为0。

4)字符串 + 布尔值:布尔值转换为字符串true或false。

(7)强制类型转换函数:

1)函数parseInt:

强制转换成整数,例如:

parseInt("6.12")=6;

parseInt(“12a")=12;

parseInt(“a12")=NaN;

//NaN:属于Number类型的一个特殊值,当遇到将字符串转成数字无效时,就会得到一个NaN数据。

parseInt(“1a2")=1;

2)函数parseFloat:

强制转换成浮点数,例如:parseFloat("6.12")=6.12;

3)函数eval:

将字符串强制转换为表达式并返回结果,例如:

eval("1+1")=2;

eval("1<2")=true;

(8)类型查询函数(typeof):

1)简介:

ECMAScript 提供了 typeof 运算符来判断一个值是否在某种类型的范围内。可以用这种运算符判断一个值是否表示一种原始类型,

如果它是原始类型,还可以判断它表示哪种原始类型。

2)查询数值当前类型:
(string / number / boolean / object )

例如:

typeof("test"+3); //"string"

typeof(null); //"object "

typeof(true+1); //"number"

typeof(true-false); //"number"

32.3、ECMAScript运算符:

1、ECMAScript算数运算符:

(1)简介:

加(+)、 减(-)、 乘(*) 、除(/) 、余数(% ) 加、减、乘、除、余数和数学中的运算方法一样,例如:9/2=4.5,4*5=20,9%2=1。

"-"除了可以表示减号,还可以表示负号,例如:x=-y。

"+"除了可以表示加法运算,还可以用于字符串的连接,例如:"abc"+"def"="abcdef"。

(2)递增(++) 、递减(--):

假如x=2,那么x++表达式执行后的值为3,x--表达式执行后的值为1。

i++相当于i=i+1,i--相当于i=i-1。

递增和递减运算符可以放在变量前也可以放在变量后:--i,区别是在打印时--i会先打印结果。

var i=1;

console.log(i++);

//1

var i=1;

console.log(++i);

//2

var i=1;

console.log(i--);

//1

var i=1;

console.log(--i);

//0

(3)一元加减法:

var a=1;

a=-a;

//a=-1

var c="10";

alert(typeof (c));

//string

c=+c;

//类型转换

alert(typeof (c));

//number

var d="lc";

d=+d;

alert(d);

//NaN:属于Number类型的一个特殊值,当遇到将字符串转成数字无效时,就会得到一个NaN数据。

alert(typeof(d));

//Number

//NaN特点:

var n=NaN;

alert(n>3);

alert(n<3);

alert(n==3);

alert(n==NaN);

alert(n!=NaN);

//NaN参与的所有的运算都是false,除了!=。

2、ECMAScript逻辑运算符:

(1)简介:

等于( == )、全等于( === )、不等于( != ) 、不全等于( !== )、 大于( > ) 、 小于( < )。 大于等于(>=) 、小于等于(<=)。

与 (&&) 、或(||) 、非(!)。

(2)示例(0代表假,1代表真):

1 && 1 = 1 1 || 1 = 1

1 && 0 = 0 1 || 0 = 1

0 && 0 = 0 0 || 0 = 0

!0 = 1

!1 = 0

(3)逻辑 AND 运算符(&&):

逻辑 AND 运算的运算数可以是任何类型的,不止是 Boolean 值。

如果某个运算数不是原始的 Boolean 型值,逻辑 AND 运算并不一定返回 Boolean 值。

如果某个运算数是 null,返回 null。

如果某个运算数是 NaN,返回 NaN。

如果某个运算数是 undefined,返回undefined。

(4)逻辑 OR 运算符(||):

与逻辑 AND 运算符相似,如果某个运算数不是 Boolean 值,逻辑 OR 运算并不一定返回 Boolean 值。

3、ECMAScript赋值运算符:

(1)简介:

赋值 =。

JavaScript中 = 代表赋值,两个等号 == 表示判断是否相等。

例如:x=1表示给x赋值为1。

if (x==1){…}程序表示当x与1相等时。

if(x==“on”){…}程序表示当x与“on”相等时。

配合其他运算符形成的简化表达式,例如i+=1相当于i=i+1,x&=y相当于x=x&y。

4、ECMAScript等性运算符:

(1)执行类型转换的规则如下:

如果一个运算数是 Boolean 值,在检查相等性之前,把它转换成数字值。false 转换成 0,true 为 1。

如果一个运算数是字符串,另一个是数字,在检查相等性之前,要尝试把字符串转换成数字。

如果一个运算数是对象,另一个是字符串,在检查相等性之前,要尝试把对象转换成字符串。

如果一个运算数是对象,另一个是数字,在检查相等性之前,要尝试把对象转换成数字。

(2)在比较时,该运算符还遵守下列规则:

值 null 和 undefined 相等。

在检查相等性时,不能把 null 和 undefined 转换成其他值。

如果某个运算数是 NaN,等号将返回 false,非等号将返回 true。

如果两个运算数都是对象,那么比较的是它们的引用值,如果两个运算数指向同一对象,那么等号返回 true,否则两个运算数不等。

补充:

null == null true

undefined == undefined true

5 > null(0) true

5 + null 5

5 + undefined NAN

"5" + null 5null

"5" + undefined 5undefined

5、ECMAScript关系运算符:

(1)示例:

var bResult = "Blue" < "alpha";

alert(bResult);

//输出 true  

在上面的例子中,字符串 "Blue" 小于 "alpha",因为字母 B 的字符代码是 66,字母 a 的字符代码是 97。

(2)比较两个字符串形式的数字,比如:

var bResult = "25" < "3";

alert(bResult);

//输出 "true"

上面这段代码比较的是字符串 "25" 和 "3",两个运算数都是字符串,所以比较的是它们的字符代码("2"

的字符代码是 50,"3" 的字符代码是 51)。

(3)比较字符串形式的数字和数字:

var bResult = "25" < 3;

alert(bResult);

//输出 "false"

这里,字符串 "25" 将被转换成数字 25,然后与数字 3 进行比较,结果不出所料。

(4)总结:

比较运算符两侧如果一个是数字类型,一个是其他类型,会将其类型转换成数字类型。

比较运算符两侧如果都是字符串类型,比较的是最高位的ascii码,如果最高位相等,继续取第二位比较。

6、Boolean运算符:

var temp=new Object();

// false、[]、0、null、undefined、object(new Object())

if(temp){

console.log("LC")

}else {

console.log("TOM")

}

//输出:true

7、全等号和非全等号:

等号(==)和非等号(!=)的同类运算符是全等号(===)和非全等号(!===)。这两个运算符所做的与等号和非等号相同,只是它们在检查相等性前,

不执行类型转换。

32.4、控制语句:

1、if控制语句:

(1)if-else基本格式。

if (表达式){

语句1;

……

}else{

语句2;

…..

}

2)功能说明:

如果表达式的值为true则执行语句1,否则执行语句2。

3)图示:

4)示例:

var x= (new Date()).getDay();

//获取今天的星期值,0为星期天

var y;

if ( (x==6) || (x==0) ) {

y="周末";

}else{

y="工作日";

}

alert(y);

(2)if语句嵌套格式:

if (表达式1) {

语句1;

}else if (表达式2){

语句2;

}else if (表达式3){

语句3;

} else{

语句4;

}

1)图示:

2)示例:

var x= (new Date()).getDay();

var y

if (x==1){

y="星期一";

}else if (x==2){

y="星期二";

}else if (x==6){

y="星期六";

}else if (x==0){

y="星期日";

}else {

y = "未定义";

}

alert(y)

2、switch选择控制语句:

(1)switch基本格式:

switch (表达式) {

case 值1:语句1;break;

case 值2:语句2;break;

case 值3:语句3;break;

default:语句4;

}

(2)图示:

(3)示例:

var x=(new Date()).getDay();

var y

switch(x){

case 1:y="星期一"; break;

case 2:y="星期二"; break;

case 3:y="星期三"; break;

case 4:y="星期四"; break;

case 5:y="星期五"; break;

case 6:y="星期六"; break;

case 7:y="星期日"; break;

default: y="未定义";

}

alert(y)

(4)说明:

switch比else if结构更加简洁清晰,使程序可读性更强,效率更高。

3、for循环控制语句:

(1)for循环基本格式:

for (初始化;条件;增量){

语句1;

}

(2)功能说明:

实现条件循环,当条件成立时,执行语句1,否则跳出循环体。

(3)图示:

(4)示例:

for (var i=1;i<=7;i++){

document.write("hello");

document.write("
");

}

4、while循环控制语句:

(1)while循环基本格式:

while (条件){

语句1;

}

(2)功能说明:

运行功能和for类似,当条件成立循环执行花括号({})内的语句,否则跳出循环。

(3)图示:

(4)示例:

var i=1;

while (i<=7) {

document.write("hello");

document.write("
");

i++;

}

//循环输出H1到H7的字体大小

5、异常处理:

try {

//这段代码从上往下运行,其中任何一个语句抛出异常该代码块就结束运行。

}

catch (e) {

// 如果try代码块中抛出了异常,catch代码块中的代码就会被执行。

//e是一个局部变量,用来指向Error对象或者其他抛出的对象。

}

finally {

//无论try中代码是否有异常抛出(甚至是try代码块中有return语句),finally代码块中始终会被执行。

}

注:主动抛出异常 throw Error('xxx')

32.5、ECMA对象:

1、对象的概念与分类:

(1)object对象:

ECMAScript 中的所有对象都由这个对象继承而来,Object 对象中的所有属性和方法都会出现在其他对象中。

ToString():返回对象的原始字符串表示。

ValueOf():返回最适合该对象的原始值。对于许多对象,该方法返回的值都与 ToString() 的返回值相同。

(2)11种内置对象:

1)Array ,String , Date, Math, Boolean, Number Function, Global, Error, RegExp , Object

2)在JavaScript中除了null和undefined以外其他的数据类型都被定义成了对象,也可以用创建对象的方法定

义变量,String、Math、Array、Date、RegExp都是JavaScript中重要的内置对象,在JavaScript程序大多数

功能都是通过对象实现的。

(3)内置对象的分类:

(4)示例:

var aa=Number.MAX_VALUE;

//利用数字对象获取可表示最大数。

var bb=new String("hello JavaScript");

//创建字符串对象。

var cc=new Date();

//创建日期对象。

var dd=new Array("星期一","星期二","星期三","星期四");

//数组对象。

2、String对象:

(1)自动创建字符串对象:

var str1="hello world";

alert(str1.length);

alert(str1.substr(1,5));

//调用字符串的对象属性或方法时自动创建对象,用完就丢弃。

(2)手工创建字符串对象:

var str1= new String("hello word");

alert(str1.length);

alert(str1.substr(1,3));

//采用new创建字符串对象str1,全局有效。

(3)String对象的属性:

1)获取字符串的长度(length):

var str1="String对象";

var str2="";

alert("str1长度 "+str1.length);

//8

alert("str2长度 "+str2.length);

//0

(4)String对象的方法:

1)String对象的方法(1) — 格式编排方法:

var x="lc";

var y="x.italics():"+x.italics();

document.write(y.fontsize(10));

//x.italics():lc

2)String对象的方法(2) — 大小写转换:

var str1="AbcdEfgh";

var str2=str1.toLowerCase();

var str3=str1.toUpperCase();

alert(str2);

//结果为"abcdefgh"

alert(str3);

//结果为"ABCDEFGH"

3)String对象的方法(3) — 获取指定字符:

/*

书写格式:

x.charAt(index)

x.charCodeAt(index)

x代表字符串对象

index代表字符位置

index从0开始编号

charAt返回index位置的字符

charCodeAt返回index位置的Unicode编码

*/

var str1="welcome to the world of JS! 天空";

var str2=str1.charAt(28);

var str3=str1.charCodeAt(28);

alert(str2);

//结果为"天"

alert(str3);

//结果为22825

4)String对象的方法(4) — 查询字符串:

/*书写格式:

x.indexOf(findstr,index)

x.lastIndexOf(findstr)

*/

var str1="welcome to the world of JS!";

var str2=str1.indexOf("l");

var str3=str1.lastIndexOf("l");

alert(str2);

//结果为2

alert(str3);

//结果为18

/*

书写格式:

x.match(regexp)

x.search(regexp)

x代表字符串对象

regexp代表正则表达式或字符串

match返回匹配字符串的数组,如果没有匹配则返回null

search返回匹配字符串的首字符位置索引

*/

var str1="welcome to the world of JS!";

var str2=str1.match("world");

var str3=str1.search("world");

alert(str2[0]);

//结果为"world"

alert(str3);

//结果为15

5)String对象的方法(5) — 子字符串处理:

A、截取子字符串:

/*

书写格式:

x.substr(start, length)

x.substring(start, end)

x代表字符串对象

start表示开始位置

length表示截取长度

end是结束位置加1

第一个字符位置为0

*/

var str1="abcdefgh";

var str2=str1.substr(2,4);

var str3=str1.substring(2,4);

alert(str2);

//结果为"cdef"

alert(str3);

//结果为"cd"

//x.slice(start, end)

var str1="abcdefgh";

var str2=str1.slice(2,4);

var str3=str1.slice(4);

var str4=str1.slice(2,-1);

var str5=str1.slice(-3,-1);

alert(str2);

//结果为"cd"

alert(str3);

//结果为"efgh"

alert(str4);

//结果为"cdefg"

alert(str5);

//结果为"fg"

B、替换子字符串:

//x.replace(findstr,tostr)

var str1="abcdefgh";

var str2=str1.replace("cd","aaa");

alert(str2);

//结果为"abaaaefgh"

C、分割子字符串:

var str1="一,二,三,四,五,六,日";

var strArray=str1.split(",");

alert(strArray[1]);

//结果为"二"

D、连接子字符串:

/*

使用格式:

y=x.concat(addstr)

x代表字符串对象

addstr为添加字符串

返回x+addstr字符串

*/

var str1="abcd";

var str2=str1.concat("efgh");

alert(str2);

//结果为"abcdefgh"

3、Array对象:

(1)创建数组对象:

//Array 对象用于在单个的变量中存储多个值。

//创建方式1:

var a=[1,2,3];

/*

创建方式2:

new Array()

创建数组时允许指定元素个数也可以不指定元素个数。

new Array(size);

if 1个参数且为数字,即代表size,not content。

new Array(element0, element1, …, elementn)

也可以直接在建立对象时初始化数组元素,元素类型允许不同。

*/

var cnweek=new Array(3);

//初始化数组对象:

cnweek[0]="星期一";

cnweek[1]="星期二";

cnweek[2]="星期三";

var test=new Array(100,"a",true);

(2)创建二维数组:

var cnweek=new Array(3);

for (var i=0;i<3;i++){

cnweek[i]=new Array(2);

}

cnweek[0][0]="星期一";

cnweek[0][1]="Monday";

cnweek[1][0]="星期二";

cnweek[1][1]="Tuesday";

cnweek[2][0]="星期三";

cnweek[2][1]="Wednesday";

console.log(cnweek)

/*

输出结果:

*/

//遍历数组:

var arr = [

[10,'zhangsan','male'],

[11,'lisi','female'],

[12,'wangwu','male']

];

for (var i=0;i<arr.length;i++){

for(var j=0;j<arr[i].length;j++){

document.write(arr[i][j]);

}

document.write('
');

}

(3)array对象的属性:

//获取数组元素的个数:length

var cnweek=new Array(7);

cnweek[0]="星期日";

cnweek[1]="星期一";

cnweek[2]="星期二";

cnweek[3]="星期三";

cnweek[4]="星期四";

cnweek[5]="星期五";

cnweek[6]="星期六";

for (var i=0;i<cnweek.length;i++){

document.write(cnweek[i]+" | ");

}

/*

输出的结果:

*/

(4)array对象的方法:

1)连接数组-join方法:

/*

书写格式:

x.join(bystr)

x代表数组对象

bystr作为连接数组中元素的字符串

返回连接后的字符串与字符串的split功能刚好相反

*/

var arr1=[1, 2, 3, 4, 5, 6, 7];

var str1=arr1.join("-");

alert(str1);

//结果为"1-2-3-4-5-6-7"

2)连接数组-concat方法:

/*

连接数组-concat方法:

x.concat(value,…)

x代表数组对象

value可以为字符串、数字、数组等任何值

*/

var a = [1,2,3];

var b=[4,5,6]

var c=a.concat(4,5);

var d=a.concat(b);

console.log(c);

//返回结果为[1,2,3,4,5]

console.log(d);

//返回结果为[1,2,3,4,5,6]

3)数组排序-reverse sort方法:

//x.reverse():数组顺序翻转

//x.sort():数组排序

var arr1=[32, 12, 111, 444];

arr1.reverse();

//颠倒数组元素

alert(arr1.toString());

//结果为444,111,12,32

arr1.sort();

//排序数组元素

alert(arr1.toString());

//结果为111,12,32,444

//按着数字比较

function intSort(a,b){

if (a>b){

return 1;//-1

}

else if(a<b){

return -1;//1

}

else {

return 0

}

}

/*

function intSort(a,b){

return b-a;

}

*/

arr1.sort(intSort);

alert(arr1.toString());

//结果为12,32,111,444

4)数组切片-slice方法:

/*

x.slice(start, end)

x代表数组对象

start表示开始位置索引

end是结束位置下一数组元素索引编号

第一个数组元素索引为0

start、end可为负数,-1代表最后一个数组元素

end省略则相当于从start位置截取以后所有数组元素

*/

var arr1=['a','b','c','d','e','f','g','h'];

var arr2=arr1.slice(2,4);

var arr3=arr1.slice(4);

var arr4=arr1.slice(2,-1);

alert(arr2.toString());

//结果为"c,d"

alert(arr3.toString());

//结果为"e,f,g,h"

alert(arr4.toString());

//结果为"c,d,e,f,g"

5)删除子数组-splice方法:

/*

x. splice(start, deleteCount, value, …)

x代表数组对象

splice的主要用途是对数组指定位置进行删除和插入

start表示开始位置索引

deleteCount删除数组元素的个数

value表示在删除位置插入的数组元素

value参数可以省略

*/

var a = [1,2,3,4,5,6,7,8];

a.splice(1,2);

console.log(a)

//a变为 [1,4,5,6,7,8]

a.splice(1,1);

console.log(a)

//a变为[1,5,6,7,8]

a.splice(1,0,2,3);

console.log(a)

//a变为[1,2,3,5,6,7,8]

6)数组的进出栈操作(1):

/*

push pop这两个方法模拟的是一个栈操作,先进后出(类似于弹夹)

x.push(value, …) 压栈

x.pop() 弹栈

x代表数组对象

value可以为字符串、数字、数组等任何值

push是将value值添加到数组x的结尾

pop是将数组x的最后一个元素删除

*/

var arr1=[1,2,3];

arr1.push(4,5);

console.log(arr1);

//结果为[1, 2, 3, 4, 5]

arr1.push([6,7]);

console.log(arr1);

//结果为[1, 2, 3, 4, 5, Array(2)]

console.log(arr1[5])

//结果为[6, 7]

arr1.pop();

console.log(arr1);

//结果为[1, 2, 3, 4, 5]

7)数组的进出栈操作(2):

/*

unshift shift

x.unshift(value,…)

x.shift()

x代表数组对象

value可以为字符串、数字、数组等任何值

unshift是将value值插入到数组x的开始

shift是将数组x的第一个元素删除

*/

var arr1=[1,2,3];

arr1.unshift(4,5);

console.log(arr1);

//结果为[4, 5, 1, 2, 3]

arr1. unshift([6,7]);

console.log(arr1);

//结果为[Array(2), 4, 5, 1, 2, 3]

arr1.shift();

console.log(arr1);

//结果为[4, 5, 1, 2, 3]

(5)总结js数组的特性:

/*

js中数组的特性:

java中数组的特性, 规定是什么类型的数组,就只能装什么类型,只有一种类型。

js中的数组特性1: js中的数组可以装任意类型,没有任何限制。

js中的数组特性2: js中的数组,长度是随着下标变化的,用到多长就有多长。

*/

var arr5 = ['abc',123,1.14,true,null,undefined,new String('1213'),new Function('a','b','alert(a+b)')];

alert(arr5.length);

//返回结果 8

arr5[10] = "hahaha";

alert(arr5.length);

//返回结果 11

alert(arr5[9]);

//返回结果 undefined

4、Date对象:

(1)创建Date对象:

//方法1:不指定参数

var nowd1=new Date();

alert(nowd1.toLocaleString());

//返回结果 2019/10/13 下午4:47:32

//方法2:参数为日期字符串

var nowd2=new Date("2004/03/20 11:12");

alert(nowd2.toLocaleString());

//返回结果 2004/3/20 上午11:12:00

var nowd3=new Date("04/03/2020 11:12");

alert(nowd3.toLocaleString());

//返回结果 2020/4/3 上午11:12:00

//方法3:参数为毫秒数

var nowd4=new Date(5000);

alert(nowd4.toLocaleString());

//返回结果 1970/1/1 上午8:00:05

alert(nowd4.toUTCString());

//返回结果 Thu, 01 Jan 1970 00:00:05 GMT

//方法4:参数为年月日小时分钟秒毫秒

var nowd5=new Date(2004,2,20,11,12,0,300);

alert(nowd5.toLocaleString());

//毫秒并不直接显示

//返回结果 2004/3/20 上午11:12:00

(2)Date对象的方法—获取日期和时间:

1)getDate():获取日

2)getDay():获取星期

3)getMonth():获取月(0-11)

4)getFullYear():获取完整年份

5)getYear():获取年

6)getHours():获取小时

7)getMinutes():获取分钟

8)getSeconds():获取秒

10)getMilliseconds():获取毫秒

11)getTime():返回累计毫秒数(从1970/1/1 午夜开始)

(3)示例:

//解决 自动补齐成两位数字的方法

function changeNum(num){

if(num < 10){

return "0"+num;

}else{

return num;

}

}

//将数字 0~6 转换成 星期日到星期六

function parseWeek(week){

var arr = ["星期日","星期一","星期二","星期三","星期四","星期五","星期六"];

// 0 1 2 3 ………….

return arr[week];

}

function getCurrentDate(){

//1. 创建Date对象

var date = new Date();

//2. 获得当前年份,没有填入任何参数那么就是当前时间

var year = date.getFullYear();

//3. 获得当前月份,js中月份是从0到11

var month = date.getMonth()+1;

//4. 获得当前日

var day = date.getDate();

//5. 获得当前小时

var hour = date.getHours();

//6. 获得当前分钟

var min = date.getMinutes();

//7. 获得当前秒

var sec = date.getSeconds();

//8. 获得当前星期,没有getWeek

var week = date.getDay();

return year+"年"+changeNum(month)+"月"+day+"日 "+hour+":"+min+":"+sec+" "+parseWeek(week);

}

alert(getCurrentDate());

//返回结果 2019年10月13日 17:19:32 星期日

(4)Date对象的方法—设置日期和时间:

/*

设置日期和时间:

setDate(day_of_month):设置日

setMonth(month):设置月

setFullYear(year):设置年

setHours(hour):设置小时

setMinutes(minute):设置分钟

setSeconds(second):设置秒

setMillliseconds(ms):设置毫秒(0-999)

setTime(allms):设置累计毫秒(从1970/1/1 8:00:00开始)

*/

var x=new Date();

x.setFullYear (1997);

//设置年1997

x.setMonth(7);

//设置月7

x.setDate(1);

//设置日1

x.setHours(5);

//设置小时5

x.setMinutes(12);

//设置分钟12

x.setSeconds(54);

//设置秒54

x.setMilliseconds(230);

//设置毫秒230

document.write(x.toLocaleString()+"
");

//返回 1997/8/1 上午5:12:54

x.setTime(60000);

//设置累计毫秒数

document.write(x.toLocaleString( )+"
");

//返回 1970/1/1 上午8:01:00

(5)Date对象的方法—日期和时间的转换:

getTimezoneOffset():返回本地时间与GMT的时间差,以分钟为单位,第8个时区×15度×4分/度=480。

toUTCString():返回国际标准时间字符串

toLocalString():返回本地格式时间字符串

Date.parse(x):返回累计毫秒数(从1970/1/1午夜到本地时间)

Date.UTC(x):返回累计毫秒数(从1970/1/1午夜到国际时间)

5、RegExp对象:

/*

RegExp对象

在表单验证时使用该对象验证用户填入的字符串是否符合规则。

创建正则对象方式1—参数1:正则表达式,参数2:验证模式,g(global) i(忽略大小写),参数2一般填写g就可以,也有“gi”。

*/

//创建方式1

var reg1 = new RegExp("^[a-zA-Z][a-zA-Z0-9_]{5,11}$","g");

//验证字符串,用户名首字母必须是英文, 除了第一位其他只能是英文数字和_,长度最短不能少于6位,最长不能超过12位。

var str = "bc1236";

alert(reg1.test(str));

//test方法,测试一个字符串是否复合正则规则,返回值是true或false。

//返回结果 true

//创建方式2:/填写正则表达式/匹配模式

var reg2 = /^[a-zA-Z][a-zA-Z0-9_]{5,11}$/g;

alert(reg2.test(str));

//返回结果 true

//String中与正则结合的4个方法 macth search split replace

var str = "hello world";

console.log(str.match(/o/g));

//查找字符串中符合正则的内容,返回数组

/*返回结果

*/

console.log(str.search(/h/g));

//查找字符串中符合正则表达式的内容位置

//返回结果 0

console.log(str.split(/o/g));

//按照正则表达式对字符串进行切割,返回数组

/*返回结果

*/

console.log(str.replace(/o/g,"s"));

//对字符串按照正则进行替换

//返回结果 hells wsrld

6、Math对象:

/*

该对象中的属性方法 和数学有关。

Math是内置对象, 与Global的不同之处是, 在调用时需要打出 "Math."前缀。

*/

//属性学习:

alert(Math.PI);

//圆周率

//返回结果 3.141592653589793

//方法学习:

alert(Math.random());

//获得随机数0~1不包括1。

//返回结果 0.019389644287961083

alert(Math.round(1.5));

//四舍五入

//返回结果 2

//获取0-100的随机整数,包括0和100

var num = Math.random();

num = num * 100;

num = Math.round(num);

console.log(num)

//max、min

alert(Math.max(1,2));

//返回结果 2

alert(Math.min(1,2));

//返回结果 1

//pow

alert(Math.pow(2,4));

//pow计算参数1的参数2次方

//返回结果 16

/*

abs(x):返回数的绝对值

exp(x):返回e的指数

floor(x):对数进行下舍入。

log(x):返回数的自然对数(底为e)

max(x,y):返回 x 和 y 中的最高值

min(x,y):返回 x 和 y 中的最低值

pow(x,y):返回 x 的 y 次幂

random():返回 0 ~ 1 之间的随机数

round(x):把数四舍五入为最接近的整数

sin(x):返回数的正弦

sqrt(x):返回数的平方根

tan(x):返回角的正切

*/

7、Function对象:

(1)函数的定义:

function 函数名 (参数){
函数体;

return 返回值;

}

(2)功能说明:

1)可以使用变量、常量或表达式作为函数调用的参数

2)函数由关键字function定义

3)函数名的定义规则与标识符一致,大小写是敏感的

4)返回值必须使用return

5)Function 类可以表示开发者定义的任何函数

6)用 Function 类直接创建函数的语法如下:

function 函数名 (参数){

函数体;

return 返回值;

}

var 函数名 = new Function("参数1","参数n","function_body");

//虽然由于字符串的关系,第二种形式写起来有些困难,但有助于理解函数只不过是一种引用类型,

//它们的行为与用 Function 类明确创建的函数行为是相同的。

7)示例:

function func1(name) {

alert('hello' + name + '!');

return 8

}

ret = func1('lc');

alert(ret);

//输出结果 hellolc! 8

var func2 = new Function("name","alert(\"hello\"+name);");

func2("lc");

//输出结果 hellolc

8)注意:js的函数加载执行与python不同,它是整体加载完才会执行,所以执行函数放在函数声

明上面或下面都可以:

f();

//--->OK

//返回结果 hello

function f(){

console.log("hello")

}

f()

//-->OK

//返回结果 hello

(3)Function对象的length属性:

如前所述,函数属于引用类型,所以它们也有属性和方法。

比如,ECMAScript 定义的属性 length 声明了函数期望的参数个数。

alert(func1.length)

(4)Function对象的方法:

Function 对象也有与所有对象共享的 valueOf() 方法和 toString() 方法。这两个方法返回的都是函数的源代码,在调试时尤其有用。

alert(void(fun1(1,2)))

运算符void()作用:拦截方法的返回值

(5)函数的调用:

function func1(a,b){

alert(a+b);

}

func1(1,2);

//3

func1(1,2,3);

//3

func1(1);

//NaN

func1();

//NaN

//只要函数名写对即可,参数怎么填都不报错。

//面试题

function func2(a,b){

alert(a+b);

}

var a=1;

var b=2;

func2(a,b)

//3

(6)函数的内置对象arguments:

function add(a,b){

console.log(a+b);

//3

console.log(arguments.length);

//2

console.log(arguments);

//[1,2] (Arguments(2) [1, 2, callee: ƒ, Symbol(Symbol.iterator): ƒ])

}

add(1,2)

//arguments的用处1

function nxAdd(){

var result=0;

for (var num in arguments){

result+=arguments[num]

}

console.log(result)

}

nxAdd(1,2,3,4,5)

//15

//arguments的用处2

function f(a,b,c){

if (arguments.length!=3){

throw new Error("function f called with "+arguments.length+" arguments,but it just need 3 arguments")

}

else {

console.log("success!")

}

}

f(1,2,3)

//success!

(7)匿名函数:

var func1 = function(arg){

return arg;

}

var ret=func1('lc')

console.log(ret)

//该匿名函数不能和下面的一同使用,否则会报错。

//lc

//匿名函数的应用

(function(){

console.log("tony");

})();

//tony

(function(arg){

console.log(arg);

})(123);

//123

8、函数的作用域链和闭包:

(1)作用域:

1)js的作用域和py相似,if while等控制语句并没有自己作用域,而函数是有自己的作用域的。

2)示例1:

var city = 'beijing';

function func(){

var city = 'shanghai';

function inner(){

var city = 'shenzhen';

console.log(city);

}

inner();

}

func();

//shenzhen

3)示例2:

var city = 'beijing';

function Bar(){

console.log(city);

}

function func(){

var city = 'shanghai';

return Bar;

}

var ret = func();

ret();

// beijing

3)示例3(js函数是整体加载完后才会执行):

var city = 'beijing';

function func() {

var city = "shanghai";

function inner() {

// var city = "langfang";

console.log(city);

}

return inner;

}

var ret = func();

ret();

//beijing

var city = 'beijing';

function Bar() {

console.log(city);

}

function func() {

var city = 'shanghai';

return Bar;

}

var ret = func();

ret();

//beijing

(2)闭包:

1)示例:

var city = 'beijing';

function func(){

var city = "shanghai";

function inner(){

console.log(city);

}

return inner;

}

var ret = func();

ret();

//shanghai

32.6、BOM对象:

BOM(浏览器对象模型),可以对浏览器窗口进行访问和操作。使用 BOM,开发者可以移动窗口、改

变状态栏中的文本以及执行其他与页面内容不直接相关的动作。使 JavaScript 有能力与浏览器“对话”。

1、windows对象:

(1)说明:

所有浏览器都支持 window 对象。

概念上讲,一个html文档对应一个window对象。

功能上讲,window 对象是控制浏览器窗口的。

使用上讲,window对象不需要创建对象,直接使用即可。

(2)windows对象方法:

alert():显示带有一段消息和一个确认按钮的警告框。

confirm():显示带有一段消息以及确认按钮和取消按钮的对话框。

prompt():显示可提示用户输入的对话框。

open():打开一个新的浏览器窗口或查找一个已命名的窗口。

close():关闭浏览器窗口。

setInterval():按照指定的周期(以毫秒计)来调用函数或计算表达式。

clearInterval():取消由 setInterval() 设置的 timeout。

setTimeout():在指定的毫秒数后调用函数或计算表达式。

clearTimeout():取消由 setTimeout() 方法设置的 timeout。

scrollTo():把内容滚动到指定的坐标。

(3)windows对象的交互方法:

//alert

alert('aaa');

/*

*/

//confirm

var result = confirm("您确定要删除吗?");

alert(result);

/*

*/

//prompt

var result = prompt("请输入内容!","haha");

//参数1:提示信息;参数2:输入框的默认值,返回值是用户输入的内容。

alert(result);

/*

*/

//open

open("http://www.baidu.com");

//打开一个新的窗口,并进入指定网址,参数1:网址。

open('','','width=200,resizable=no,height=100');

//参数1:什么都不填 就是打开一个新窗口;参数2:填入新窗口的名字(一般可以不填);参数3: 新打开窗口的参数。

//新打开一个宽为200 高为100的窗口

/*

*/

//close

close();

//将当前文档窗口关闭(新打开的窗口不会打开)。

(4)示例:

1)猜字游戏:

var num = Math.round(Math.random()*100);

function acceptInput() {

//2.让用户输入(prompt) 并接受 用户输入结果

var userNum = prompt("请输入一个0~100之间的数字!", "0");

//3.将用户输入的值与 随机数进行比较

if (isNaN(+userNum)) {

//用户输入的无效(重复2,3步骤)

alert("请输入有效数字!");

acceptInput();

}

else if (userNum > num) {

//大了==> 提示用户大了,让用户重新输入(重复2,3步骤)

alert("您输入的大了!");

acceptInput();

} else if (userNum < num) {

//小了==> 提示用户小了,让用户重新输入(重复2,3步骤)

alert("您输入的小了!");

acceptInput();

} else {

//答对了==>提示用户答对了 , 询问用户是否继续游戏(confirm).

var result = confirm("恭喜您!答对了,是否继续游戏?");

if (result) {

//是 ==> 重复123步骤.

num = Math.round(Math.random() * 100);

acceptInput();

} else {

//否==> 关闭窗口(close方法).

close();

}

}

}

acceptInput()

2)setInterval clearInterval:

3)setTimeout clearTimeout:

var ID = setTimeout(abc,2000);

// 只调用一次对应函数.

clearTimeout(ID);

function abc(){

alert('aaa');

}

2、History对象:

(1)History对象属性:

History 对象包含用户(在浏览器窗口中)访问过的 URL。

History 对象是 window 对象的一部分,可通过 window.history 属性对其进行访问。

length 返回浏览器历史列表中的 URL 数量。

(2)History对象方法:

back():加载 history 列表中的前一个 URL。

forward():加载 history 列表中的下一个 URL。

go():加载 history 列表中的某个具体页面。

(3)示例:

click

3、Location对象:

(1)说明:

Location 对象包含有关当前 URL 的信息。

Location 对象是 Window 对象的一个部分,可通过 window.location 属性来访问。

(2)Location对象方法:

location.assign(URL)

location.reload()

location.replace(newURL)

//注意与assign的区别

32.7、DOM对象(DHTML):

1、什么是DOM:

(1)DOM 是 W3C(万维网联盟)的标准。DOM 定义了访问 HTML 和 XML 文档的标准。

W3C 文档对象模型(DOM)是中立于平台和语言的接口,它允许程序和脚本动态地访问和

更新文档的内容、结构和样式。

(2)W3C DOM 标准被分为 3 个不同的部分:

1)核心DOM:针对任何结构化文档的标准模型

2)XML DOM:针对 XML 文档的标准模型

3)HTML DOM:针对 HTML 文档的标准模型

(3)什么是 XML DOM:

XML DOM 定义了所有 XML 元素的对象和属性,以及访问它们的方法。

(4)什么是 HTML DOM:

HTML DOM 定义了所有 HTML 元素的对象和属性,以及访问它们的方法。

2、DOM节点:

(1)根据 W3C 的 HTML DOM 标准:

1)HTML 文档中的所有内容都是节点(NODE)。

2)整个文档是一个文档节点(document对象)。

3)每个 HTML 元素是元素节点(element 对象)。

4)HTML 元素内的文本是文本节点(text对象)。

5)每个 HTML 属性是属性节点(attribute对象)。

6)注释是注释节点(comment对象)。

(2)DOM树:

(3)节点自身属性:

attributes:节点(元素)的属性节点

nodeType:节点类型

nodeValue:节点值

nodeName:节点名称

innerHTML:节点(元素)的文本值

(4)节点的导航属性:

parentNode:节点(元素)的父节点 (推荐)

firstChild:节点下第一个子元素

lastChild:节点下最后一个子元素

childNodes:节点(元素)的子节点

parentElement:父节点标签元素

childrens:所有子标签

firstElementChild:第一个子标签元素

lastElementChild:最后一个子标签元素

nextElementtSibling:下一个兄弟标签元素

previousElementSibling:上一个兄弟标签元素

(5)节点树中的节点彼此拥有的层级关系:

1)节点树中的节点彼此拥有层级关系,父(parent),子(child)和同胞(sibling)等术语用于描述这些关系。

2)父节点拥有子节点,同级的子节点被称为同胞(兄弟或姐妹)。

3)在节点树中,顶端节点被称为根(root)。

4)每个节点都有父节点、除了根(它没有父节点)。

5)一个节点可拥有任意数量的子节点。

6)同胞是拥有相同父节点的节点。

7)下面的图片展示了节点树的一部分,以及节点之间的关系:

(6)访问 HTML 元素(节点),等同于访问节点,我们能够以不同的方式来访问 HTML 元素:

1)页面查找:

通过使用 getElementsByTagName() 方法

通过使用 getElementById() 方法

通过使用 getElementsByClassName() 方法

通过使用 getElementsByName() 方法

2)局部查找:

i am div2
i am div2
i am div2

hello p

3、HTML DOM Event(事件):

(1)Event事件属性:

HTML 4.0 的新特性之一是有能力使 HTML 事件触发浏览器中的动作(action),比如当用户点击某个 HTML 元素

时启动一段 JavaScript。下面是一个属性列表,这些属性可插入 HTML 标签来定义事件动作。

onclick:当用户点击某个对象时调用的事件句柄。

ondblclick:当用户双击某个对象时调用的事件句柄。

onfocus:元素获得焦点。应用场景:输入框。

onblur:元素失去焦点。应用场景:用于表单验证,用户离开某个输入框时,代表已经输入完了,我们可以对它进行验证。

onchange:域的内容被改变。应用场景:通常用于表单元素,当元素内容被改变时触发(三级联动)。

onkeydown:某个键盘按键被按下。应用场景: 当用户在最后一个输入框按下回车按键时,表单提交。

onkeypress:某个键盘按键被按下并松开。

onkeyup:某个键盘按键被松开。

onload:一张页面或一幅图像完成加载。

onmousedown:鼠标按钮被按下。

onmousemove:鼠标被移动。

onmouseout:鼠标从某元素移开。

onmouseover:鼠标移到某元素之上。

onmouseleave:鼠标从元素离开。

onselect:文本被选中。

onsubmit:确认按钮被点击。

(2)两种为元素附加事件属性的方式:

点我呀

试一试!

(3)两种为元素附加事件属性方式,this的使用:

1)this表示当前节点元素;

2)示例:

事件绑定方式1
事件绑定方式2

(4)onload:

1)说明:

onload 属性开发中只给body元素加。

这个属性的触发标志着页面内容被加载完成。

应用场景: 当有些事情我们希望页面加载完立刻执行,那么可以使用该事件属性,一般用于script标签

嵌套在head标签之中的情况。

2)示例:

Title

hello p

(5)onsubmit:

1)说明:

是当表单在提交时触发,该属性也只能给form元素使用。应用场景: 在表单提交前验证用户输入是否正确,如果验证失败,

在该方法中我们应该阻止表单的提交。

2)示例:

(6)Event对象:

1)Event 对象代表事件的状态,比如事件在其中发生的元素、键盘按键的状态、鼠标的位置、鼠标按钮的状态。

2)事件通常与函数结合使用,函数不会在事件发生前被执行,event对象在事件发生时系统已经创建好了,并且

会在事件函数被调用时传给事件函数,我们获得仅仅需要接收一下即可。

3)比如onkeydown,我们想知道哪个键被按下了,需要问下event对象的属性,这里就是KeyCode;

4)onclick=function(event){};

5)示例1(当鼠标在输入框中按下后):

/*

注意:单写document加事件名称,代表监听全局事件。

*/

(7)事件传播:

1)说明:

子标签的事件默认会传播到该子标签的所有父标签,阻止事件进行传播使用"event.stopPropagation();"方法。

2)示例:

4、DOM对象对html的增删改查:

(1)node的curd:

1)增:

createElement("name"); //创建元素

appendChild(content); //添加元素

2)删:

先获得要删除的元素,然后获得它的父元素,再使用"removeChild();"方法删除。

3)改:

第一种方式:使用上面增和删结合完成修改(找到元素后先删除元素,然后再创建新的元素)。

第二中方式:使用setAttribute(name,value);方法修改属性。

使用innerHTML属性修改元素的内容。

4)查:使用之前介绍的方法:

(2)修改HTML DOM:

1)改变 HTML 内容:

改变元素内容的最简单的方法是使用“innerHTML,innerText”。

2)改变 CSS 样式:

Hello world!

3)改变 HTML 属性:

elementNode.setAttribute(name,value)

elementNode.getAttribute(name)<-------------->elementNode.value(name)

4)创建新的 HTML 元素:

createElement(name)

5)删除已有的 HTML 元素:

elementNode.removeChild(node)

6)关于class的操作:

elementNode.className

elementNode.classList.add

elementNode.classList.remove

(3)示例:

I am is div\_1
I am is div\_2
I am is div\_3
I am is div\_4

32.8、实例练习:

1、搜索框:

2、模态对话框:

3、全选、反选、取消:

111
222

4、两级联动:

5、select左右移动:




32.9、小结:

1、程序默认是从上到下依次顺序执行的,所以程序主要关注变量的全局性、局部性、顺序和执行变量的位置(在最后)。

2、js的变量有两种作用域:全局变量和局部变量。没有使用 var 声明的变量和在function之外声明的变量都是全局变

量,局部变量比同名全局变量的优先级高。

3、 img.setAttribute("src", "01.JPG"); ==> img.src="01.JPG";

4、html的加载:

(1)DOM文档的加载顺序是由上而下的顺序加载。

(2)DOM加载到link标签:

css文件的加载是与DOM的加载并行的,也就是说,css在加载时Dom还在继续加载构建,而过程中遇到的css样式或者img,则会向服务器发送一个请求,

待资源返回后,将其添加到dom中的相对应位置中。

(3)DOM加载到script标签:

由于js文件不会与DOM并行加载,因此需要等待js整个文件加载完之后才能继续DOM的加载,倘若js脚本文件过大,则可能导致浏览器页面显示滞后,出现

“假死”状态,这种效应称之为“阻塞效应”,会导致出现非常不好的用户体验。而这个特性也是为什么在js文件中开头需要

$(document).ready(function(){}); 或者 $(function(){}); 即是让DOM文档加载完成之后才执行js文件,这样才不会出现查找不到DOM节点等问题。js阻塞其

他资源的加载的原因是,浏览器为了防止 js 修改 DOM 树,需要重新构建 DOM 树的情况出现。

(4)解决方法:

1)js是外部脚本,在script标签中添加 defer="true",则会让 js 与 DOM 并行加载,待页面加载完成后再执行 js 文件,这样则不存在阻塞。

2)js是外部脚本,在 scirpt 标签中添加 async="true",这个属性告诉浏览器该 js 文件是异步加载执行的,也就是不依赖于其他 js 和 css,也就是说无法保

证 js 文件的加载顺序,但是同样有与DOM并行加载的效果。

3)js是外部脚本,同时使用 defer 和 async 属性时,defer属性会失效。

4)可以将scirpt标签放在body标签之后,这样就不会出现加载的冲突了。