JavaScript笔记

156 阅读6分钟

1. setTimeout

setTimeout是异步执行,当主线任务完成才会执行异步任务,JavaScript是单线程的。

2. 检测类型

  • Array.isArray()判断参数是否为数组
  • instanceof 运算符返回一个布尔值,表示对象是否为某个构造函数的实例
  • typeof 能判断类型:number、string、boolean、symbol、undefined、function;
  • typeof 不能判断类型:object、array、null的变量都返回 object
  • Object.prototype.toString.call()返回参数的类型字符串。

3. reverse()

  • 颠倒数组,length是数组的方法

4. 数组方法

  • Shift()    删除数组的第一个元素,返回被删除的元素,arr.shift()
  • Unshift()  向数组开头添加一个或多个元素,返回新的长度,arr.unshift(e1,e2..)
  • Pop()     删除数组最后一个元素,返回被删除的元素,arr.pop()
  • Push()    向数组尾部添加一个或多个元素,返回新的长度,arr.push(e1,e2..)

5. RegExp 对象

RegExp 对象的主要方法是 exec(),该方法是专门为捕获组而设计的。 exec()接受一个参数,即要应用模式的字符串,然后返回包含第一个匹配项信息的数组;或者在没有匹配项的情况下返回 null。

6. 块内声明

块内声明的变量只要没加var 都算作全局变量。

7. RegExp

  • 对象有 3 个方法:test()、exec() 和 compile()。

  • test() 方法用来检测一个字符串是否匹配某个正则表达式,如果匹配成功,返回 true ,否则返回 false;

  • exec() 方法用来检索字符串中与正则表达式匹配的值。exec() 方法返回一个数组,其中存放匹配的结果。如果未找到匹配的值,则返回 null;

  • compile() 方法可以在脚本执行过程中编译正则表达式,也可以改变已有表达式。

8. typeof

typeof 为Object的值:array object null 都为Object。

9. 公有属性

disabled和readOnly都是表单的公有属性。

10. 实例对象

只有实例对象上不存在的属性和方法才会去原型上查找。

11. 正则匹配

类型介绍
\d匹配一个数字,等价于[0-9]
\w匹配字母、数字或者下划线,等价于 [A-Za-z0-9_]
+匹配前面一个表达式 1 次或者多次
*匹配前一个表达式 0 次或多次
/g全局匹配
       出现0次或1次.  [0,1]
{n} 连续出现相同的个数

12. match()

  • 方法可在字符串内检索指定的值,或找到一个或多个正则表达式的匹配,不写g,只返回第一个匹配

13. import

  • 用于引入css,js暂未发现这种用法。

14. 异步任务

  • 异步任务分为宏任务和微任务,微任务优先级高于宏任务。promise.then执行的微任务。
  • 宏任务包括:script, setTimeout, setInterval, setImmediate, I/O, UI rendering。
  • 微任务包括: Promises, Object.observe, MutationObserver
  • new Promise在实例化的过程中所执行的代码都是同步进行的
  • Promise.then中注册的回调才是异步执行的,将其放入微任务队列中
  • 执行顺序:先执行同步代码,遇到异步宏任务则将异步宏任务放入宏任务队列中,遇到异步微任务则将异步微任务放入微任务队列中,当所有同步代码执行完毕后,再将异步微任务从队列中调入主线程执行,微任务执行完毕后再将异步宏任务从队列中调入主线程执行,一直循环直至所有任务执行完毕。

15. function 

function 后面带  * 的叫做generator function。函数运行时,返回一个迭代器

16. 创建对象的三种方式

  • 利用new object() 创建对象:var obj1 = new object();
  • 利用对象字面量创建对象: var obj2 = {};
  • 利用构造函数创建对象:首字母大写,静态成员只能通过构造函数访问
function Star(name,age) {
    this.name = name;
    this.age = age;
    this.sing = function() {
        console.log('my bog')
    }
}
var ldh = new Star('刘德华',18);
var zxy = new Star('张学友',19);
zxy.Sing();
ldh.Sing();
  1. 原型对象 prototype

直接用构造函数创建会造成内存浪费,主要作用共享方法

  • 原型是一个对象,也称prototype为原型对象。
  • 每一个构造函数都有一个prototype属性,拥有对象的所有属性和方法。
  • 不变的方法,直接定义在prototype对象上。
  • 对象和构造函数都可以访问通过prototype创建的对象
  • 一般情况,公共属性定义构造函数,公共方法定义在原型对象。
function Star(name,age) {
    this.name = name;
    this.age = age;
}
Star.prototype.Star = function() {
    console.log('my dog');
}
var ldh = new Star('刘德华',18);
var zxy = new Star('张学友',19);
zxy.Sing();
ldh.Sing();

18. 对象原型 __proto__

  • 对象都有一个属性__proto__指向构造函数的prototype原型对象
  • __proto__ 对象原型 与原型对象prototype是等价的。
  • 方法查询规则:先看对象是否存在,若不存在则通过__prpto__去原型对象上查找

19. constructor 构造函数

  • __proto__prototype 对象里都有一个constructor
function Star(name,age) {
    this.name = name;
    this.age = age;
}
Star.prototype = {
    // 如果我们修改了原来原型对象,给原型对象赋值的是一个对象,则必须手动添加construction指回原来的构造函数。
    construction: Star,
    Star = function() {
        console.log('my dog');
    }
}
var ldh = new Star('刘德华',18);
var zxy = new Star('张学友',19);
zxy.Sing();
ldh.Sing();

20. 构造函数,实例,原型对象关系

                 star.prototype
star构造函数 ———————————---------—-----> star原型对象(prototype)
           <--------------------------  
      |       star.prototype.construction   ⬆️
      |                                   |  ldh.__proto__
      |                                   |
      ⬇️                                   |             
                      ldh对象实例
              ldh.__proto__.construction
          

21. 原型链

image.png

22. 对象成员查找规则

  • 当访问一个对象的属性或者方法,先查找对象自身属性: ldh.sex = '男'
  • 若没有则查询它的原型也就是__proto__指向的prototype的原型对象: Star.prototype.sex = 'nan'
  • 若没有则查询原型对象的Object的原型对象: Object.prototype.sex = 'nan'
  • 依此类推一直查询到Object为null为止。
function Star(name,age) {
    this.name = name;
    this.age = age;
}
Star.prototype.Star = function() {
    console.log('my dog');
}
var ldh = new Star('刘德华',18);
ldh.sex = '男'
Star.prototype.sex = 'nan'
Object.prototype.sex = 'nan'
console.log(ldh.sex);

23. 原型对象的this指向对象

24. 扩展内置对象

// 给数组自定义一个数组求和方法
Array.prototype.sum = function() {
    var sum = 0;
    for(let i=0;this.length;i++) {
        sum += this[i];
    }
    retrun sum;
}
console.log(arr.sum());
console.log(Array.ptototype)

25. call()

调用这个函数,并且修改函数运行时的this指向

fun.call(thisArg,arg1,arg2...)
  • thisArg: 当前调用函数this的指向对象
  • arg1,arg2: 传递其他参数
function sing(x,y) {
    console.log('l love sing',x,y,this)
}
let obj = { name: 'lisi' }
sing.call(obj,1,2)

26. 父构造函数继承属性

调用father时需将this指向自己

function father(name,age) {
        this.name = name;
        this.age = age;
}
function son() {
        // this是改变father的this由原来的window指向到son的指向
        father.call(this,'lisi',18)
}
var data = new son();
console.log(data)

27. forEach()

  • 遍历
  • 不生成新数组
  • retrun true; 不会终止循环

28. filter

  • 筛选数组
  • 返回新数组
  • retrun true; 不会终止循环

29. some()

  • 查找是否有元素?true :false;
  • 查询到一个满足条件终止循环
  • 用于查找数组中唯一的数值
  • retrun后面必须写true,表示找到了该元素

30. trim()

  • 字符串方法
  • 清空左右字符串空白字符
  • 返回新数组
  • 使用方法 let str = value.trim()
  • 判断方法 if(str === '')

31. apple()

  • apple与call相似,但apple第二个参数是数组
  • apple主要应用:求数组最大值
var arr = [1,99,8,78]
var max = Math.max.apple(Math,arr)

32. bind()

bind()接收参数与call相似,但有不相同点

  • 改变函数内部this指向
  • 返回原函数改变this指向的函数
  • 不会调用原来的函数
  • 例子:let obj = data.bind(parm)
  • 有的函数不需要立即调用,又想改变函数内部this指向

image.png

33. 函数内this指向

image.png

34. class 实现继承

class Animal {
    constructor(name) {
        this.name = name
    } 
    getName() {
        return this.name
    }
}
class Dog extends Animal {
    constructor(name, age) {
        super(name)
        this.age = age
    }
}