数组
数组(Array)
数组也是一个对象,它和我们普通的对象功能类似,也是用来存储一些值的,不同的是普通对象是使用字符串作为属性名的,而数组使用数字来作为索引操作元素。
//创建数组对象
var arr=new Array();
//使用typeof检查一个数组,会返回一个Object
consolr.log(typeof arr)
//读取数组中的元素
//语法:数组[索引],如果读取不存在的索引,它不会报错而是会返回undefined
//对于连续的元素,获取数组的长度(元素的个数),使用length 属性
console.log(arr.length)
尽量不要创建非连续性的数组
数组的length属性可以设置和获取数组的长度,对于连续的数组,使用length可以获取到数组的长度(元素的个数),对于非连续的数组,使用length可以获取到数组的最大索引+1。
修改length
如果修改的length大于原长度,则多出来的部分会空出来,
如果修改的length小于原长度,则多出的元素会被删除
//修改length
arr.length=10
//向数组的最后一个位置添加元素,语法:数组[数组.length]=值
arr[arr.length]=60
数组的字面量
//创建一个数组
var arr=new Array();
//使用字面量创建一个数组,语法:[],作用和new Array()一样的
var arr=[];
console.log(typeof arr)//Object
//使用字面量创建数组时,可以在创建时指定数组的元素
var arr=[1,2,3,4,5,6]
console.log(arr.length)//6
//使用构造函数创建数组时,也可以同时添加元素,将要添加的元素作为构造函数的参数传递
var arr1=new Array(10,20,30)
console.log(arr1) //10,20,30
//创建一个数组只有一个元素10
arr2=[10];
//创建一个长度为10的数组
arr3=new Array(10);
console.log(arr3.length) //10
数组中的元素可以是任意数据类型
arr=["hello",1,true,null,undefined]
//也可以是对象
var obj={name:'孙悟空'}
arr[arr.length]=obj
console.log(arr[0].name)//孙悟空
//也可以是一个函数
arr=[function(){alert(1)},function(){alert(2)}]
//数组中也可放数组,如下这种数组我们称为二维数组
arr=[[1,2,3],[3,4,5],[5,6,7]]
console.log(arr[1])// [1,2,3]
数组的方法
1.向数组的末尾添加一个或多个元素,使用push()方法,并返回数组的长度
2.删除数组的最后一个元素,使用pop()方法,并返回被删除元素的值
3.向数组的开头添加一个或多个元素,使用unshift()方法,并返回新的数组长度
4.删除数组的第一个元素,使用shift()方法,并返回被删除的元素值。
数组遍历
<script>
function Person(name, age, gender) {
this.name = name;
this.age = age;
this.gender = gender
}
var per = new Person("孙悟空", 18, "男")
var per2 = new Person("猪八戒", 16, "男")
var per3 = new Person("白骨精", 23, "女")
var perArr = [per, per2, per3]
var newArr = []
function getAdult(arr) {
for (var i = 0; i < arr.length; i++) {
//console.log(arr[i])
var p = arr[i]
if (p.age < 18) {
newArr.push(p)
}
}
return newArr
}
var result = getAdult(perArr)
console.log(result) //Person {name: '猪八戒', age: 16, gender: '男'}
</script>
forEach()方法需要一个函数作为参数,像这种函数,由我们创建,但是不是由我们调用的,我们称为回调函数。数组中有几个元素,函数就会执行几次,每次执行时,浏览器会将遍历到的元素,以实参的形式传递进来,可以来定义形参,来读取这些内容。
浏览器会在回调函数中传递三个参数。
第一个参数(value):当前 正在遍历的元素
第二个参数(index):当前正在遍历的元素的索引
第三个参数(obj,数组对象):就是正在遍历的数组
var arr=["白骨精","沙和尚","唐僧"]
arr.forEach(function(value,index,obj){
console.log(value)
})
slice()方法,可以从已有的数组中返回选定的元素,该方法不会改变原数组,而是将截取到的元素封装到一个新数组中返回。语法:arr.slice(start,end)
参数:
start:截取开始位置的索引,包含开始索引
end:截取结束位置的索引,不包含结束索引,第二个参数可以省略不写,截取从开始索引到最后一个元素,索引可以传递负值,如果传递一个负值,则从后往前计算,-1:倒数第一个,-2:倒数第二个
var arr=['猪八戒',"白骨精","沙和尚","唐僧"]
var result=arr.slice(1)
console.log(result)// "白骨精","沙和尚","唐僧"
var a=arr.slice(1,-1)
console.log(a)//"白骨精","沙和尚"
splice():删除元素,并向数组添加新元素。用于删除数组中指定元素,使用splice()会影响原数组,将指定的元素从数组中删除,并将被删除的元素作为返回值返回。
参数:
第一个:开始位置的索引
第二个:删除的数量
第三个及以后:可以传递一些新的元素,这些元素会自动插入到开始位置索引前面。(替换被删除元素)
var arr=['猪八戒',"白骨精","沙和尚","唐僧"]
arr.splice(0,2)
console.log(arr)//"沙和尚","唐僧"
var b=arr.splice(0,2)
console.log(b) //'猪八戒',"白骨精"
数组的其他方法
concat():可以连接两个或多个数组,并将新的数组返回,该方法不会对原数组产生影响
var arr=["孙悟空",'猪八戒',"沙和尚"];
var arr2=["白骨精","玉兔精","蜘蛛精"]
var result=arr.concat(arr2)
console.log(result)
join():该方法可以将一个数组转换成一个字符串,该方法不会对原数组产生影响,而是将转换后的字符串作为结果返回。 typeof result 为string,在join()中可以指定一个字符串作为参数,这个字符串将会成为数组中元素的连接符。
var arr=["孙悟空",'猪八戒',"沙和尚"];
var result=arr.join()
console.log(result)// "孙悟空,猪八戒,沙和尚"
var a=arr.join("hello")
console.log(a)// "孙悟空hello猪八戒hello沙和尚"
reverse():该方法用来反转数组,(前面的去后面,后面的去前面),该方法会直接修改原数组。
sort():可以用来对数组中的元素进行排序,也会影响原数组,默认会按照unicode编码进行排序。
即使对于纯数字的数组,使用sort()进行排序时,也会按照unicode编码进行排序,所以对于数字进行排序时,可能会得到错误的结果,我们可以自己来指定排序的规则,我们可以在sort()中添加一个回调函数,来指定排序规则。回调函数需要定义两个形参,浏览器会分别使用数组中的元素作为实参去调用回调函数,使用哪个元素去调用不确定,但肯定的是数组中a一定在b的前面。
浏览器会根据回调函数的返回值来决定元素的顺序,
如果返回一个大于0的值,则元素会交换位置;
如果返回一个小于0的值,元素位置不变;
如果返回一个0,则认为两个元素相等,也不交换位置
var arr=["a","b","c","d","e"]
arr.sort();
console.log(arr)//"a,b,c,d,e"
//数组纯数字元素的排序
var arr=[5,4,2,3,1,6,8,7]
arr.sort(function (a, b) {
if (a > b) {
return 1
}
else if (a < b) {
return -1
}
else {
return 0
}
})
console.log(arr)//[1, 2, 3, 4, 5, 6, 7, 8]
//或者简写为
arr.sort(function (a, b) {
return a - b //升序,,降序:b-a
})
console.log(arr)//[1, 2, 3, 4, 5, 6, 7, 8]
函数对象的call和apply方法
call()和apply(),这两个方法都是函数对象的方法,需要通过函数对象来调用,当对函数调用call()和apply()可以执行该函数。在调用call()和apply()可以将一个对象指定为第一个参数,此时这个对象将会成为函数执行时的this,call()方法可以将实参在对象之后依次传递。apply()方法需要将实参封装到一个数组中统一传递。
function fun(){
alert(this.name)
}
var obj={name:"obj",
sayName:function(){
alert(this.name)
}
}
var obj2={name:'obj2'}
fun.call(obj)// alert 一个obj
fun.call(obj2) //alert一个obj2
obj.sayName()//obj
obj.sayName.call(obj2) //obj2
this的情况:
1.以函数形式调用,this永远都是window
2.以方法调用,this是调用方法的对象
3.以构造函数调用,this是新创建的那个对象
4.使用call()和apply()调用,this是指定的那个对象
arguments
在调用函数时,浏览器每次会传递两个隐含的参数:
- 函数上下文对象 this
- 封装实参的对象 arguments -arguments是一个类数组对象,它也可以通过索引来操作数据,也可以获取长度,在调用函数时,我们传递的实参都会在arguments中保存,arguments.length可以获取实参的数量(长度).
我们即使不定义形参,也可以使用arguments来使用实参,只不过比较麻烦,arguments[0]表示第一个实参
arguments[1]表示第二个实参
arguments有一个属性callee,这个属性对应一个函数对象,就是当前正在指向的函数的对象
function fun(a,b){
console.log(arguments instanceof Array) //false
console.log(Array.isArray(arguments)) //false
console.log(arguments.length)//2
console.log(arguments[0])//"hello"
console.log(arguments.callee) //function fun(a,b){}
console.log(arguments.callee == fun)//true
}
fun("hello",true)
Date对象
在JS中使用Date对象来表示一个时间
日期的格式:月份/日/年 时:分:秒
getDate():获取当前日期对象是几日
getDay():获取当前日期对象是周几,会返回0~6的值,0表示周日
getMonth():获取月份,会返回0~11的值,0表示1月,1表示2月
getFullYear():获取当前日期对象的年份
getTime():获取当前日期的时间戳,时间戳指的是从格林威治标准时间的1970年1月1日,0时0分0秒,到当前日期花费的毫秒数(1秒=1000毫秒)
//创建一个Date对象
//如果直接使用构造函数创建一个Date对象,则会封装为当前代码执行的时间
var d=new Date()
console.log(d) //Sat Aug 27 2022 14:40:08 GMT+0800 (中国标准时间)
Math
Math和其他的对象不同,它不是一个构造函数,它属于一个工具类不用创建对象,它里边封装了数学运算相关的属性和方法。比如:
Math.PI(): 表示圆周率
Math.abs():可以用来计算一个数的绝对值
Math.ceil():可以对一个数向上取整,小数位只要有值就自动进1
Math.floor():可以对一个数进行向下取整,小数部分会被舍掉
Math.round():可以对一个数进行四舍五入取整
Math.max(x,y):返回x和y中的最大值
Math.pow(x,y):返回x的y次幂
Math.sqrt():返回数的平方根
字符串的方法
在底层字符串是以字符数组的形式保存的。
//创建一个字符串
var str="Hello shanghai"
//在底层字符串是以字符数组的形式保存的。["H","e","l"]
//charAt()--可以返回字符串中指定位置的字符,根据索引获取指定字符
var result=str.charAt(0);
console.log(result) //"H"
indexof()-该方法可以检索一个字符串中是否含有指定内容,如果字符串中含有该内容,则会返回其第一次出现的索引。如果没有找到指定的内容,则返回-1,可以指定第二个参数,用于表示开始查找的位置。
concat():可以用来连接两个或多个字符串,作用和+一样
slice():可以从字符串中截取指定的内容,不会影响原数组,而是将截取到的内容返回
参数:
第一个:开始位置的索引(包括开始位置)
第二个:结束位置的索引(不包括结束位置)如果省略第二个参数,则会截取到后面所有的。
substring():可以用来截取一个字符串,和slice()类似
参数:第一个,开始位置的索引,第二个:结束位置的索引(不包括结束位置),不同的是这个方法不接收负值作为参数,如果传递一个负值,则默认使用0,而且它还自动调整参数的位置,如果第二个参数小于第一个,则自动交换。
split():可以将一个字符串拆分成一个数组,根据逗号拆分,参数:需要一个字符串作为参数,会根据该字符串去拆分数组。如果传递一个空串作为参数,则会将每一个字符都拆分为数组的一个元素。
toUpperCase():将一个字符串转换为大写,并返回。
toLowerCase():将一个字符串转变为小写并返回。