JavaScript复习笔记2(Math和数组)


工具类对象

Math对象

Math对象是一个JS提供的工具对象。主要用于数学运算,它比我们自己编写的计算功能运行效率高的多。因此我们必须知道这么个东西;

Math对象当中的属性大多数都是一些特殊值:

Math.E 2.718281828459045
Math.PI 3.141592653589793

Math方法:
Math.max()参数是多个值,确定多个值的最大值(求一个数组当中的最大值)
Math.min()参数是多个值,确定多个值的最小值
Math.ceil()向上舍入取整
Math.floor()向下舍入取整
Math.round()标准四舍五入取整
Math.random()返回大于等于0小于1(取不到1)的一个随机数

如果我们要取1到10之间的一个随机数
console.log(Math.floor(Math.random() * 10 + 1));
值 = Math.floor(Math.random() * 取到的数的个数 + 能取的最小数)
值 = Math.floor(Math.random() * (max - min + 1) + min)

Math.pow(num,power)返回num的power次幂,也可以求分数次幂
Math.sqrt(num)返回num的平方根
Math.abs(num)返回num值的绝对值
Math.exp(num)返回Math.E的num次幂

内置对象

内置对象之数组Array
什么是数组

具有一定顺序的相同类型的变量的集合,这是数组的定义,但是在JS当中,数组里面的类型可以是不同。虽然数组内的变量类型可以不同,但是我们在做数组的时候,还是习惯于把数组当中存储相同类型的数据。

数组是干什么的

一次性的定义多个变量,也就是说在内存中可以一次性开辟多个空间。并且这个数组有特性,这些开辟出来的空间都是连续的。

怎么定义一个数组
  • 字面量定义数组

var arr = [] 这样的方式以后用的最多

  • 构造函数定义数组

var arr = new Array() 如果构造函数后面的括号当中没有传参(没有数),代表定义了一个空数组,长度是0。
var arr = new Array() <=======> var arr = []
如果构造函数后面的括号当中只有一个参数(数),代表定义了一个数组,这个数组的长度是传的数。
var arr = new Array(3) <=======> var arr = [,,]
如果构造函数后面的括号当中有多个参数,那么这些参数会被当做数组的元素存储。
例如: var arr = new Array(1,2,3) <=======> var arr = [1,2,3]

数组的长度,更改数组的长度会如何

数组一旦被定义,那么这个数组会默认有一个属性,这个属性叫做length,它是数组元素下标的最大值+1;这个值代表了数组当中元素的个数(包含没有存储值的元素)。这个length属性,我们可以设置它。

当我们把length属性值设置的比原数组长度小的时候,它会从后面删除下标大于length-1的所有元素。
当我们把length属性值设置的比原数组长度大的时候,那么它会把原数组扩展,长度改变为设置的length属性值,只是后面扩展的元素没有值。(当数组后面元素当中没有值的时候,有些浏览器会选择不打印,有些会打印undefined,无论打印还是不打印,我们都是要避免这样的情况出现,因为没有实际开发意义)。
我们通过length属性也可以给原数组追加元素:arr[arr.length] = 值 追加完元素之后,数组长度会自动加1。

数组的遍历和对象的遍历

数组我们可以看成是一个数组也可以看成是一个对象。当我们把数组当成数组的时候,它里面存的是数组当中存储的元素。当我们把数组看成是对象的时候,它里面还包含了一些其他的属性。
遍历数组的时候,我们要用到for循环遍历,遍历对象的时候,我们要用到for in去遍历。遍历数组,遍历的是数组内存储的元素,遍历对象遍历的是元素以及其它的属性(对象会把数组元素下标当做属性看待)。

数组的检测Array.isArray(arr)

检测基本数据类型的时候用typeof关键字
检测引用类型的的时候用instanceof

Array.isArray()方法可以检测一个对象是不是数组

检测属性是否在对象中包含in hasOwnProperty
in关键字可以查找属性是否在对象当中
in关键字查找,不但可以查找对象定义的属性,还可以查找继承的属性。

var symon = {
    "name":"symon",
    "age":18,
    "sex":"男"
};
console.log(symon);
console.log('name' in symon); //true
console.log('toString' in symon); //true

通过对象方法hasOwnProperty方法判断,只可以判断对象内定义的属性

console.log(symon.hasOwnProperty('name')); //true
console.log(symon.hasOwnProperty('toString')); //false
数组常用的方法
转换方法:**

tostring()

每个对象都会继承的一个方法,数组会返回以一个以逗号为间隔的字符串。原数组不变

valueof()

每个对象都会继承的一个方法,数组会返回数组本身

上面这两个方法,在做类型转化的时候会默认用到。
尤其是引用类型,通常情况下,引用数据类型转换基本数据类型
如果要转化为一个数字:会先调用自身的valueof方法,valueof方法如果能返回一个原始的数字,那么就返回结束。如果valueof方法返回不了一个原始的数字,那么它将继续调用自身的tostring方法,尝试把自己转化为一个字符串,通过字符串转换为数字。
如果要转化为一个字符串:那么它会调用自身的tostring方法,如果能返回一个原始的字符串,就结束返回。 如果调用tostring方法不成功,会调用自身的valueof方法,尝试转化为数字,然后转化为字符串。

数组转化为数字:空数组会转化为0,只有一个元素的数值数组会转化为这个元素的值,其余是NaN;
数组转化为字符串:空数组转化为空字符串,只有一个元素的数组,会转化为这个元素的字符串,其余转化为以,为间隔的所有元素组成的字符串。
所有的对象转化为布尔,都是true;

join()

  • 功能:以固定的间隔符去拼接数组的每一项,组成一个字符串,不传参数,那么间隔符是默认的逗号。通常用的最多的是传一个空字符串’’,空字符串会替换掉默认的逗号,成为一个所有元素组成的字符串,并且没有任何间隔符
  • 参数:参数是一个字符串,间隔符字符串,自己可以任意规定这个间隔符
  • 返回值:这个方法返回以固定间隔符拼接好的字符串,对原数组没影响
栈和队列方法:*****

push()

  • 功能:在数组的末尾添加1项或者多项,这些项还可以是一个数组
  • 参数:参数可以是1个也可以是多个,每个项还可以是数组
  • 返回值:返回数组被添加后的新的长度;这个方法对原数组有影响

pop()

  • 功能:在数组的末尾删除一个项,只能删除一项
  • 参数:无参数
  • 返回值:返回删除的项,也是对原数组有影响

unshift()

  • 功能:在数组的前面添加1项或者多项,这些项还可以是一个数组
  • 参数:参数可以是1个也可以是多个,每个项还可以是数组
  • 返回值:返回数组被添加后的新的长度;这个方法对原数组有影响

shift()

  • 功能:在数组的前面删除一个项,只能删除一项
  • 参数:无参数
    — 返回值:返回删除的项,也是对原数组有影响

栈是后进先出 ; 队列先进先出;

排序方法

reverse()

  • 功能:会对原来的数组进行反转
  • 参数:无参数
  • 返回值:返回反转好的数组

sort()

  • 功能:对原数组进行排序,可以是升序,也可以是降序
  • 参数:参数是一个函数,这函数控制着是升序还是降序排序
  • 返回值:返回排好序的数组
var arr = [1, 3, 2, 4];
console.log(arr); // [1, 3, 2, 4]
var arrAsc = arr.sort(function (a, b) {
    return a - b;
});//升序
console.log(arrAsc); // [1, 2, 3, 4]
var arrDesc = arr.sort(function (a, b) {
    return b - a;
});//降序
console.log(arrDesc); // [4, 3, 2, 1]
操作方法

concat()

  • 功能:它会创建一个副本进行拼接数组,但是只是简单的把每一项添加到数组的末尾,不会成为多维数组
  • 参数:可以是一项或者多项,也可以是一个数组
  • 返回值:返回新构建的数组,这个方法不会影响到原数组

concat方法,它也是往一个数组后面追加项,但是它和push方法不同,push方法会改变原来的数组,concat不会改变原来的数组。它会根据原来的数组创建一个新数组,在这个新数组上去做文章。
push方法也可以追加一个数组,当去追加数组的时候,它会把数组整体当成一项,添加到原数组末尾。也就是说,原数组的末尾添加了一个数组。
concat方法,它参数也可以是一个数组,但是,它是在原数组的副本上,去拼接参数数组的每一项。也就是说,原数组的副本上,末尾追加的不是数组,而是数组的每一项。

slice()

  • 功能:基于现有数组的一个或者多个项,创建一个新数组
  • 参数:它可以参数可以是1个或者2个。如果是一个参数,代表从这个位置一直到数组末尾。如果是两个参数,代表从第一个参数位置开始到第二个参数位置结束,但是不包含结束位置的项
  • 返回值:返回创建的新数组。这个方法也不会改变原来数组
  • 注意:如果结束位置小于等于起始位置,那么会返回一个空数组

splice()

  • 功能:在原来的数组上进行删除、插入、替换操作
  • 参数:这个参数可以是2个也可以是多个,参数的不同代表功能的不同
  • 返回值:返回删除的项组成的新数组;影响原数组

splice()方法很强大,可以在原来数组基础上进行删除、插入、替换操作
删除:需要指定两个参数,要删除的第一项的位置和要删除的项数
例如 splice(0,2) 删除数组的前两项
插入:指定多个参数,起始位置、要删除的项数为0、要插入的项;返回删除的项组成的新数组,没有删除项就返回一个空数组
例如 splice(0,0,“red”)
替换:替换和插入其实是一样的,只是要删除的项被删除掉了,然后插入项。返回删除的项组成的新数组
例如 splice(0,2,“red”)
其实splice函数主要是删除数组中固定的几项,不过可以拓展为插入和替换。

位置方法

indexof()lastIndexOf()

  • 功能:这两个方法可以用来查找特定的项,在数组中的位置。
    indexOf从数组前面开始向后查找,lastIndexOf()从数组末尾向前面查找。
  • 参数:需要两个参数,一个是要查找的项,一个是开始的起点索引(位置,下标)
  • 返回值:如果数组当中可以查找到都返回查找到的项在数组中的位置;
    如果没有找到就会返回-1;
  • 注意:查找的时候用的是===

如果没有给定第二个参数(开始的位置),indexOf默认从0开始 lastIndexOf从最后开始

迭代方法

下面迭代方法都可以传递两个参数,一个迭代运行的函数,一个可选项,可选项一般不写。

var arr = [1, 3, 2, 4];
//对数组中的每一项运行给定的函数,如果每一项都返回true,那么返回值就是true
var res = arr.every(function (item, index, arr) {
    return item >= 1
});
console.log(res);
//对数组中的每一项运行给定的函数,有一项返回true,那么返回值就是true
var res1 = arr.some(function (item, index, arr) {
    return item >= 2
});
console.log(res1);
//对数组中的每一项运行给定的函数,返回所有能返回true的项组成的数组
var res2 = arr.filter(function (item, index, arr) {
    return item >= 3 //返回原数组所有大于等于3的项组成的数组
});
console.log(res2);
//对数组中的每一项运行给定的函数,返回所有项运行之后的结果组成的一个数组
var res3 = arr.map(function (item, index, arr) {
    return item + 1 //返回所有项加1组成的数组
});
console.log(res3);
//可以做一些事情,比如遍历数组;它没有返回值。
arr.forEach(function (item, index, arr) {
    console.log(item +':'+ index);
});
归并方法

reduce()reduceRight()
这两个方法可以迭代数组的所有项,然后构建一个最终返回的值;
接收两个参数,一个执行函数,一个可选项,基础初始值;
一个从左边开始迭代,一个从右边开始迭代。

我们可以使用这个两个方法求一个数组的和或者乘积

var res4 = arr.reduce(function(pre,cur,index,arr){
    return pre+cur
})
console.log(res4);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值