《JS需要对象分类吗》

118 阅读3分钟

JS需要对象分类吗

需要

  • 理由一 有很多对象拥有一样的属性和行为,需要把它们分为同一类
    如 square1 和 square2,这样创建类似对象的时候就很方便
  • 理由二 但是还有很多对象拥有其他的属性和行为,所以就需要不同的分类
    比如 Square / Circle / Rect 就是不同的分类
    Array / Function 也是不同的分类,而 Object 创建出来的对象,是最没有特点的对象

类型与类

  • 类型 类型是 JS 数据的分类,有 8 种
  • 类 类是针对于对象的分类,有无数种
    常见的有 Array、Function、Date、RegExp 等

new操作符

  • new X() 自动做了四件事情
  1. 自动创建空对象
  2. 自动为空对象关联原型,原型地址指定为 X.prototype
  3. 自动将空对象作为 this 关键字运行构造函数
  4. 自动 return this
  • 构造函数 X
  1. X 函数本身负责给对象本身添加属性
  2. X.prototype 对象负责保存对象的共用属性

数组对象(对象模拟数组)

屏幕截图 2022-06-18 105805.png

- 定义一个数组

let arr = [1,2,3]
let arr = new Array(1,2,3) // 元素为 1,2,3
let arr = new Array(3) // 长度为 3

  • concat()合并数组,slice()截取数组 屏幕截图 2022-06-18 110444.png

  • 数组对象的自身属性 '0' / '1' / '2' / 'length'
    注意,属性名没有数字,只有字符串

  • 数组对象的共用属性 'push' / 'pop' / 'shift' / 'unshift' / 'join'

屏幕截图 2022-06-18 105904.png

  • 伪数组 没有数组共用的属性的数组就是伪数组

数组的增删查改

屏幕截图 2022-06-18 141205.png

屏幕截图 2022-06-18 141227.png

屏幕截图 2022-06-18 141402.png

屏幕截图 2022-06-18 141429.png

  • for与forEach的区别
    for循环能做到的,forEach做不到;
    break,continue,forEach做不到(开始了只能走到底);
    for循环是关键字,只有块级作用域,没有函数域。

屏幕截图 2022-06-18 141449.png

屏幕截图 2022-06-18 141512.png

屏幕截图 2022-06-18 141537.png

屏幕截图 2022-06-18 141553.png

  • 数组转换

屏幕截图 2022-06-18 141906.png

arr.map(item => item*item)

arr.filter(item => item%2 == 0)

arr.reduce(() =>{return sum+item},0)//0=sum

arr.reduce((result,item) =>{return result.concat(item*item)},[])

  • 反转一个字符串: s.split('').reverse().join('');

函数对象

  • 定义一个函数
  • 具名函数: function fn(x,y){return x+y}
    let fn2 = function fn(x,y){return x+y}
  • 匿名函数: 具名函数去掉函数名就是匿名函数 let a = function(x,y){return x+y}
  • 箭头函数 let fn = (x,y) => x+y
    let fn = (x,y) =>({name:x,age:y})
    直接返回会出错,需加个圆括号
  • 构造函数 let fn = new Function('x','y', 'return x+y')
  • 函数对象自身属性 'name' / 'length'
  • 函数对象共用属性 'call' / 'apply' / 'bind'

函数的要数

调用时机
作用域
闭包
形参数
返回值
调用栈
函数提升
arguments(除箭头函数外)
this(除箭头函数外)

闭包

如果一个函数用到了外部的变量,那么这个函数加这个变量,就叫做闭包

调用栈

  • 什么是调用栈 JS 引擎在调用一个函数前,需要把函数所在的环境 push 到一个数组里,这个数组叫做调用栈 等函数执行完了,就会把环境弹(pop)出来,然后 return 到之前的环境,继续执行后续代码。

函数提升

  • 什么是函数提升 function fn(){}
    不管你把具名函数声明在哪里,它都会跑到第一行
  • 什么不是函数提升 let fn = function(){}
    这是赋值,右边的匿名函数声明不会提升

this

屏幕截图 2022-06-18 152048.png 如果传的东西不是对象,JS会自动帮你封装成对象
声明个函数,加上'use strict'
即可禁用自动封装成对象

  • this是第一个参数,arguments是第一个之后的参数
  • this是隐藏参数,arguments是普通参数

屏幕截图 2022-06-18 152752.png

屏幕截图 2022-06-18 153147.png

屏幕截图 2022-06-18 153200.png

屏幕截图 2022-06-18 153313.png

屏幕截图 2022-06-18 153505.png