JS需要对象分类吗
需要
- 理由一
有很多对象拥有一样的属性和行为,需要把它们分为同一类
如 square1 和 square2,这样创建类似对象的时候就很方便 - 理由二
但是还有很多对象拥有其他的属性和行为,所以就需要不同的分类
比如 Square / Circle / Rect 就是不同的分类
Array / Function 也是不同的分类,而 Object 创建出来的对象,是最没有特点的对象
类型与类
- 类型 类型是 JS 数据的分类,有 8 种
- 类
类是针对于对象的分类,有无数种
常见的有 Array、Function、Date、RegExp 等
new操作符
- new X() 自动做了四件事情
- 自动创建空对象
- 自动为空对象关联原型,原型地址指定为 X.prototype
- 自动将空对象作为 this 关键字运行构造函数
- 自动 return this
- 构造函数 X
- X 函数本身负责给对象本身添加属性
- X.prototype 对象负责保存对象的共用属性
数组对象(对象模拟数组)
- 定义一个数组
let arr = [1,2,3]
let arr = new Array(1,2,3) // 元素为 1,2,3
let arr = new Array(3) // 长度为 3
-
concat()合并数组,slice()截取数组
-
数组对象的自身属性 '0' / '1' / '2' / 'length'
注意,属性名没有数字,只有字符串 -
数组对象的共用属性 'push' / 'pop' / 'shift' / 'unshift' / 'join'
- 伪数组 没有数组共用的属性的数组就是伪数组
数组的增删查改
- 删
- 查
- for与forEach的区别
for循环能做到的,forEach做不到;
break,continue,forEach做不到(开始了只能走到底);
for循环是关键字,只有块级作用域,没有函数域。
- 增
- 改
- 数组转换
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
如果传的东西不是对象,JS会自动帮你封装成对象
声明个函数,加上'use strict'
即可禁用自动封装成对象
- this是第一个参数,arguments是第一个之后的参数
- this是隐藏参数,arguments是普通参数