数组
数组可以保存多个值,每个值都是元素,值可以是任何数据类型
声明方式:
1.通过构造函数new声明
var arr = new Arrsy()
2. 使用[]声明
var arr = [];
//通过构造函数产生
var arr = new Array(11,22,33,44);
// console.log(typeof arr);
//使用[]声明
var arr1 = ['言笙',18,'安徽',15000,'未'];
// console.log(arr1);
//元素可以是任意类型,元素之间用逗号(,)隔开;
//元素的个数,一般最多写10个;
数组的索引:
1.声明数组时,JS自动分配的,用于操作数组中的每一个元素
2.从0开始,最大的索引长度是元素长度的减(-)1;
通过下标取出第一个元素
注: 下标取出元素 数组名[索引];
例如:var arr = ['言笙',18,'女','安徽','15000'];
// console.log(arrr[0]);
// console.log(arr[3]);
最大元素长度-1
// console.log(arr[4]);
修改数组的元素,本质是用新的元素覆盖旧的元素;
// arr[3] = '上海';
// console.log(arr);
添加元素
索引可以不用连续
例:添加下标为8的元素
arr [8] = ‘本科’;
console.log(arr);
系统强制在中间添加空元素;
如果输出空元素,则会输出undefined;
console.log(arr[6]);//undefined
数组的长度 .length
获取数组的长度
console.log(arr.length);
遍历(for的使用)
数组的遍历:本质是使用for构造出函数的索引,再通过索引取出元素;
// var arr = ['言笙',18,'安徽',15000,'麻辣烫'];
// // console.log(arr.length - 1);
// for (var i = 0; i < arr.length; i++){
// // console.log(i);
// console.log(arr[i]);
// }
数组的赋值方法:
//修改
// arr[2] = '百威';
//添加元素
// arr[5] = '汾酒';
// var str = '凤酒';
// arr[6] = str;
数组的方法:
//sort() 排序;
// console.log(arr1.sort());
//反转
// console.log(arr1.reverse());
//分割为字符串
// console.log(arr.join('-'));
//合并数组
// console.log(arr.concat(arr1,arr2));
// var newArr = arr.concat(arr1,arr2);
// console.log(newArr);
//弹出数组最后一个元素
// console.log(arr2.pop());
//数组最后添加元素
// arr2.push('胡辣汤');
// console.log(arr2);
//弹出第一个元素
// console.log(arr2.shift());
//在数组最前面添加元素
// arr2.unshift('蒸面条');
// console.log(arr2);
//数组的分割
// console.log(arr.slice(0,2));
//注:包含开始(start),但不包含结束(end);
各种数组的类型:
/*
数组的类型,主要取决于数组中的元素
对象类型的数组
{}
*/
var arr= [
{name:'新娘',price:10000,img:'xx.jpg'}
];
console.log(arr);
console.log(arr[0]);
console.log(arr[0].name);//取出name
多维数组:
二维数组:
var arr1 = [
['a','b','c'],
['aa','bb','cc'],
[1,2,3]
];
//二维数组的操作
// console.log(arr1[1]);
// console.log(arr1[1][1]);
// console.log(arr1[2][2]);
多维数组:
// var student = [
// ['zs',18,[
// '桌球','乒乓球','篮球','足球'
// ]]
// ];
// console.log(student);
// console.log(student[0]);
// console.log(student[0][2]);
// console.log(student[0][2][0]);
练习题:
//定义一个30项的数组,数组的每一项要求是1-10的随机数.
//产生随机数
function ran (){
return Math.ceil( Math.random() * 10)
}
// console.log(ran());
var arr = [];
for (var i = 0 ;i<30;i++){
//向数组尾部添加元素
arr.push(ran())
}
console.log(arr);
for-in遍历
for-in遍历不需要确定次数
var arr = ['可乐','雪碧','红牛','雀巢'];
// key就是数组的下标
for (var key in arr){
// console.log(key);
console.log(arr[key]);
}
对象的遍历
// var obj = {
// name:'小甜甜',
// age:18,
// sex:'女'
// }
// for (var key in obj){
// // console.log(key);
// console.log(obj[key]);
// }
冒泡排序
依次对数组中相邻数字进行比较(两两比较),大的放后面;
//交换两个变量的位置
//使用第三个变量
// var a = 10; 定义a
// var b = 12; 定义b
// var c = ''; c为空
// c = a ; a的值赋值c
// a = b; b的值赋值a
// b = c; c的值赋值b
// console.log(a,b);
//将最大的值放到最后
var arr = [5,4,3,2,1];
for (var i = 0 ; i < arr.length ; i++){
//arr[i]表示当前正在循环的值
//arr[i + 1]表示下一个值
if (arr[i] > arr[i + 1]){ //前一个值大于后一个值,交换位置
var tmp = arr [i];
arr[i] = arr[i+1];
arr[i+1] = tmp
}
}
console.log(arr);
理解:
比较相邻的元素。如果第一个比第二个大,就交换他们两个。
对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
针对所有的元素重复以上的步骤,除了最后一个。
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
选择排序
两个值互相比较,小的值放在前面
//找到最小的值,放到前面
var arr = [5,4,3,2,1];
// 1 假设最小值
var min = arr[0];
var minIndex = 0;
// 2 使用假设最小值,和数组的每一个元素进行比对,找到最小值;
for (var i= 1; i<arr.length;i++){
if(min>arr[i]){
//
min=arr[i];
minIndex = i;
}
}
// console.log(minIndex);
//交换假设最小值和真正最小值的位置;
arr[minIndex] = arr[0];
arr[0] = min;
console.log(arr);
理解:
将第一位依次与后面的元素相比较,得到最小值,与第一位交换。
再用第二位依次与后面元素相比较,得到最小值,与第二位交换。
从原始数据中找到最小元素,并放在数组的最前面。
然后再从下面的元素中找到最小元素,放在之前最小元素的后面,直到排序完成
栈和堆
每个内存单元中分为两个部分,栈(stack)和堆(heap);
栈内存:
主要储存各种基本类型的变量,包括Boolean\Number\string\Undefined\Null,以及对象变量的指针;每个单元大小基本相等;
优点:
存取速度快,仅次于直接位于CPU中的寄存器,数据可以共享;
缺点:
存在栈中的数据大小与生存期必须是确定的,缺乏灵活性;
堆内存:
动态分配的内存,大小不定,也不会自动释放,存在引用类型;
指那些可能有多个值构成的对象,包含引用类型的变量,但实际保存的不是变量本身,而是指向该对象的指针;
引用类型:Function,Array,Object
栈内存中,存放的有堆内存中保存的对象对应的指针.每一次调用Object,都是通过栈中指针找到堆中Object的实际位;
//声明两个变量,赋值
var a =10;
var b =a;
b =20;
//声明对象进行比较
var obj1 = {
name:'zs',
age:18
}
var obj2= obj1;
// 观察obj1的值,是否变化
obj2.age =28;
对象的本质和意义
对象意义
Js中的所有对象有相对应的属性和方法;
对象中都是 key:value
key一般不用加'',
value是字符串就要加
// 使用
// 属性 对象.属性名
// console.log(obj.name);
// 方法
// obj.say();
// console.log(obj.'name'); // 错误
// 重新赋值
// obj.name = 'My dream';
// 添加属性
// obj.info = '我是一个小清新';
// console.log(obj);
// 构造函数创建对象
// var obj1 = new Object({ name: '言笙', age: 18 });
// console.log(obj1);
// console.log(obj1.age);
// [] 当属性是变量的时候使用
// console.log(obj.name);
// str是变量
// var str = 'name';
// 相当于获取obj中的str属性
// console.log(obj.str); // undefined
// console.log(obj[str]);
// var str1 = 'age';
// console.log(obj[str1]);
对象的操作:
//var obj = {};
var obj = new Object();
// 动态的添加属性和方法
obj.name = '小番茄';
obj.age = 18;
obj.skill = function () {
console.log('你好呀');
}
console.log(obj);
JSON表示对象的方法
JSON是独立语言;用于储存和传输数据的格式,通常用于服务端向网页传递数据;
JSON的语法规则:
数据为 键/值 对。
数据由逗号分隔。
大括号保存对象
方括号保存数组
在JSON中 键 也要用引号引起来;
//json对象 和对象的区别就是key加双引号
例如用JSON对象保存一个人的信息:
var json = {"name":"言笙","age":18,"sex":"女"};
console.log(json);
输出为:{name: "言笙", age: 18, sex: "女"};
JSON数组
用于储存多个人的信息
var arr = [
{"name":"言笙","age":18,"sex":"女"},
{"name":"言情","age":18,"sex":"男"}
];
console.log(arr);
输出为:{name: "言笙", age: 18, sex: "女"};
{name: "言情", age: 18, sex: "男"};
JSON对象成员的使用,添加方法
var demo = {
"name":'zs',
"age":18,
"eat":function(){
alert(1234);
}
}
console.log(demo.name);
console.log(demo.eat());
// 可以像对象那样调用属性和方法