四、ECMAScript基础
(一)执行函数
1. 延迟执行函数
使用setTimeout() 函数进行调用,用于在指定的延迟时间后执行一次函数。
调用者:window
参数:匿名函数 / 回调函数 / 代码块
返回值:数字
功能:可以在延迟指定时间内执行匿名函数(仅仅执行一次)
2. 间歇性执行函数
使用 setInterval() 函数进行调用,用于每隔指定的时间间隔执行一次函数。
调用者:window
参数:匿名函数 / 回调函数 / 代码块
返回值:数字/定时器
功能:每隔一段时间执行一次匿名函数 / 回调函数
(二)对象及使用
1. 对象的定义
对象是指以键值对形式出现的数据集合。如: {key1: value, key2: value,....}
通过 { } 直接定义和通过构造函数 new Object() 定义。
2. 对象与数组的区别
对象是无序的。以键-值对的形式存在,通过 obj. name 或 obj ['name'] 访问属性。
数组是有序的。元素按索引顺序排列,通过下标索引值访问属性。如:arrp[0] 。
3. 面向对象和面向过程的区别
3.1 面向对象
主要关注的是 “做什么” (What to do)。程序被分解为一系列相互关联的对象,每个对象都有自己的数据和行为。采用构造函数创建对象,数据存放在对象中。
3.2 面向过程
主要关注的是 “如何做” (How to do)。程序被分解为一系列的步骤或过程,每个步骤都是一个函数或子程序。
(三)面向对象的三种模式
1. 直接量
使用花括号 {} 创建对象字面量。直接在对象字面量中定义对象的属性和方法。优点是简洁易用,适合创建简单的对象。下述代码如果需要改变属性,要不断的重复写这个代码。则代码不适合使用多个相同属性的对象。
2. 工厂模式
使用函数来封装创建对象的细节,生成具有相同属性和方法的对象。函数内部使用字面量的方式创建对象,然后返回该对象。优点是可以创建多个相似的对象,且可以灵活地修改对象的属性和方法。
3. 构造函数
3.1 构造函数定义
构造函数是一种用于构建对象的代码块。由 new 操作符调用以创建空对象,并且调用函数的时候把这个对象返回。
3.2 this 的指向
3.2.1 全局环境中
在全局环境下, this 就是 window 。
3.2.2 普通函数作用域中
在普通函数作用域中,this 就是 window 。
3.2.3 延迟执行定时器函数中
在延迟执行定时器函数作用域中 ,this 是 window。
3.2.4 对象函数作用域中
在 obj 对象的 foo 函数作用域中,this 就 obj 对象。
3.2.5 构造函数中
构造函数中,因为 app 由 New 调用,所以 this 是 a 。
3.2.6 原型函数
原型函数,this是实例对象
3.3 改变this的指向方法
3.3.1 apply 方法
语法: function.apply(newThis, [arg1, arg2, ...])
作用: 使用 apply() 方法可以调用函数,并且指定 this 的值。它接受一个数组作为函数的参数。
3.3.2 call 方法
语法: function.call(newThis, arg1, arg2, ...)
作用: 使用 call() 方法可以调用函数,并且指定 this 的值。
3.3.3 bind 方法
语法: function.bind(newThis)(arg1, arg2, ...)
作用: 使用 bind() 方法可以创建一个新的函数,这个函数的 this 值被绑定到提供的值。
3.4 构造函数模式
使用函数作为构造器,通过 new 关键字来创建对象实例。构造函数内部使用 this 关键字来定义对象的属性和方法。优点是可以创建具有相同属性和方法的对象,且继承机制更加灵活。
(四)原型
1. 原型对象
原型是每一个构造函数都有 prototype 属性。这个属性的类型是 'object', 所以也叫做原型对象。我们可以把那些不变的方法,直接定义在原型对象上,可以使所有对象的实例共享这些方法。
2. constructor 属性
该属性指向该原型对象的构造函数。
3. 原型链
原型链是指 __proto__ 所形成的链式结构。
以数组构造函数为例 :
构造函数: Array
原型: Array.prototype
实例对象: var arr = new Array()
原型链: arr.__proto__.__proto__.__proto__
(五)面向对象的三大特性
1. 封装
封装是把客观存在的事物添加到对象里面。它使得对象的内部细节不被外部直接访问,从而隐藏了对象的实现细节。
2. 继承
继承是一个对象直接使用另一个对象的属性和方法的机制。子类(派生类)继承父类(基类)的属性和方法,并可以添加新的属性和方法或重写父类的属性和方法。
3. 多态
多态是一个对象 / 函数在不同的应用场景下有不同的表现形式,多态允许子类型重写父类型的方法,从而实现不同的行为。
(六)浅拷贝和深拷贝
1. 浅拷贝
浅拷贝是指在复制数据的过程中,不考虑数据的类型,不管是基本类型,还是引用类型,会全部复制。
2. 深拷贝
深拷贝是指在复制数据的过程中,会对数据的类型进行判断,如果是基本数据类型,那就直接复制(赋值);如果是引用类型的数据,那就执行递归,继续判断数据的类型,继续深层次的复制,直到复制的数据类型为基本类型为止,终止递归。
(七)数组排序
1. 升序
使用 sort(){ } 方法,具体代码如下
2. 降序
3. 乱序
4. 冒泡排序
5. 递归排序
(八)正则表达式
1. 正则表达式的定义
正则表达式是用于描述字符串匹配模式的一种形式化语言。主要定义方法有两种:
使用 / / 直接定义、使用 new RegExp(/ /)定义
2. 正则表达式的方法
2.1 test() 方法
test()方法用于检测一个字符串是否匹配某个正则表达式模式。它返回一个布尔值,表示是否匹配。
2.2 exec() 方法
exec()方法用于在一个字符串中搜索匹配模式,并返回一个结果数组。如果没有找到任何匹配,它将返回 null。
2. 正则表达式的种类
2.1. 内部类
2.1.1 简单类
简单类 是允许字符串文本长度比正则格式的要多
2.1.2 预定义类
\d - 匹配任意数字字符,等同于[0-9]
\D - 匹配任意非数字字符,等同于[^0-9]
\w - 匹配任意字母数字字符(包括下划线),等同于[a-zA-Z0-9_]
\W - 匹配任意非字母数字字符,等同于[^a-zA-Z0-9_]
\s - 匹配任意空白字符,包括空格、制表符、换行符等
\S - 匹配任意非空白字符
2.1.3 范围类
[a-z] - 匹配任意小写字母
[A-Z] - 匹配任意大写字母
[0-9] - 匹配任意数字
2.1.4 组合类
[a-zA-Z] - 匹配任意字母(不区分大小写)
[a-z0-9] - 匹配任意小写字母或数字
[A-Za-z0-9_] - 匹配任意字母、数字或下划线
[^a-z] - 匹配任意非小写字母的字符
[^0-9] - 匹配任意非数字的字符
[-._] - 匹配减号、句点或下划线
[!@#$%^&*()] - 匹配常见的特殊字符
2.1.5 反向类
使用 ^ 符号,注意 ^ 是写在 [] 中才表示取反
2.2. 边界语法
^ - 匹配字符串的开头
$ - 匹配字符串的结尾
2.3. 量词
{n} 指定字符出现n次
{n, } 出现n次以上
{n,m}出现n~m次
+ 表示出现一次以上
?表示0次或者1次
* 可以表示0次或者n次
2.4. 其他
/正则表达式/g 表示匹配所有字符串中所有字符。
/正则表达式/i 表示忽略字符串中字母的大小写。