函数
对于js来说,函数就是把任意一段代码放在一个盒子里面
在我想要这段代码执行的时候,直接执行这个盒子里的代码就行
定义函数
1.声明式
function 函数名(参数){一段代码}
注:可以先把调用函数写在声明式前面,会进行预解析
2.赋值式
var 函数名=function(参数){一段代码}
注:不可以先把调用函数写在声明式前面,会报错
调用函数
在js里直接写
定义过函数名+()
注:函数里面定义的变量,没法在外面调用使用
函数的参数
定义函数时()的作用就是放置参数
参数分为两种形参和实参
形参是定义函数时括号放的
实参是调用函数时括号放的
实参对应赋值给形参
(如果只有一个实参,会传给第一个形参)
形参只能在函数内部使用,没法直接调用,预解析也无法对其作用
函数的返回值
函数调用本身也是一个表达式,表达式就应该有一个值
但不加返回值的话函数执行完,结果不会出现
注意:1.return看需求使用,不是100%
2.return后面代码无法执行
如果满足 false 直接结束函数(因为已经给函数完成赋值)>3.如果是分支语句(if、switch等)可以写多个return,因为只会匹配到一个return执行
预解析
就是js代码的编译和执行
在代码执行之前,先对代码进行通读和解释,然后在执行代码
js在代码运行时,会有两个环节解释代码和执行代码
预解析只会提升到一个script的上面
解释代码(变量声明提升)
在所有代码执行之前进行解释,所以叫做预解析(预解释)
解释内容有两个:
声明式函数
先声明有一个变量名是函数名,并用这个名字代表的内容是一个函数
var关键字
先声明有一个变量
因为把声明提前了,告诉js有这样一个变量,第一个log没有赋值,第二个log上面有赋值所以正常显示。
赋值式同理,var 函数名,会提前,对函数名(等价于undefined)进行调用,但无法被调用执行(不知道要赋函数还是变量)所以函数赋值式,没法进行预处理
函数和变量定义的名称相同时
作用域
全局作用域
最大的作用域
全局作用域中定义的变量可以在任何地方使用
页面打开的时候,浏览器会自动给我们生成一个全局作用域window
这个作用域会一直存在,直到网页关闭就销毁了
定义的函数和变量就是全局函数和变量
局部作用域
局部作用域就是在全局作用域下面开辟出来的一个相对小一些的作用域
在局部作用域中定义的变量只能在这个局部作用域中使用
在js中只有函数能生成一个局部作用域,别的都不行
一个函数就是一个局部作用域
访问规则(就近原则)
在想获取一个变量的值的时候,我们管这个行为叫做访问
获取变量的规则:
1.在自己作用域内查找,如果有,直接拿来用
2.如果没有返回上一级作用域查找,如果有,直接拿来用
3.如果没有,就继续去上一级作用域查找,以此类推
4.如果一直到全局作用域都没有这个变量,会直接报错(该变量 is not defined)
赋值规则
在想给一个变量赋值的时候,那么就先要找到这个变量,再给他进行赋值
变量赋值的规则:
1.在自己作用域内查找,有就直接赋值
2.如果没有返回上一级作用域查找,有就直接赋值
3.如果没有,就继续去上一级作用域查找,以此类推
4.如果一直到全局作用域都没有,那么会把这个变量定义为全局变量,再给他赋值
引出函数计算数值
对象数据类型
对象是一个复杂数据类型
存储了一些基本数据类型的一个集合
var obj={
num:100,(key:value)
str:‘hello world’, (key:value)
boo:true (key:value)
}
此时的 { } 是写一些数据的
对象就是一个键数对的集合
{ } 里面每一个键都是一个成员
也就是说我们把一些数据放在一个对象里面,他们就互不干扰了
理解:一个房子,把想要的数据放进去,然后把房子的地址给变量名,当我们需要某个数据的时候,可以根据变量名里面存储的地址找到相应的房子,然后去房子里面找对应的数据
创建方式
1.字面量创建一个对象
var 对象名 = { 数据 }
2.内置构造函数
var 对象名 = new Object()
对象名.key = value
增删改查
查:
document.write(数据+对象名.key)或
console.log(对象名【“key”】)
改:
对要改的对象进行 对象名.key=更改的数据 改动或对象名【“key”】= 更改的数据
该行代码之后,该对象名的该key会变成更改之后的数据
删:
delete 对象名.key或delete 对象名【“key”】
彻底删除
增:
var 对象名 = { }
对象名【“key”】= 增添的数据
若不加 “ ” ,key会变成一个全局变量
对象的遍历
for关键字
for(var 变量名 in 对象名){
document.write(变量名+数据等+对象名【变量名】)
}
变量,访问的是key;对象名【变量名】,访问的value
不同数据类型的储存(及数据复制更改)
存储空间分为两种栈 和 堆
栈:主要存储基本数据类型的内容
堆:主要存储复杂数据类型的内容
基本数据类型情况:
var num=100 会在栈空间内存储一个数据
复杂数据类型情况:
var obj ={
key1:value
key2:value
key3:value
}
var obj ={数据}会在堆内存储
当通过另一个var obj2=obj进行数据复制的时候,更改obj2内数据obj内数据也会变 (相当于房子一样,只是复制了一份钥匙,改的还是一个房子里的东西)
当两个对象内数据一样时,进行===也会返回false(因为堆的地址不一样虽然内容一样)(相当于房子内部一样,但不是同一个房子)
进行数据复制并完成新复制的数据更改不影响旧数据方法:
var obj ={
key1:value
key2:value
key3:value
}
var obj2={}
for(var i in obj){
obj2【i】=obj【1】
}
obj2.key1=新的value
不会影响obj中数据了
数组
一个数据的集合
把一些数据放在一个盒子里,按顺序排好,一般一个数组数据类型相同
数组分类
基本数据类型:number、string、Boolean、undefined、null
复杂数据类型:object、function、array
数组创建
1.字面量
var 数组名 = 【】
2. array
var 数组名= new Array()
数组的基本操作
1.获取数组长度
console.log(数组名.length)
2.设置数组长度
数组名.length = 设置长度
如果长度小于数组数据,会从后往前减去
多用于清空数组 长度=0
3.索引
索引从0开始,0,1,2,3,4,5…
数组名【索引数】
索引的数大于真实数据个数时,显示undefined
4.修改
数组名【索引数】=修改数据
索引的数大于真实数据个数时,会在后面索引数对应的位置自动增加数据(前面若还有位置,会自动变成空位置)
5.遍历
for(var i=0;i<数组名.length;i++){
console.log(数组名【i】)
}
或
for(var i=0;i<=数组名.length-1;i++){
console.log(数组名【i】)
}
进行数据复制并完成新复制的数据更改不影响旧数据方法:
冒泡排序法
先遍历数组,让挨着的两个进行比较,如果前一个比后一个大,那么就把两个换个位置。
一遍过后,最大的数会到最后,二遍后第二大的数会到倒数第二的位置
第一遍(最大的在最后)
最终冒泡排序结构:
选择排序法
先假定数组中第0个就是最小的数字的索引
然后遍历数组,只要有一个数字比假设的小,就替换之前记录的索引,结束一遍后,找到最小的数,让最小的数换到第0个位置(最小的数在第一个),第二遍找第二小的数在第1个位置(第二个)
数组常用方法
在数组最后追加元素:
数组名.push(元素)
返回值为数组长度
删除数组最后一个元素:
数组名.pop(元素)
返回值为删除的那个元素
从前面追加元素:
数组名.unshift(元素)
返回值为数组长度
从前面删除元素:
数组名.shift(元素)
返回值为删除的元素
从中间删除元素:
数组名.splice(索引值,从索引值开始删几个)
返回值为删除的【数组】
从中间加元素:
数组名.splice(索引值,从索引值开始删几个(可写0),增加的元素,增加的元素…)
如果删0个,增加的元素会在该索引值对应元素的前面
返回值为删除的【数组】
元素倒叙:
数组名.reverse()
排序:
从小到大:
数组名.sort(function(a,b){
return a-b
})
从大到小:
数组名.sort(function(a,b){
return b-a
})
拼接:
var 新建数组3=数组1.concat(数组2,不同数据类型)
会在数组1后面加上拼接内容
var 新建数组3=数组1.concat()复制数组
数组转成字符串:
数组.join()
若括号里不加东西,每个数据会用逗号连接,加空字符串,逗号消失
截取字符串:
数组.slice(开始索引值,结束索引值)
包前不包后
如果是只写一个索引值,指的是从该索引值开始一直到最后
var 新建数组2=数组1.slice()复制数组
返回查找内容索引值:
从前面开始查:
数组名.indexof(查询内容,从某索引值开始查找)
如果查不到显示-1,查到会显示索引值,但如果两个数据重复,只会显示第一个查到的数据的索引值
从后面开始查:
数组名.lastIndexof(查询内容,从某索引值开始查找)
如果查不到显示-1,查到会显示索引值,但如果两个数据重复,只会显示第一个查到的数据的索引值
foreach回调函数进行遍历
第一个参数,数组里的数据,第二个参数,索引值,第三个参数,数组整体
map回调函数进行映射
新数组arr2中的每个数据为arr对应数据的立方
filter回调函数进行过滤
返回条件 true数据返回到新数组中,false不返回
数据里为对象时,形参打印出来显示每一个对象
需要用对象里面某个具体的key进行过滤
every回调函数进行整体判断
全部数据都满足时才能输出为true
some回调函数进行个别判断
只要有一个数据满足就为true
reduce叠加运算
prev(第一个参数)代表上一次return的返回值,item(第二个参数代表数组里每一个数据)
0代表设置的初始值(即第一次的prev)
数组去重
法一:
法二:
因为原数组是数字类型数据,对象会把key自动变成字符串类型,需要强制转换(i-0等操作)
法三:
var set结构名字 =new Set(要去重的数组)
var 新数组名 = Array.from(set结构名字)