day6数组和对象
1.对象
1.数据类型的分类
基本数据类型:
string,number,boolean,unll,undefined
复杂的数据类型
function,object,array....
2.定义对象
赋值式定义对象
var obj = {}
内置构造函数创建对象
var obj = new Object()
3.对象是以键值对的形式来存储数据的
注:键值对:键:值 每一对键值对结束用逗号隔开,最后一个不需要
var obj = {
name:'jack',
age:18
}
2.操作对象
//操作对象,就是对对象的增,删,改,查。
/*
1.增:
点语法:对象.键 = 值 ===>对象.属性 = 属性值
中空括号语法:对象["属性"] = 属性值
*/
var obj = {};
obj.name="1234";
obj["age"]=18
/*
2.删:删除数据 delete
点语法: delete 对象.属性
中括号语法: delete 对象["属性"]
*/
delete.obj.name;
delete obj ["name"];
/*
3.改:把原有的数据进行修改
跟增加数据一样,如果对象已经有这个属性,那么就是修改,没有就是添加
查:获取数据
*/
obj["age"]=20;
/*
4查:获取数据
通过遍历,拿到数据
person没有length属性,所以不能使用for循环
遍历对象的方法 for in
*/
var person = {
name: "余美丽",
age: 30,
sex: "女"
};
for(var i in person){
// for in 循环的次数,对象有多少个属性救护自循环多少次
// i 表示对象中每一个属性 并且是一个字符串 i = "name"
// 属性值:对象.属性 || 对象["属性"]
// 当遍历对象的时候 ,需要获取 属性值的时候 必须使用中括号语法形式获取
// console.log(typeof i);
console.log(person[i]);
}
3.数组
1.数组:复杂数据类型中的一种数据类型
2.定义数组:一系列有序的数据集合
var arr = [];
var arr = new Array();
3.有序:数组都会有索引(都是从0开始的索引)
4. 数据集合:多个数据组成在一起的一个集合
var arr = [10];//数组中有一个值,值为10,长度为1.
var arr =new Array(10);//一个长度为10的空数组
5.想要获取数组中的数据,只能通过索引来获取
var arr =[];
// 通过索引的形式给 数组中添加数据
arr[0]=10;
arr[1]=20;
console.log(arr)//arr=[10,20]
4.数组的案例
定义一个数组长度为30,向数组中添加 1-30 的值
var arr = new Array(30);
for(var i =0;i<arr.length;i++){
arr[i]=i+1;//数组长度从1开始
}
console.log(arr);
5. 二维数组
// 二维数组:数组中有数组,数组中数据是一个数组
var arr2 = [
[1, 2, 3, 4, 5],
[6, 7, 8, 9, 10]
];
6.数组求平均值
// 定义一个含有30个整型元素的数组,按顺序分别赋予从2开始的偶数;然后按顺序每五个数求出一个平均值,放在另一个数组中并输出。
var arr1 = new Array(30);
for(var i = 0;i<arr1.length;i++){
arr1[i]=(i+1)*2;
}
//求arr1这个数组中每5个数的平均值,放到新的数组中
var arr2=[];
var sum=0;//求5个数之和
var num=0;//记录arr2的索引
for(var j =;j<arr1.length;j++){
sum+=arr1[j];
if((j+1)%5==0){
// 当满足这个条件的时候吗,说明已经有5个数了,就赢过球这个5个数的平均值
// sum就是5个数之和
arr2[num]=sum/5;
num++;
sum=0; //把sum清0 ,需要求另外5个数的平均值
}
}
console.log(arr2);
7.生成5X5的二维数组打印出左下三角形
var outerArr = [];//最外层的循环
var innerArr = [];//里面的循环
var num = 0; //下标
var k =0;//下标
for(var i =0;i<25;i++){
// 把每5个数添加到 innerArr中,当innerArr中够5个数之后,那innerArr添加outerArr中,并且把innerArr清空
// innerArr[i] = i + 1;
innerArr[k]=i+1; //innerArr[0]=1;
if((i+1)%5==0){
outerArr[num]=innerArr; //outerArrr[o]=innerArr[o][1];
num++;
}
}
console.log(outArr);
//打印左下三角形
/*
1--[0][0]
6-[1][0] 7 -[1][1]
1 1 1
1 1 1 1
1 1 1 1 1
*/
for(var i =0;i<outerArr.length;i++){
for(var j = 0;j<=i;j++){
document.write(outerArr[i][j]+",")
}
document.write("<br>")
}
8.数据在内存中的存储
/*
栈:主要存储的是基本的数据类型和变量
堆:主要存储的是复杂的数据类型,以地址的形式存储
*/
var num = 10;
// 把 num的值 赋值给 num1
var num1 = num;
num = 20;
console.log(num1);//10,
------------------------------------------------------------------
var arr =[1,2,3];
25---var arr1=arr;
arr[0]='a';
console.log(arr1);//arr1[a,2,3];
//找到栈中arr变量,根据arr的值(地址)找到堆中的数据,进入堆中修改数据。
//栈中arr1这个变量,然后取出他值,
//arr1的值是一个数组地址,根据地址找到堆中数据,把堆中的数据取出来。、
//25行的时候堆中的数据被更改
注-----
//当有多个变量指向同一个地址的时候,无论哪个变量去修改数据,都会直接修改堆中的值
//其他变量来获取这个地址里面的值的时候,都是得到被修改过后的数据。
9.不同数据类型作为函数参数的区别
var n = 20;
fun(n);
function fun(num){
//n给num赋值的时候,只是把n的值赋值给num
num++;
console.log(num);//21
}
console.log(n);//20
//当我给函数传递一个对象作为参数的时候,会出问题?????
var obj = {
name;'aaa'
};
fn(obj)
function fn(person){
person.name='123';
}
console.log(obj)//name:123
/*
obj变量存储在栈中:var obj = xxff11
{name:"aaa"}存储在堆中:以地址的形式存储(xxff11)
fn变量存储在栈中,fn=xxff22
{peson.naem='124';}存储在堆中:以地址形式存储(xxff22)
*/
10.数组的方法
数组的方法:让我们更加快速方便的操作数组
1.push()往数组的最后面添加数据
返回值:添加数据之后的数组长度
2.unfhift()往数组的最前面添加数据
返回值:添加数据之后的数组长度
3.shift()删除数组中第一个数据
返回值:被删除的那个数据
4.pop()删除数组中最后一个数据
返回值:被删除的那个数据
5.splice(index,lengt)截取数据
index:从哪个索引开始
length:截取的长度
原始数组会改变
返回值:一个新数组(被截取的数据)
splice(index,length,value)替换
value 替换的数据,用value来替换被截取的数据
6.slice(index,endindex)截取数据
index:开妈的索引
endIndex:结束的索引(截取出来的数据不包含结束索引的值)
不会改变原始数组
返回值:一个新的数组(截取出来的数据)
7.reverse()反转数组
原始数组会改变
返回值:反转之后的数组
8.concat()合并数组
不会改变原始数组
返回值:合并之后的新数组