一、数组
(一)、数组原理
1.数组是什么? : 是一种复杂数据类型
2.数组作用? : 可以在变量中 ‘存储多个数据’
3.数组内存原理? : 数组内存由三个部分组成(数组三要素)
(1)元素: 数组中的数据
(2)下标: 元素的位置
(3) 长度: 元素的数量
4、关于数组简单使用
(1).数组声明: let 数组名 = [元素1,元素2,元素3,.......]
(2).数组取值 数组名[下标]
(3 ).数组长度 数组名.length
5、数组遍历语法
5.1.数组语法
(1).数组声明: let 数组名 = [元素1,元素2,元素3,.......]
(2).数组取值 数组名[下标]
(3).数组长度 数组名.length
5.2.数组遍历: 依次读取数组每一个元素值
固定格式的for循环:
for(let i = 0;i < arr.length ;i++){
arr[i]
}
( 二)、数组操作
1.查询与修改
1.1声明数组 let 数组名 = [元素1,元素2,元素3,....]
1.2.数组取值(查) 数组名[下标]
1.3.数组赋值(改) 数组名[下标] = 值
2、数组新增元素
2.1数组名.push(元素) : 一个或多个元素,添加到末尾
2.2数组名.unshift(元素) : 一个或多个元素,添加到末尾
3、数组删除元素
3.1数组名.pop(元素) : 删除末尾元素
3.2数组名.shift(元素) : 删除开头元素
4、数组删除splice
4.1arr.splice(start,deleteCount)
第一个值: 起实位置。 从0开始
第二个值: 要删除的数量
* 如果没有指定数量,则会删除从起始位置到后面所有元素
二、函数
(一)、有关函数介绍
1.函数语法
1.1声明函数 : 是一个存储过程,此时不会执行函数体代码
function 函数名(){
函数体代码: 需要存储的一段代码
}
1.2调用函数 : 执行函数体代码
函数名()
2.函数传参
2.1函数语法 : 函数是一种用于存储代码块的复杂数据类型
* 作用:解决代码复用问题
2.2声明函数 : 声明函数只是把代码存起来,不会执行函数体
function 函数名(){
函数体代码: 需要存储的一段代码
}
2.3调用函数 : 执行函数体代码
函数名()
2.4函数参数 : 调用者 传递数据 函数
2.4.1 传:调用者
函数名(实际参数)
2.4.2收:函数
function 函数名(形式参数){ //函数体代码 }
2.4.3函数传参本质: 实参给形参赋值的过程
(1)函数传参是按照传入顺序一一赋值
(2)函数每一次调用传参过程都是独立的,互不影响
(3)函数 形参数量 和 实参数量 可以不一致的
3.函数默认参数
3.1.函数默认参数,我们自己在开发中使用不多。(了解后面很多js框架函数默认参数底层原理)
3.2函数默认参数 使用 逻辑运算符短路运算(逻辑中断)
3.2.1短路运算: 左边式子就可以决定结果,右边式子不执行
&& : 一假则假
|| : 一真则真
! : 取反(没有短路运算,因为只有一个式子)
3.2.2 短路规则:
&& : 找假。 左边式子值可以转成false,则无条件返回左边式子的值,右边不执行。 反之无条件返回右边式子的值。
|| : 找真。 左边式子值可以转成true,则无条件返回左边式子的值,右边不执行。 反之无条件返回右边式子的值。
4.函数返回值: 函数 传递数据 给调用者
4.1 传 : 函数
function 函数名(){ return 值 }
4.2 收 : 调用者
let 变量名 = 函数名()
4.3 注意点
(1)函数return关键字后面的代码不会执行的
* 只要有return关键字,函数体立即结束执行。
(2)如果函数没有return,则默认返回值是undefined
5.锻炼函数所有语法外,还加强逻辑思维的锻炼(加强案例)
5.1本案例所采用的思想称之为:开关思想
5.2开关思想用于解决此类问题 : 判断数组中是否所有元素满足条件
5.3开关思想主要分为三个流程
(1)声明一个开关变量(一般默认为true)
(2)遍历数组,判断每一个元素是否满足条件,遇到不满足修改开关变量为false
* 遇到满足的不用修改,因为默认就是true
(3)返回开关变量值

(二)、函数作用域
1.js变量作用域: 变量可以使用的区域
* 作用:避免变量污染(变量名相同导致代码冲突)
2.js三种作用域
2.1 全局作用域(全局变量) : 在函数外面let的变量
2.2 局部作用域(局部变量) : 在函数里面let的变量
2.3 快级作用域(快级变量) : 在分支或循环大括号中let的变量
3.作用域链
3.1作用域链: 默认情况下,代码处于全局作用域(0级链),当声明一个函数之后就会开辟一个局部作用域(1级), 而函数里面又可以声明一个函数,又会形成新的作用域(2级),以此类推形成的结构称之为作用域链
3.2变量访问规则: 就近原则
当你在一个作用域访问变量的之后,首先会看当前作用域有没有声明。如果有则访问。 没有则往上级作用域查找,有没有声明。有则访问,没有则继续往上。直到作用域最顶端0级,如果还没有找到。则程序报错 xxx is not defined
4.匿名函数
4.1匿名函数 : 没有函数名的函数
4.2匿名函数作用 : 开辟局部作用域,避免全局变量污染
4.3小细节: 匿名函数自执行的时候,上一个语句分号不能省略
5.了解高阶函
5.1任何数据类型共同点(值类型,引用类型)
* 都有变量赋值特点
5.2引用类型特点
* 函数: 函数名()
* 数组: 数组名[下标]
* 对象: 对象名.属性名
三、对象
(一)、对象概念
1.对象是什么 : 对象是一种复杂数据类型
2.对象作用 :以键值对方式存储多个数据
3.对象与数组异同点
相同点:都是复杂数据类型,都可以存储多个数据
不同点: 存储方式不同
数组: 有序存储
对象: 无序存储(键值对)
(二)、对象语法
1.声明对象
let 对象名 = {
属性名:属性值,
属性名:属性值,
}
2.取值语法
对象名.属性名
3.细节: 对象中的属性值是什么数据类型, 取出来的时候就可以使用这个类型的所有语法
如,对象的属性值是 数组, 则可以: 对象名.属性名[下标]
如,对象的属性值是 函数, 则可以: 对象名.属性名()
(三)、对象操作
(1)查询对象属性
1.查询对象特点
1.1 如果属性名存在,则获取属性值
1.2 如果属性名不存在,则获取undefined
2.查询对象属性两种语法
点语法 obj.属性名
[]语法 obj['属性名'] obj[ 变量名 ]
3.总结 : 对象取值优先使用点语法, 在需要解析变量的时候使用 [] 语法
(2)新增与修改属性
1.查询属性
点语法 对象名.属性名
[]语法 obj['属性名'] obj[ 变量名 ]
2.修改属性
对象名.属性名 = 值
对象名['属性名'] = 值
3.新增属性
(1)如果已经存在的属性赋值,则是修改
(2)如果不存在的属性赋值,则是新增
4.删除对象属性
delete 对象性.属性名
(四)、对象遍历
1.遍历数组: 固定for循环
for(let i = 0;i< arr.length;i++){ arr[i] }
2.遍历对象 : 特殊的for-in循环 (专用于遍历对象)
for(let key in 对象名){ 对象名[key] }
(五) 、内置对象
1.内置对象 : 由js作者提前写好的对象,我们直接拿来使用即可
* 说人话 : 相当于手机内置应用,如短信、电话。 一买来就自带的,直接使用
2. Math:数学对象
(六)、值类型和应用类型
1.值类型(简单数据类型) : string number boolean undefined null
* 栈中存储数据,赋值拷贝的也是数据,修改拷贝后的数据对原数据‘没有影响’
2.引用类型(复杂数据类型) : array function object
* 栈中存储地址,数据存在堆中。赋值拷贝的是地址,修改拷贝后的数据对元素‘有影响’
\