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("
document.write("
");
}
4、while循环控制语句:
(1)while循环基本格式:
while (条件){
语句1;
…
}
(2)功能说明:
运行功能和for类似,当条件成立循环执行花括号({})内的语句,否则跳出循环。
(3)图示:
(4)示例:
var i=1;
while (i<=7) {
document.write("
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)示例:
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)局部查找:
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)示例:
(4)onload:
1)说明:
onload 属性开发中只给body元素加。
这个属性的触发标志着页面内容被加载完成。
应用场景: 当有些事情我们希望页面加载完立刻执行,那么可以使用该事件属性,一般用于script标签
嵌套在head标签之中的情况。
2)示例:
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)示例:
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标签之后,这样就不会出现加载的冲突了。
手机扫一扫
移动阅读更方便
你可能感兴趣的文章