这是一套在b站学习pink老师讲JS进阶中个人做的笔记 希望对你有用
教程地址:javaScript进阶面向对象ES6
constructor
构造函数(1-01)
extends
继承父类(1-03)
super
调用父类中的构造函数和普通函数(1-03~05)
insertAdjacentHTML
可以把用字符串创建的元素追加到父元素里面 (1-07)
ondblclick
双击事件
input.select()
文本框里面的内容处于选中状态
继承中的属性或者方法查找原则:就近原则
1. 1. 继承中,如果实例化子类输出一个方法 先看子类有没有这个方法 如果有就先执行子类的
2. 2. 继承中,如果子类里面没有 就去查找父类有没有这个方法 如果有 就执行父类的这个方法(就近原则)
3. 注意: 子类在构造函数中使用super, 必须放到 this 前面 (必须先调用父类的构造方法,在使用子类构造方法)
类里面的 this指向问题
1. 在 ES 6 中类没有变量提升 所以必须先定义类 才能通过实例化对象
2. 类里面的共有的属性和方法一定要加this使用
3. constructor 里面的this指向实例对象 方法里面的this指向这个方法的调用者
class name {
// class body
}
创建实例:
var xx = new name();
class Person {
constructor(name,age) { // constructor 构造方法或者构造函数
this.name = name;
this.age = age;
}
}
// 创建实例:
var ldh = new Person('刘德华', 18);
console.log(ldh.name)
class Father{ // 父类
}
class Son extends Father { // 子类继承父类
}
class Father {
say() {
return '我是爸爸';
}
}
class Son extends Father {
say() {
// console.log('我是儿子');
console.log(super.say() + '的儿子');
// super.say() 就是调用父类中的普通函数 say()
}
}
var son = new Son();
son.say(); // 我是爸爸的儿子
// (1) 创建li元素和section元素
var li = '测试1 ';
// (2) 把这两个元素追加到对应的父元素里面 beforeend(父元素内容的后面)
that.ul.insertAdjacentHTML('beforeend', li)
可以通过原型对象,对原来的内置对象进行扩展自定义的方法,比如给对象增加自定义求偶数和的功能。
注意:数组和字符内置对象不能给原型对象覆盖操作 Array.prototype = {} , 只能是 Array.prototype.xxx = function(){}的方法。
// 调用这个函数,并且修改函数运行时的this指向
fun.call(thisArg, arg1, arg2, ...)
// thisArg : 当前调用函数的this的指向对象
// arg1, arg2 : 传递的其他参数
array.forEach(function(currentValue, index, arr))
array.filter(function(currentValue, index, arr))
array.some(function(currentValue, index, arr))
str.trim()
Object.defineproperty(obj, prop, descriptor)
Object.defineproperty() 定义对象中新属性或修改原有的属性
* obj: 必需,目标对象
* prop:必需,需定义或修改的属性的名字
* descriptor: 必需,目标属性所拥有的特性
Object.defineproperty() 第三个参数 descriptor 说明:以对象形式{}书写
* value: 设置属性的值 默认为undefined
* writable: 值是否可以重写。true|false 默认为false
* enumerable: 目标属性是否可以被枚举。true|false 默认为false
* configurable: 目标属性是否可以被删除或是否可以再次修改特特性 true|false 默认为false
var fn = new Function('参数1','参数2'...,'函数体')
这些this 的指向,是当我们调用函数的时候确定的。调用方式的不同决定了this 的指向不同一般指向我们的调用者:
调用方式 | this指向 |
---|---|
普通函数调用 | window |
构造函数调用 | 实例对象 原型对象里面的方法指向实例对象 |
对象方法调用 | 改方法所属对象 |
事件绑定方法 | 绑定事件对象 |
定时器函数 | window |
立即执行函数 | window |
JavaScript为我们专门提供了一些函数方法来帮我们更优雅的处理函数内部this得到指向问题,常用的有 bind()、call()、apply() 三种方法。
call 方法
call()方法调用一个对象。简单理解为调用函数的方式,但是它可以改变函数的this 指向。
fun.call(thisArg, arg1, arg2, ...)
apply 方法
apply() 方法调用一个函数。简单理解为调用函数的方法,但是它可以改变函数的 this 指向
fun.apply(thisArg, [argsArray])
bind 方法
bind() 方法不会调用函数,但是能改变函数内部this指向
fun.bind(thisArg, arg1, arg2, ...)
相同点:
区别点:
主要应用场景:
JavaScript除了提供正常模式外,还提供了严格模式(strict mode)。 ES5的严格模式是采用具有限制性
JavaScript变体的一种方法,即在严格的条件下运行js代码
严格模式在IE10以上版本的浏览器才会被支持,旧版本浏览器中会被忽略
严格模式对正常的 JavaScript语义做了一些更改:
严格模式可以应用到整个脚本或个别函数中。因此在使用时,我们可以将严格模式分为“为脚本开启严格模式”和“为函数开启严格模式”两种情况
// 1. 为脚本开启严格模式
// (1) 为整个脚本文件开启严格模式,需要在所有语句之前放一个特定语句 "use strict";(或'use strict';).
<script>
"use strict";
console.log("这是严格模式。");
script>
// 因为 "use strict" 加了引号,所以老版本的浏览器会把它当作一行字符串而忽略。
// (2) 有的 script 基本是严格模式,有的 script 脚本是正常模式,这样不利于文件合并,所以可以将整个脚本文件放在立即执行的匿名函数之中,这样独立创建一个作用域而不影响其他 script脚本文件。
<script>
(function(){
"use strict";
var num = 10;
function fn(){}
})();
script>
2. 为函数开启严格模式
要给某个函数开启严格模式,需要把 "use strict"; (或'use strict';) 声明放在函数体所有语句之前。
高阶函数是对其他函数进行操作的函数,它接收函数作为参数或将函数作为返回值输出。
function fn(callback){
callback&&callback();
}
fn(function(){alert('hi')})
function fn(){
return function(){}
}
fn();
此时fn 就是一个高级函数
函数也是一种数据类型,同样可以作为参数,传递给另一个参数使用,最典型的就是作为回调函数。
《复习知识》
什么是闭包 (3-10)
闭包的作用 (3-11)
闭包总结
什么是递归? (3-16~19)
浅拷贝和深拷贝 (3-20~21)
^\w+([-+.]\w+)*@\w+([-.]w+)*\.\w+([-.]\w+)*$
/^[a-z0-9_-]{3,16}$/
在 JavaScript中,可以通过两种方式创建一个正则表达式。
var 变量名 = new RegExp(/表达式/);
var 变量名 = /表达式/;
test() 正则对象方法,用于检测字符串是否符合该规则,该对象会返回 true 或 false 其参数是测试字符串。
regexObj.test(str)
正则表达式中的边界符(位置符) 用来提示字符所处的位置,主要有两个字符
边界符 | 说明 |
---|---|
^ | 表示匹配行首的文本(以谁开始) |
$ | 表示匹配行尾的文本(以谁结束) |
如果 ^ 和 $ 在一起,表示必须是精确匹配
字符类表示有一系列字符可供选择,只要匹配其中一个就可以了。所有可供选择的字符都放在方括号[] 内。
(1) [-] 方括号内部范围符-
// (1) [-] 方括号内部范围符-
// (2) 字符组合
/^[a-z0-9]$/.test('a') // true
// (3) [^] 方括号内部 取反符^
/^[^abc]$/.test('a') // false
量词符用来设定某个模式出现的次数。
量词 | 说明 |
---|---|
* | 重复零次或更多次 |
+ | 重复一次或更多次 |
? | 重复零次或一次 |
{n} | 重复n次 |
{n,} | 重复n次或更多次 |
{n,m} | 重复n到m次 |
(1) 大括号 量词符:里面表示重复次数
(2) 中括号 字符集合。匹配方括号中的任意字符
(3) 小括号 表示优先级
可以在线测试: https://c.runoob.com/
预定义类指的是某些常见模式的简写方式
预定义 | 说明 |
---|---|
\d | 匹配0-9之间的任一数字,相当于 [0-9] |
\D | 匹配所有0-9以外的字符,相当于 [ ^0-9] |
\w | 匹配任意的字母、数字和下划线,相当于 [A-Za-z0-9_] |
\W | 除所有字母、数字和下划线以外的字符,相当于 [ ^A-Za-z0-9_] |
\s | 匹配空格 (包括换行符、制表符、空格符等),相等于[\t\r\n\v\f] |
\S | 匹配非空格的字符,相当于 [ ^\t\r\n\v\f] |
replace 替换
replace() 方法可以实现替换字符串的操作,用来替换的参数可以是一个字符串或者一个正则表达式。
stringObject.replace(regexp/substr,replacement)
正则表达式参数
/表达式/[switch]
switch (也称为修饰符) 按照什么样的模式来匹配,有三种值:
ES 的全称是 ECMAScript, 他是由 ESMA 国际标准化组织,制定的一项脚本语言的标准化规范。
年份 | 版本 |
---|---|
2015年6月 | ES2015 |
2016年6月 | ES2016 |
2017年6月 | ES2017 |
2018年6月 | ES2018 |
… | … |
ES6 实际上是一个泛指,泛指 ES2015 及后续的版本。
ES6中新增的用于声明变量的关键字。
if (true) {
let a = 10;
}
console.log(a); // a is not defined
注意:使用let 关键字声明的变量才具有块级作用域,使用var声明的变量不具备块级作用域特性
console.log(a); // a is not defined
let a = 20;
var tmp = 123;
if (true) {
tmp = 'abc';
let tmp;
}
作用:声明常量,常量就是值(内存地址) 不能变化的量
if (true) {
const a = 10;
}
console.log(a); // a is not defined
const PI; // Missing initializer in const declaration
const = PI;
PI = 100; // assignment to constant variable.
const ary = [100, 200];
ary[0] = 'a';
ary[1] = 'b';
console.log(ary); // ['a', 'b'];
ary = ['a','b']; // assignment to constant variable.
var | let | const |
---|---|---|
函数级作用域 | 块级作用域 | 块级作用域 |
变量提升 | 不存在变量提升 | 不存在变量提升 |
值可更改 | 值可更改 | 值不可更改 |
ES6 中允许从数值中提取值,按照对应位置,对变量赋值。对象也可以实现解构。
1.数值解构
let [a, b, c] = [1, 2, 3];
console.log(a);
console.log(b);
console.log(c);
// 如果解构不成功,变量的值为undefined
let [foo] = [];
let [bar, foo] = [1];
let person = { name: 'zhangsan', age: 20 };
let { name, age } = person;
console.log(name); // 'zhangsan'
console.log(age); // 20
let {name: myName, age: myAge} = person; // myName myAge 属性别名
console.log(myName); // 'zhangsan'
console.log(myAge); // 20
ES6中新增的定义函数的方法。
() => {}
const fn = () => {}
函数体中只有一句代码,且代码的执行结果就是返回值,可以省略大括号
function sum(num1, num2) {
return num1 + num2;
}
const sum = (num1, num2) => num1 + num2;
如果形参只有一个,可以省略小括号
function fn(v){
retuen v;
}
const fn = v => v;
箭头函数不绑定this关键字,箭头函数中的this,指向的是函数定义位置的上下文this。
const obj = { name: '张三'}
function fn () {
console.log(this); // obj
return () => {
console.log(this) // obj
}
}
const resFn = fn.call(obj);
resFn();
function sum (first, ...args) {
console.log(first); // 10
console.log(args); // [20, 30]
}
sun(10, 20, 30);
let students = ['wangwu', 'zhangsan', 'lisi'];
let [s1, ...s2] = students;
console.log(s1); // wangwu
console.log(s2); // ['zhangsan', 'lisi']
let aty = [1, 2, 3];
// ...ary // 1, 2, 3
console.log(...ary); // 1 2 3
console.log(1, 2, 3);
//方法一
let ary1 = [1, 2, 3];
let ary2 = [3, 4, 5];
let ary3 = [...ary1, ...ary2];
// 方法二
ary1.push(...ary2);
let oDivs = document.getElemenetsByTagName('div');
oDivs = [...oDivs];
let arrayLike = {
'0': 'a',
'1': 'b',
'2': 'c',
length: 3
};
let arr2 = Array.from(arrayLike); // ['a', 'b', 'c']
let arrayLike = {
"0": 1,
"1": 2,
"length": 2
}
let newAry = Array.from(aryLike, item => item * 2)
用于找出第一符合条件的数组成员,如果没有找到返回undefined
let ary = [{
id: 1,
name: '张三'
},{
id: 2,
name: '李四'
}];
let target = ary.find((item, index) => item.id == 2);
用于找出第一个符合条件的数组成员的位置,如果没有找到返回-1
let ary =[1, 5, 10, 15];
let index = ary.findIndex((value,index) => value > 9);
console.log(index); // 2
表示某个数组是否包含给定的值,返回布尔值
[1, 2, 3].includes(2); // true
[1, 2, 3].includes(4); // false
ES6 新增的创建字符串的方式,使用反引号定义。
let name = `zhangsan`;
特点1. 模板字符串中可以解析变量。
let name = '张三';
let sayHello = `hello,my name is ${name}`; // hello,my name is zhangsan
特点2. 模板字符串中可以换行
let resilt = {
name: 'zhangsan',
age: 20,
sex:'男'
}
let html = `
${result.name}
${result.name}
${result.name}
`;
特点3. 在模板字符串可以调用函数。
colst aryHello = function () {
return '哈哈哈哈 追不到我吧 我就是这么强大';
};
let greet = `${sayHello()} 哈哈哈哈`;
console.log(greet); // 哈哈哈哈 追不到我吧 我就是这么强大 哈哈哈哈
let str = 'Hello world!';
str.startsWith('Hello') // true
str.endsWith('!') // true
实例方法: repeat() (5-16)
repeat 方法表示将原字符串重复n次,返回一个新字符串。
'x'.repeat(3) // "xxx"
'hello'.repeat(2) // "hellohello"
ES6 提供了新的数据结构 Set 它类似于数组 但是成员的值都是唯一的 没有重复的值
Set本身是一个构造函数,用来生成 Set 数据结构。
const s = new Set;
Set函数可以接受一个数组作为参数,用来初始化。
const set = new Set([1, 2 ,3 ,4 , 5]);
const s = new Set();
s.add(1).add(2).add(3); // 向 set 结构中添加值
s.delete(2) // 删除 set 结构中的2值
s.has(1) // 表示 set 结构中是否有1这个值 返回布尔值
s.clear() // 清除 set 结构中的所有值
遍历
Set 结构的实例与数组一样,也拥有forEach方法,用于对每个成员执行某种操作,没有返回值
s.forEach(value => console.log(value))