递归函数
什么是递归
在编程中,递归就是一个自己调用自己的手段
递归函数:在一个函数内部,调用了自己,循环往复 自己作用域没有(fun内部),去上一层查找(fn内部)
function fn() {
fn()
}
fn()
和循环类似
需要有初始化,自增,执行代码,条件判断
如果没有就会是一个没有尽头的递归函数,通常称这种递归为:死递归
递归案例
// 求 1-5 的和
// 1. 先写结束条件(为了避免出现死递归)
function add(n) {
if(n === 5) {
return 5
} else {
return n + add(n + 1) // 2. 写不满足条件时的递归操作
}
}
add(1)
简单了解对象
什么是对象
对象是一个复杂数据类型,也叫做引用数据类型
简单来讲就是存储了一些基本数据类型的集合
var obj = {
num: 100,
str: "hello"
}
这里的 {} 和函数中的 {} 不一样,函数内部书写代码,对象里面是书写数据的
对象就是一个键值对的集合
键值对
对象 obj 中,num是键,100是值
其实就是类似于准备了一个房子,把我们想要的数据放进去,然后把房子的地址给到变量名,当我们需要某一个数据的时候,就可以根据变量名里面存储的地址找到对应的房子,然后去房子里面找到对应的数据
创建对象
- 字面量方式创建对象
var obj = {键值对, 键值对} - 内置构造函数创建
var obj = new Object()
对象对于 键(key) 的要求
推荐使用符合变量名命名规则和规范的名字
可以使用纯数字当作键名 --- 这种情况下该属性会排列在最前面
可以使用任何特殊符号 --- 使用特殊符号的时候,在书写时需要被引号包裹
对象数据类型的操作(增删改查)两种语法
- 点语法
var obj = {}
obj.name = "YYJ" // 增
obj.name = "YYJ0126" // 改
console.log(obj.name) // 查
delete obj.name // 删
- 中括号语法(数组语法)
var obj = {}
obj["name"] = "YYJ" // 增
obj["name"] = "YYJ0126" // 改
console.log(obj["name"] // 查
delete obj["name"] // 删
两者的差异
符合变量命名规范与规则的情况,两者并无差异
操作不符合变量命名规范和规则的名称时,比如纯数字或者带有特殊符号的,就只能用中括号语法
设计变量相关的时候,只能使用中括号语法
for in 循环遍历对象
const obj = {
num: 100,
str: "hello"
}
for(let key in obj){
console.log("我执行了", key, obj[key]
}
// "我执行了", num, 100
// "我执行了", str, "hello"
数组数据类型
什么是数组
数组字面意思就是存放数字的一个组合,但这么说太过于片面,更完善的说法应该是数组是存放一些数据的集合
简单来说就是我们把数据放到一个盒子中,这个盒子就是数组,注意数字内的数据是有顺序的
var arr = [1, 2, 3, "qwe", true, undefined, null]
创建数组数据类型
- 使用字面量的方式创建数组
var arr = []
- 内置构造函数创建数组
// 创建一个空数组
var arr = new Array()
// 创建一个有长度的数组
var arr1 = new Array(10)
// 创建一个有内容的数组
var arr2 = new Array(1, 2, 3)
数组的 length 属性
length 代表数组内有多少个成员(数据)
var arr = [1, 2, 3]
console.log(arr.length) // 3
数组的 索引 概念
索引也叫做下标,就是指一个数据在这个数组内排列在第几个位置上
在所有的语言中,索引(下标)都是从 0 开始的
var arr = ["hello", "world"]
console.log(arr[0], arr[1]) // "hello", "world"
for 循环遍历数组
遍历数组就是想办法拿到数组的每一个元素,通常我们可以通过下标获取到元素的某一项,所以我们只需要想办法拿到数组的所有下标即可
var arr = [1, 2, 3]
for(let i = 0; i < arr.length; i++) {
console.log(arr[i])
}