周末总结
object数据类型的3种表现形式:
1、null 空
2、{ } 对象,1个大内存空间存放很多小内存空间,键值对且键值对无序,只看名称
3、[ ] 数组,1个大内存空间存放很多小内存空间,小空间有序,按空间顺序
定义数组:Array
1、var arr = [ ]
2、var arr = new Array( )
数组:
1、数组中的数据其类型无限制
2、数组中的小空间编号(下标)从0开始递增,最后一个小空间编号=数据个数-1
3、数组长度:获取数组的数据个数用 .length
4、用[ ]定义时,当[ ]中只有1个数字,表示仅有1个小空间且数据是次数字
5、用new Array( )定义数据时,( )中只有1个数字,则大空间有 次数字 个小空间
数组操作:
1、获取具体数据:数组名[下标]
2、设置数据:数组[下标] = 值,当下标大于原数组最大下标时,表示添加,当下标在0~最大下标时,表示修改
3、删除数据方法1:delete 数组名 [下标],只删除数据,没有把小空间一并删掉
4、删除数据方法2:用数组长度删除:arr.length = 数字,当数字<长度,超出次数字部分被删除,当数字>长度,在后面创建多个小空间
数组遍历:
1、访问一次数组中所有元素
2、数组规律:第一个下标是0,最后一个下标是 arr.length-1,即 arr[0], arr[arr.length-1]
3、可用对象的遍历方式去遍历数组
var arr = ['a', 'b', 'c', 'd', 'e'];
arr[10] = 'p'
方法1:
for(var a in arr) {
console.log(arr[a]);
// console.log(a); // 每个元素对应的下标 - 将下标转成字符串类型
}
方法2:
for(var i=0; i<arr.length;i++) {
// console.log(i); // i是数字
console.log( arr[i] );
}
区别1:for in遍历出来的下标是字符串,for i=0遍历出来的是数字
区别2:for in只遍历有值的空间,i=0的方式,会将空的小空间中的值也遍历出来
区别3:for in会遍历原型中的数据,for i=0只能遍历当前空间中的数据
建议使用i=0的方式去遍历
数组嵌套:数组中数据的类型无限制,也可以是数组
基础类型和引用类型
1、数据类型:number/string/boolean/undefined/object(null/{}/[])/function 在js中没有null类型,没有数组类型
2、根据每种数据类型存储方式和赋值方式的不同,将所有数据类型分成2大类:
(1)基础类型:number/string/boolean/undefined/null
(2)引用类型:{}/[]/function
3、从存储的角度来看待不同的数据类型:
基础数据类型会将数据存储在栈中,引用数据类型会将数据存储在堆中,将堆的地址存储在栈中
基础类型
1、我们在内存中存储数据,内存空间会被划分成多个区域,每个区域各司其职
2、存储数据在内存中:有专门的一片空间,用来存储数据,这个空间的名称叫做 栈
引用类型
// var arr = ['a', 'b', 'c']
// 会在栈中开辟空间arr,将数据存放在另一个内存空间 堆 中,堆中存放数据的内存地址,放在栈中arr的空间
通过赋值角度来看待不同的数据类型:
基础类型的赋值,是将其中一个值复制到另一个变量容器中,引用类型的赋值是将一个栈中的内存地址复制一份放到另一个变量容器中,改变其中一个的值,另一个也会发生改变
在进行全等比较的时候:
1、基础类型先比较类型是否相同,如果类型相同了,再比较值是否相等;引用类型,会比较内存地址是否相同
2、基础类型的全等比较 - 比较类型和值
数组方法:
1、对象的方法:对象中的键值对是一个函数 调用方式:对象.方法名()
开头添加一个或多个元素:数组.unshift(一个值或多个值) - 返回添加以后的新数组的长度
开头删除一个元素:数组.shift() - 不需要参数,返回被删除的元素
末尾添加一个或多个元素:数组.push(一个值或多个值) - 返回新数组的长度
末尾删除一个元素:数组.pop() - 返回被删除的值
2、对数组进行增、删、改的方法:数组.splice()
(1)删除语法:数组.splice(要删除的元素开始的下标, 删除个数) - 返回被删除的值组成的数字
(2)修改语法:数组.splice(要删除的元素开始下标, 删除个数, 要放在删除位置的1个或多个值) - 返回被删掉的元素组成的数组,在某个位置删除掉元素后,又放上新的元素 - 间接的形成了修改操作
(3)添加语法:还是修改语法,将删除的个数设置为0即可
3、concat-数组合并:数组.concat(1个或多个元素或数组) - 返回合并以后的大数组
4、sort-数组排序:
(1)数组.sort() - 返回当前排序后的数组 - 将数组从小到大进行排序
(2)数组.sort( function(a, b) { // a和b这两个参数是我们自定义的
return a-b // 表示升序,从小到大
return b-a // 表示降序,从大到小
})
5、reverse-数组翻转: 数组.reverse() - 返回值是当前数组,翻转以后的数组
6、join-将数组元素使用指定的连接符连接成一个字符串:数组.join(指定的连接符) - 返回连接以后的字符串
7、slice-截取数组 - 可以将数组中指定的连续的一部分,单独拿出来做为一个新的数组
数组.slice(开始下标, 结束下标) - 返回截取的结果,结果中不包含结束下标对应的元素
冒泡排序
1、实现sort内部排序原理,每相邻的两个元素进行大小比较,排除合适的顺序
2、冒泡原理:var arr = [3,2,1];
3 和 2 进行比较,不符合我们规则,就交换这两个值的顺序 - 2 3 1
3 和 1 进行比较,不符合我们规则,就交换这两个值的顺序 - 2 1 3
2 和 1 进行比较,不符合我们规则,就交换这两个值的顺序 - 1 2 3
2 和 1 进行比较,符合我们规则,就什么也不做 - 1 2 3
选择排序:
1、每次排序都要找到最小值或最大值放在最前面
2、下次排序还是在剩下的数据中找到最小值或最大值放在前面
数组去重
1、将数组中重复的元素去掉,让数组变成没有重复元素数组
2、遍历数组,将重复的元素删除
3、将所有不重复的元素放在一个新的数组中
4、利用对象的键不能重复,将所有元素作为对象的键,对象是有很多元素组成的,且是没有重复的。将对象中所有的键组成一个数组
5、将重复元素删除
6、遍历数组:用第一个元素跟后面所以的元素比较,是否有相等的,将相等的删除,以此类推
多维数组转一维:数组嵌套+递归
ES:ECMAScript简称ES - ECMA公司制定的规范
ES5:ECMA语法规范第5个版本
ES5研究两个特性:
1、es5新增的语法 - 严格模式
2、es5新增了一些数组的方法
严格模式:js的一种语法,一旦使用这种语法,当前代码环境就开启严格模式
全局开启的严格模式,可以规范所有代码,局部开启的严格模式,只能规范局部代码
开启了严格模式以后,代码会发生哪些变化?
1、严格模式对于代码的要求会更高,让代码变得更加规范:
2、不允许省略var定义变量
3、不允许函数的形参同名
4、不允许普通函数中的this关键字代表window窗口
严格模式的开启:
1、在全局的最上面,添加字符串: 'use strict'
2、在局部的最上面,添加字符串: 'use strict'
严格模式的特性:
1、不允许省略var定义变量
2、不允许函数形参同名
3、不允许普通函数中的this代表window - undefined
this关键字:
1、全局的this代表window
2、普通函数中的this代表window
3、自调用函数中的this代表window
4、事件函数中的this代表事件源
5、对象方法中的this代表当前对象
indexOf:在数组中查找某个元素第一次出现的下标
语法:数组.indexOf(指定的元素)
返回值:如果在数组中找到元素了,返回这个元素对应的下标,如果没有找到,返回-1
forEach:用于遍历数组的
语法:数组.forEach( function(value, index, array ){
value是每次遍历出来的元素
index是每个元素对应的下标
array是当前正在遍历的数组
})
index和array是可选参数,在遍历时可不加
此遍历方法跟for循环遍历效果一样,方法内部封装了for循环,所以这个方法没有返回值 - undefined
若要遍历到某个值时停止遍历,只能用for循环
map:遍历数组,将每个元素用函数处理成新的元素,将所有新元素组成一个新的数组返回
语法:数组.map(function(跟forEach的参数是一样的) {
return newValue
}) //返回所有新元素组成的新数组
filter:过滤数组 - 遍历数组,将数组中满足指定条件的元素,组成新的数组并返回
语法:数组.fitler(function(跟forEach的参数是一样的) {
return 条件
}) //返回值:返回满足条件的所有元素组成的数组
字符串
1、字符串可以取下标,通过下标可以获取到对应的字符
2、字符串是只读数据,不能修改原字符串
3、字符串的长度:字符串.length
字符串比较:
1、比较规则:逐字符比较,字符大小由 ASCII 决定的
2、排在后面的字母更大,小写字母比大写字母更大,字母比数字更大
3、汉字的大小,由unicode码决定
字符串方法
字符串.charAt(下标):通过下标获取指定的字符 返回值:返回找到的字符
字符串.charCodeAt(下标):通过下标获取到对应字符的10进制的阿斯克码 返回值:返回字符对应的阿斯克码
ASCII码 数字0~9:48~57 大写字母 A~Z:65~90 小写字母a~z:97~122
String.fromCharCode(阿斯克码):根据阿斯克码获取对应的字符 返回值:返回阿斯克码对应的字符
字符串.indexOf(要查找的字符或小字符串): 查找字符或小字符串在大字符串中第一次出现的下标- 默认从下标0开始查找
返回值:找到返回下标,找不到返回-1
字符串.indexOf(字符, 开始下标):指定从哪个下标开始查找他第一次出现的位置
字符串.lastIndexOf(字符) :查找字符或小字符串在大字符串中最后一次出现的下标 - 默认是从最后开始查找最后一次出现的下标
返回值:跟indexOf是一样的
字符串.lastIndexOf(字符, 下标):可以指定从某下标开始查找 将指定的下标当做末尾来查找字符最后一次初选的下标
字符串.slice(开始下标, 结束下标):截取字符串,可省略第二个参数,默认截取到末尾 返回值:截取出来的字符串,不包含结束下标对应的字符
字符串.split(分隔符):以指定的分隔符把字符串分割成数组 返回值:返回分割后的数组
字符串.split(分隔符, 保留的个数):指定保留数组中几个元素
字符串.trim():去除字符串左右两端的空白 返回去除左右两端空白后的字符串
字符串.trimLeft():去除左边空白
字符串.trimRight():去除右边空白
字符串.toUpperCase():转大写 返回值:所有字母转成大写字母后的字符串
字符串.toLowerCase():转小写 返回值:所有字符转成小写字母后的字符串
字符串.replace(被替换部分, 新内容):替换字符串 返回值:返回被替换后的整个字符串
字符串.substr(开始下标, 截取长度):截取字符串 返回截取出来的字符串 若第二个参数省略,则默认截取到字符串末尾
字符串.substring(开始下标, 结束下标) :截取字符串 返回被截取出来的字符串,不包含结束下标对应的字符 若第二个参数省略,则默认截取到字符串末尾
截取字符串的区别
共同点:从左向右截取,-1是最后一个下标,-2是倒数第二个
1、slice 下标可用负数,开始>结束:无内容,开始=结束:截取到空字符串
2、substr 下标可用负数,长度<=0:截取到空字符串
3、substring 负数下标会转成0,开始下标在结束下标的左边时,先换参数位置再截取
Math是js的内置对象 属性: Math.PI - 圆周率 - π
Math方法
Math.random() - 随机数 - 重点:获取某个0~1(不包含1)的随机小数,随机数可做处理化为整
Math.ceil(num) - 向上取整(只入不舍)3.14->4
Math.floor(num) - 向下取整(只舍不入)3.89->3
Math.round(num) - 四舍五入(结果是整数) 3.14->3 3.89->4
Math.pow(底数,幂数) - 求次方
Math.sqrt(num) - 求开根号
Math.abs(num) - 求绝对值
Math.max() - 求最大值
Math.min() - 求最小值
正弦:直角三角形,如果一个角是30度,30度的角对面的那个边是斜边的一半
30度的正弦,是1/2 - 角度对应的边跟斜边的比例
Math.sin(弧度,不是角度)
弧度跟角度进行换算 - 1弧度指的是一个半径的长度
30度 - 角度
弧度? = 角度 * 2π / 360 = 60π / 360 = π / 6
var res = Math.sin(30 * 2 * Math.PI / 360)
console.log(res);
余弦:角度相邻的直角边跟斜边的比例
Math.cos(角度对应的弧度)
var res = Math.cos(60 * 2 * Math.PI / 360)
console.log(res);
进制转换
2、10进制转其他进制:10进制数字.toString(目标进制) - 返回结果是字符串,用字符串显示其他进制数字
1、其他进制转10进制:parseInt(被转数据, 他是多少进制转10进制) - 返回10进制的数字
创建日期对象
var date = new Date()
获取具体时间
getFullYear() 获取年份
getMonth() + 1 获取月份,获取到的月份比实际月份小1,所以+1
getDate() 获取日,不能直接用变量date表示日
getDay() 获取星期
getHours() 获取时
getMinutes() 获取分
getSeconds() 获取秒
getMilliseconds() 获取毫秒
getTime() 获取时间戳:如从1970年1月1日8点0分0秒到现在所走过的毫秒数来描述当前时间,常用于做减法运算
设置具体时间
setFullYear()
setMonth() - 参数要比实际的月份少1
setDate()
setHours()
setMinutes()
setSeconds()
setMilliseconds()
setTime()
注意:在设置时间中,没有设置星期几,因为星期几是根据年月日生成的,是不能被设置
创建不同的时间日期对象
new Date() - 没有参数获取到当前时间
new Date('y年m月d日 h:i:s')
new Date(y,m,d,h,m,s)
new Date(time)
获取时间戳
1、时间日期对象.getTime()
2、在new前面放+ 如 var date = +new Date()
将+后面的字符转成数字
var a = '15'
console.log(a);
console.log( +a );
3、利用构造函数Date: Date.parse('年-月-日 时:分:秒')
var guoqing = Date.parse('2022-10-1')
console.log(guoqing);
格式化输出时间
toLocaleString() 格式化整个年月日时分秒
toLocaleDateString() 格式化年月日
toLocaleTimeString() 格式化时分秒