目录(该目录点击后跳转内容可能不匹配,可使用Ctrl+F进行检索)
3. 函数的隐形参数arguments(只在function函数内)
Document对象及其方法/属性(document表示整个html页面)
4. createElement方法与appendChild方法
JavaScript诞生主要是为了完成页面的数据验证,因此它运行在客户端,需要运行浏览器来解析执行JavaScript代码
这里所提到的弱类型指的是类型可变,JavaScript不像java是强类型
强类型就是定义变量时,类型已确定且不可变
JavaScript特点:
交互性(它可以实现信息的动态交互)
安全性(它不允许直接访问本地磁盘)
跨平台性(只要是可以解释js的浏览器都可以执行,与平台无关)
只需要在head标签或者是body标签内使用script标签书写JavaScript代码

效果如下:

使用script标签引入单独的JavaScript标签

效果如下

值得注意的是:
script标签可以用来书写JavaScript代码,也可以用来引入JavaScript文件,但是注意这二者只能二选一,不能同时使用两个功能

上图是JavaScript的三种常用的输出语句
变量是存放某些值的内存的命名
JavaScript的数据类型:
JavaScript的特殊值:
JavaScript的定义变量格式
- var 变量名;
- var 变量名 = 值;
- 复制代码

这里的typeof函数作用是得到参数的数据类型

js中也与C语言或java语言一样有转义字符,如上图常见的转义字符
与其他语言类似:
js中的十六进制数字 需要在数字前加上“0x”
八进制数字需要在数字前加上“0”
二进制数字需要在数字前加上“0b”(不常用)
调用被转换数据类型的toString()方法
该方法不会影响到原变量,它会将转换的结果返回
但是注意:null和undefined这两个值没有toString()方法,如果调用toString则会报错
调用String()函数,并且将被转换的数据作为参数传递给函数
使用String()函数做类型转换时:
对于Number和Boolean实际上就是调用的toString()方法
但是对于null和undefined,就不会调用toString()方法,它会将null和undefined直接转换为“null”和“undefined”
方式二与方式一的区别即在于能否转换null与undefined
使用 Number()函数进行转换
---字符串--->>>----数字
1)如果是纯数字的字符串,则直接将其转换为数字
2)如果字符串中带有非数字的内容,则转换为 NaN
3)如果字符串是一个空串/一个全是空格的字符串 ,则会返回 0
布尔值--->数字
1)true转成1
2)false转成0
null转成0
undefined转成NaN
使用 parseInt()把一个字符串转换为一个整数
使用parseFloat()把一个字符串转换为一个浮点数
这种方式专门用于对付字符串,它们会将 到第一个非数字字符前的字符提取出来变成数字
如果对非字符串类型使用上述两种方法
它会将其先转换为String再进行操作
使用Boolean()函数进行转换
1)数字-->布尔值 除了0和NaN,其余都是 true
2)字符串-->布尔值 除了空串,其余都是true
3)null与undefined都会转换为false
4)对象object也会转换为true
+ 正号 正号不会对数字产生任何影响
- 负号 它可以对数字进行符号的取反
对于非Number类型的值使用该运算符,它会先将其转换为Number然后再运算
借助这一点我们可以对一个其他的数据类型使用+来将其转换为Number类型
原理与Number()一样

JavaScript的关系(比较)运算符与java基本一致,都有> >= < <= !=
需要注意的点是,关系运算符的比较中如果出现非数字的元素,则它会先将其转换成Number再进行比较,特殊的是 任何值与 NaN作比较都是返回false
其次,如果符号两侧的值都是字符串时,不会再将其转换成数字进行比较,而是直接比较字符串中字符的Unicode编码
因此在比较字符串型的数字时一定要先进行转型
值得注意的是下面这两个运算符

同样的,当使用== 或 != 来比较两个值时,如果值的类型不同,则会自动进行类型转换,将其转为相同的类型,然后再比较,一般是转成Number
但是===不会进行类型转换
否定的全等是 !==




这里如果我们对非布尔值进行 取反运算 ,它会先将其转换为布尔类型,然后再取反,因此我们可以利用该特点来将一个其他数据类型转换为布尔类型,只需对其使用两次取反!!
原理与Boolean()一样
下面介绍的是非布尔类型的与或运算,这里是与之前所学的java不同的,要注意


与其他语言基本一致,这里不再赘述




也可以在创建数组时就初始化数组
要注意的是,当传入的参数只有一个的意思与上面不同时


与对象属性的读取一样,如果读取不存在的索引,不会报错而是返回undefined,因为读取的操作与创建的操作一样,读取相当于创建但是没有赋值,所以返回undefined
对于连续的数组,我们可以使用length属性来获取数组长度
对于非连续的数组,使用length属性会获取到 最后一个元素的索引+1,因此尽量不要创建非连续数组
此外,length属性还可以被 设置/修改


这里只对JavaScript与java不同的地方进行强调
任意数据类型也包括 对象、函数

补充 forEach()遍历
通常来说,我们遍历数组会采用for循环遍历,除此之外,JS还为我们提供了一个forEach()用来遍历数组(需要注意兼容性问题)
浏览器会在回调函数中传递3个参数:

1)push

2) pop

3) unshift

4) shift

5) 切片slice

传递负数时,-1代表倒数第一个,-2代表倒数第二个,以此类推
6)splice
参数:
7)concat
8) join

9) reverse 
10) sort


函数定义时如果有参数,我们无需写类型,给出有多少个参数即可
函数若需要返回,直接使用return即可
JavaScript中不允许重载,如果写了两个一样的函数那么第二个函数将覆盖第一个函数的定义!!!
直接进行演示:


该种方式定义一个函数实际上就是 声明了一个“匿名函数”同时将其赋给了一个变量

在调用函数时,浏览器每次都会传递进两个隐含的参数:
隐形参数即 在function函数中不需要定义,但却可以直接用来获取所有参数的变量
下面进行演示(需求是编写一个函数可以计算传入参数之和)
这里没有说明传入有几个参数,所以使用隐形参数

有时候我们会希望有一个函数在使用上只会被使用一次,使用过之后便不会再被使用,并且定义完后立即调用
这个时候我们就可以使用立即执行函数,实际上,我们如果直接将匿名函数写出来的话,在语法上是无法通过的,我们需要给匿名函数加上一个括号括起来,这样浏览器才会认为它是一个匿名函数,这样我们便得到了匿名函数的对象,此时要想调用这个对象只需在这个对象的后面加上一个括号即可调用

在开发中我们经常会使用到将一个匿名函数作为一个实参传给一个函数如下![]()
此时我们需要注意以下两种情况


对象属于一种引用数据类型,在对象中可以保存多个不同数据类型的属性


值得注意的是,我们如果读取对象中没有的属性,不会报错而是会返回undefined


![]()
对象的删除:
注意冒号和逗号的使用


这是访问属性的另外一种方式

值得注意的是,使用in检查对象中是否含有某个属性时,如果对象中没有但是原型中有,也会返回true
但是这样的话我们使用in运算符就不能确定含有的属性是不是在对象自身里面了
因此我们引出另外一个函数 hasOwnProperty("属性名") 该方法只有在对象自身含有指定的属性名时才会返回true


如图上面这段代码中,我们在输出a变量之前并没有声明a变量,此时理应代码报错,但是并没有,就是因为变量的声明提前机制
简单来说就是原来的代码实际上相当于上图这段代码
函数的声明提前指的是函数的调用可以写在函数的定义的前面
与变量的声明提前同理
但是这里主要注意的是只有使用“函数声明形式”创建的函数才会被声明提前
而使用函数表达式创建的对象不会被函数声明提前,而只会被变量声明提前
调用函数时创建函数作用域,函数执行完毕后,函数作用域销毁
每调用一次函数都会创建一个新的函数作用域,它们之间是相互独立的
在函数作用域中可以访问到全局作用域的变量,反之不行


如上面两图的d实际上都是全局变量,效果一样
用于创建对象的函数我们称之为构造函数
构造函数的执行流程:
通常来说,使用同一个构造函数创建的对象,我们称为一类对象,也将一个构造函数称为一个类
我们将通过一个构造函数创建的对象,称为是该类的实例
这里有一点值得注意的是,所有的对象都是Object的后代,所以任何对象和Object左instanceof检查时都会返回true,这点与java相似



如上图所示,我们创建了一个类里面含有一个方法sayName(),我们不难发现,每当我们创建一个新的实例的时候,它们其实都是不同的对象,也就是说构造函数每执行一次,都会创建新的sayName()方法,执行10000次就会有10000个新的方法,而且,这些方法所实现的内容其实是重复的,这样来说其实是会比较占用我们的内存空间的
因此我们提出优化,我们将sayName()方法从“类”中提取出来,成为一个公共的函数
具体代码实现如下:

但是,我们这么写也存在一定的问题:
因此就引出我们下面学习的内容
我们所创建的每一个函数(任何函数),解析器都会向函数中添加一个属性prototype,这个属性对应着一个对象,这个对象就是我们所谓的原型对象

以后我们创建构造函数时,可以将这些对象共有的属性和方法,统一添加到构造函数的原型对象中,这样不用分别为每个对象添加,也不会影响到全局作用域,就可以使得每个对象都具有这些属性和方法了
下面是利用原型对象解决前面 构造函数方法优化 的问题

prototype原型对象里面的__ proto __ 原型指向的是Object.prototype;
Object.prototype原型对象里面的__ proto __ 原型指向为null
这里原型链的知识参考自 原型、原型对象和原型链_Mae_cpski的博客-CSDN博客
要想得到某个事件的事件对象的话,我们只需定义形参将实参接收下即可使用
我们都知道当我们为同一个对象绑定同一个事件的多个响应函数时,如果我们使用对象.οnclick=function(){}会导致,最终绑定成功的只有我们最后定义的那个函数,前面的都被覆盖了
通过addEventListener()这个方法也可以为事件绑定响应函数
参数
使用addEventListener()可以同时为一个对象的相同事件绑定多个响应函数
这样当事件被触发时,响应函数将会按照函数的绑定顺序执行
在JS中,JS为我们提供了三个包装类,通过这三个包装类可以将基本数据类型的数据转化为对象

但是注意:
在实际开发中,我们并不会去使用基本数据类型的对象,如果使用基本数据类型的对象,在做一些比较时可能会带来一些不可预期的结果(对象的比较 比较的是对象的地址)
那么它有什么用呢???
当我们对一些基本数据类型的值去调用属性和方法时,浏览器会自动地 临时使用包装类将其转换成对象,然后再调用对象的属性和方法 ,并且在调用完以后,再将其转回基本数据类型

如图,我们对基本数据类型的s变量调用了toString()方法,并没有报错

如图我们为基本数据类型的变量s添加了一个属性hello,并且再访问hello属性,但是这里输出的却是undefined
这里的添加属性hello 和 访问属性hello 实际上 浏览器临时创建了两个对象,因此在访问属性时和创建对象时的对象其实不是一个对象,因此返回undefined

1)getDate()
获取当前日期对象是几日
2)getDay()
获取当前日期对象是星期几(返回0~6的值,其中0表示周日)
3)getMonth()
获取当前日期对象是几月(返回0~11的值,其中0表示1月)
4)getFullYear()
获取当前日期对象的年份
5)各种get时分秒

6)getTime()

属性如下:

常用方法如下:
1)abs()
可以用来计算一个数的绝对值
2)ceil()
可以对一个数进行向上取整
3)floor()
可以对一个数进行向下取整
4)round()
可以对一个数进行 四舍五入取整
5)random()
可以随机生成一个0~1的随机数(不包含0和1)
6)max()
可以获取多个数中的最大值
7)min()
可以获取多个数中的最小值
8)pow(x,y)
可以返回x的y次幂
9)sqrt()
可以对一个数进行开方运算
值得强调的是,字符串在底层是以 字符数组 的形式保存的,即类似[ 'H' , 'E' , 'L' , 'L' , 'O' ]这样,那么既然字符串的底层是 数组 的话,字符串也拥有数组的属性length用于得到 字符串长度,其次,也可以通过 数组名[下标] 来访问字符串中的字符
1)charAt()
2)charCodeAt()
3)fromCharCode()

4)concat()
5)indexOf()
6)lastIndexOf()
7)slice()
参数:
8)substring()
该方法与slice()基本一样,这里只强调它们的不同点:
9)split()
该方法与数组中的方法join()作用一样
可以将一个字符串拆分为一个数组
参数:
需要一个字符串作为参数,将会根据该字符串去拆分数组(如果传入一个空串,则将每个字符都拆分为数组中的一个元素)
10)toUpperCase()
将一个字符串全部字符转换成大写后返回
11)toLowerCase()
将一个字符串全部字符转换成小写后返回
当解析器/浏览器在调用函数时,每次都会向函数内部传递进一个隐含的参数,这个隐含的参数就是this,this指向的是一个对象
我们发现当我们直接对alert函数内传入一个对象的时候,常常输出的是“[object Object]”



细心的同学可能会注意到这不就是方法重写吗,实际上在js中并没有重写这个概念
实际上就像人的生活时间长了会产生垃圾一样,程序在运行过程中也会产生垃圾,这些垃圾积攒过多之后,会导致程序运行的速度变慢,因此我们需要一个垃圾回收的机制,来处理程序运行过程中产生的垃圾
首先我们需要明确在程序中,什么样的“东西”才算是垃圾
事实上,JS中拥有自动的垃圾回收机制,会自动的将这些垃圾对象从内存中销毁,我们不需要也不能进行垃圾回收的操作,我们需要做的只是将不再使用的对象设置为null即可
什么是事件?事件是电脑输入设备与页面进行交互的响应,我们称之为事件
常用的事件如下:
onload加载完成事件; 页面加载完成后,常用于做页面js代码初始化操作
onclick单击事件; 常用于按钮的点击响应操作
onblur失去焦点事件; 常用于输入框失去焦点后验证其输入内容是否合法
onchange内容发生改变事件; 常用于下拉列表与输入框内容发生改变后操作
onsubmit表单提交事件; 常用于表单提交前,验证所有表单项是否合法
什么是事件的注册(绑定)?
其实就是告诉浏览器,当事件响应后要执行哪些操作代码,叫事件注册或事件绑定
而事件的注册(绑定)又分为静态注册或动态注册
1.1事件的静态注册
1.2事件的动态注册
这种形式赋予事件响应后的代码,叫动态注册
动态注册的基本步骤如下:
1)获取标签对象
2)标签对象.对象名=function(){}



效果如下:



值得注意的是在静态注册时我们在调用函数前需要有一个return
滚轮事件 :根据MDN上给出的解释就是:当滚动鼠标滚轮或操作其它类似输入设备时会触发滚轮事件。
也就是说滚轮事件不单单指鼠标滚轮,也包括其他可以出发滚轮事件的设备,比如说电脑触控板等都是可以触发滚轮事件的。所以这里的标题实际不是特别的正确,不应该只界定在鼠标触发的滚轮事件。
在MDN上同样还有对滚轮事件的注意事项:
滚轮事件的可使用场景(个人见解)
不同浏览器平台滚轮事件的差异:
滚轮事件主要有三种类型,分别是: wheel(各个厂商的高版本浏览器都支持), mousewheel(不支持火狐), DOMMouseScroll(该事件需要使用addEventListener绑定,可以特别地支持低版本火狐)
虽然在MDN中也有说mousewheel已经被弃用了,主要使用的是wheel,但是为了兼容低版本浏览器,还是需要添加上去。在低版本的firefox浏览器中,其也不支持wheel,所以还需要添加DOMMouseScroll已达到兼容的目的。
同时,各个不同的浏览器平台对于滚轮事件的上下移动的判定使用的参数是完全不同的,有的是使用wheelDelta,有的则是使用detail的,并通过他们的正负来判断其滚动的方向的,下面是我在网上找到的一张图,可以从这张图上看出当前使用比较多的浏览器上是通过什么判断的(可忽略IE)

从上表可以看出,deltaY一个可以判断滚轮的方向是向上还是向下(正值向下滚动,负值向上滚动)。这里的H取得是
document.body.clientHeight || window.innerHeight。n是滚动的行数。一般来说n默认的是3行。通过分析可以得出以下结论:
- 可靠属性:deltaY,方向判断方法一致(正值向下滚动,负值向上滚动),与操作系统鼠标设置有关联,但需注意绝对值算法不统一。(比如在mac上使用的时候,如果选择的鼠标滚轮是自然属性,实际就是向上滚动是正值,向下滚动是负值)
- 功能方面:Firefox能直观反映滚动行数,但不能直观与浏览器默认滚动条保持同步;其他几组浏览器则恰好相反;
- 个人建议:个人认为wheelDelta的最初设计思想很好,电脑鼠标滚轮垂直行数默认值是3,wheelDelta默认值120,即单行行高40px,即使用户电脑做了个性化设置,像素值也不会出现循环小数,避免了Chrome的deltaY设计缺陷,有利于行业规范化,所以建议各浏览器厂商能完整支持wheelDelta这一属性。
上述有关滚轮事件的笔记来自鼠标滚轮事件的学习与总结 - 掘金 (juejin.cn)
补充:当滚轮滚动时,如果浏览器有滚动条,我们滚动事件触发时可能导致滚动条随之滚动,这是浏览器的默认行为,如果不希望发生,则需要取消默认行为
补充 onscroll Vs onwheel
onwheel 事件在鼠标滚轮在元素上下滚动时触发。同样可以在触摸板上滚动或放大缩小区域时触发(如笔记本上的触摸板)。
onscroll 事件在元素滚动条在滚动时触发。滚动条必须存在,否则不会触发。无论以那种方式,只要滚动条滚动,事件都会触发。触发方式:鼠标滚轮,鼠标拖动,键盘上下键,或者设置的滚动函数,如 scrollTo,scrollBy,scrollByLines, scrollByPages。
当鼠标滚轮滚动时,onwheel事件先被触发,若滚动条滚动,则onscroll事件会相继被触发。
键盘事件主要有:onkeydown(按键被按下),onkeyup(按键被松开)
此外,键盘事件一般都会绑定给一些可以获取到焦点的对象(例如文本框)或者是document
对于onkeydown来说:
一般来说我们使用键盘事件重点是获取用户按下的是什么
可以通过keyCode()来获取按键的编码(可能未来会过时)
这里还有使用 事件对象.key来得到按下的内容
除此之外,键盘事件对象还提供了几个属性:
这些属性可以用来判断alt、ctrl、shift是否被按下,如果按下则返回true,反之返回false
值得注意的是,在文本框中输入内容,属于onkeydown的默认行为,如果取消了默认行为,则在文本框中不会出现输入的内容
所谓的事件的冒泡 指的就是事件的向上传导,当后代元素上的事件被触发时,其祖先上元素的相同事件也会被触发
在开发中,大部分情况下冒泡都是有用的,如果不希望发生冒泡可以通过事件对象来取消冒泡
有时候我们会希望为多个对象绑定同一种事件,前面的学习中,我们使用了for循环+this绑定事件 的方法来实现,但是这样会存在一个问题:该方法只能为已有的对象绑定事件,而新添加的对象必须重新绑定
我们希望的是:只绑定一次事件,即可应用到多个元素上,即使元素是后添加的
这里我们可以 将其事件绑定给元素的共同祖先元素
这里我们便得到了事件的委托的概念:
不过事件委派也会带来一定的问题,例如可能导致当 触发事件的对象 与 我们期望的 不同时也会得到响应,此时我们需要在 响应函数内 对 触发事件的对象 进行判断(利用 事件对象中的target属性,它表示触发事件的对象)
事件的传播分为三个阶段:
如果希望在捕获阶段就触发事件,可以将addEventListener()的第三个参数设置为true(则不会在冒泡阶段触发事件了)
一般情况下我们不会希望在捕获阶段触发事件,所以这个参数一般都是false

DOM全称 Document Object Model 文档对象模型
提示:Document 对象是 Window 对象的一部分,可通过 window.document 属性对其进行访问

JS中通过DOM来对HTML文档进行操作,只要理解了DOM就可以随心所欲地操作WEB页面
简而言之就是 我们把文档(即一个html页面)中的标签、属性、文本转换成对象来管理



理解:
例如下面这个例子演示对象化:

我们直接通过案例进行演示:
需求:当用户点击“校验”按钮时,获取输入框的内容,验证其是否合法(规则是由字母或数字或下划线组成且长度为5—12)

这里使用到了正则表达式(可参考JavaScript RegExp 对象)
下面是另外两种常见的验证提示


注意这里的innerHTML是我们所得到的dom对象的一个属性,该属性可读可写


依旧直接看案例
我们这里希望实现如下三个功能:


这里的我们得到的dom对象同样是可以操作对应标签的属性如checked属性
且得到的集合的操作与数组一样,集合中都是dom对象,元素顺序是它们在html页面中从上到下的顺序
该方法与方法3大同小异,只是该方法利用的是标签名来确定得到哪些dom对象而已

.三种查询方法的使用注意事项




下面我们进行演示(需求是使用js为body标签添加一个子节点div标签)

注意:这里我们必须使用window.οnlοad=function(){}保证里面代码在页面加载完成后再执行,否则会出现body对象为空的错误

注意分辨是 属性 还是 方法
如果获取的是子节点的话,DOM标签与标签间空白也会被当做 节点
这里补充一下以下几个属性:

这里也是补充以下这些属性:
1)body 
2)documentElement
DOM的增删改
1)createElement()

2) createTextNode()
3) appendChild()
4) insertBefore()

5) replaceChild()
6) removeChild()

事实上,如果使用innerHTML属性也可以 实现DOM的增删改,但一般我们都是两种方式结合着使用,例如在添加文本时直接使用innerText即可

如图我们希望为allA数组中的每一个元素绑定一个单击事件,这时会带来一个时间差的问题
我们的单击事件是在用户单击时才会执行,但是for循环在页面加载完成后就会执行了,则for循环的循环变量 i ,在单击事件响应时则已经变成了allA.length,所以我们此时在事件中最好不要再使用该循环变量,而是使用this
前面我们都是利用DOM来操作文档中的元素/标签,下面我们介绍如何
1)修改/查询内联样式

注意这里的 样式值 应该是一个 字符串类型

注意,上述通过style属性操作的样式 只是 内联样式,对样式表中的样式无效
2)获取元素当前的样式(查询)

该方法只能用于查询对象,而不能修改对象
该方法有个值得注意的问题是:
如上:为什么我们不是直接return一个getComputedStyle(obj , null).name而是使用【name】呢?
因为如果.name此时形参传入的值是一个字符串的话,那就写死了,因为name是变量,使用中括号会更为严谨,不用如果,name可能就是关键字,有些元素有name这个属性,.name肯定读name这个属性
1)clientWidth和clientHeight

2) offsetWidth和offsetHeight

3)offsetParent()
4)offsetLeft()与offsetTop()
值得注意的是该两个属性都是 只读的 !
5)scrollWidth()与scrollHeight()
它们可以获取元素整个滚动区域的宽度与高度
6) scrollLeft()与scrollTop()
它们可以分别获取 水平滚动条滚动的距离 和 垂直滚动条滚动的距离
值得注意的两个条件是:
但是,在实际使用中,我发现 使用 scrollTop 属性时存在问题:精度问题
即scrollTop的返回值经常是一个小数,此时会导致我们上面在判断是否滚动到底时等式无法成立
具体原因读者可参考 为什么Chrome的document.body.scrollTop可以是小数 - JoyNop
最后的解决方案是使用式子
box1obj.scrollHeight-box1obj.scrollTop-box1obj.clientHeight<1
代替原来的等式
BOM直译过来即 浏览器对象模型,我们前面所学的DOM可以使我们通过JS来操作文档/网页,所以DOM叫做文档对象模型,而BOM可以使我们通过JS来操作浏览器,所以叫做浏览器对象模型
在BOM中,它为我们提供了一组对象,用来完成对浏览器的操作
1)Window
2)Navigator
3)Location
4)History
5)Screen
注意: 这些BOM对象在浏览器中都是作为window对象的属性保存的,因此可以通过window.BOM对象 来使用它们(由于window是全局的,也可以省略window)
由于历史原因,Navigator对象中的大部分属性都已经不能帮助我们识别浏览器了
userAgent是一个字符串,这个字符串中包含有用来描述浏览器信息的内容,即不同的浏览器会有不同的userAgent
常用属性/方法如下:
1)length
2)back()
3)forward()
4)go()
它可以用来跳转到指定的页面
它需要一个整数作为参数
该对象中封装了浏览器的地址栏信息
常用方法如下:
1)assign()
用来跳转到其他的页面,作用和直接修改location的值一样
2)reload()
用于重新加载当前页面,作用与刷新按钮一样
如果在方法中传递一个true,作为参数,则会强制清空缓存刷新
3)replace()
可以使用一个新的页面替换当前页面,调用完毕后也会跳转页面,但是与assign()和直接修改location的值 不同的是,replace()不会生成历史记录,即不能回退
常用方法如下:
1)setInterval()(定时调用)
参数:
返回值:
值得注意的问题是:
我们在给一个元素开启定时器之前,需要将当前元素上的其他定时器关闭
2)clearInterval()
3)setTimeout()(延时调用)
4)clearTimeout()
1. 修改元素样式
前面的学习中,我们学习了在JS代码中,使用style属性修改元素的样式
实际上,利用这种方式修改元素的样式,代码执行的性能是比较差的,因为每当我们修改一个样式,浏览器就需要重新渲染一次页面,而且这种形式在我们需要修改多个样式时也不太方便
我们可以通过修改元素的class属性来间接地修改样式
我们在进行开发的时候,会有前端与后端交互的需求,此时JS如果需要将某些对象传递给服务器,就会出现语言识别的问题
JSON全称JavaScript Object Notation即JavaScript对象表示法
JSON和JS对象的格式一样,只不过JSON字符串中的属性名必须加双引号,其他的和JS语法一致
在JS中,JS为我们提供了一个工具类JSON
这个工具类可以帮助我们将一个JSON转换为JS对象,也可以将一个JS对象转换为JSON
JSON工具类常用属性及方法:
1)JSON.parse()
2)JSON.stringify()