***数组
1. 程序=数据结构+算法
算法:描述一个程序的执行步骤:分支结构,循环结构
数据结构:好的数据结构可以极大提高程序执行效率
2. 数组:批量管理多个数据的存储结构
为什么使用数组:多个数据分组,连续存储,
提高程序执行效率
程序中的数组:多个连续的存储空间,起一个统一的变量名
如何使用数组:
创建数组:4种
1. 创建数组同时,初始化数组内容:
var week=['日','一','二','三','四','五','六'];
2不限制:1. 不限制元素的数据类型
2. 不限制元素的个数
2. 创建空数组:
var arr=[];
何时使用?暂时无法初始化数组内容
3. 使用new关键字,创建指定元素个数的数组
var arr=new Array(元素个数);
比如:var arr=new Array(7);
var arr=[ , , , , , , ]
4. 使用new关键字,在创建同时初始化
var arr=new Array(值1,值2,...)
相当于 =[值1,值2,...]
3和4容易产生歧义——了解
修改数组中的数据:
数组中的元素都是通过下标访问:数组变量[i]
下标:在数组中顺序唯一标识每个元素的序号
var week=['日','一','二','三','四','五','六'];
0 1 2 3 4 5 6
*下标从0开始,到元素个数-1结束*
var week=[];
week[0]="日"; ["日"]
week[1]="一"; ["日","一"]
week[3]="三"; ["日","一", ,"三",100]
0 1 3 100
week[100]=100;
*数组是引用类型的对象*
引用类型:数据不存在变量本地,变量中仅保存数据的地址
也称:变量“引用”了地址所在的对象
对象:程序中同时保存*多个*相关数据的数据结构,
描述现实中一个具体东西。
null和undefined:
undefined:任何仅声明未赋值的变量的默认值——不主动使用
null:用于主动清空一个引用类型变量的值,释放对象
何时使用null:2种:
1. 一个变量暂时未引用任何对象时,用null占位
2. 一个变量引用的对象,不再使用时,将对象中的地址替换为null——释放对象
释放对象:如果一个对象不再被任何变量引用,
被垃圾回收!——垃圾回收器——伴随程序运行的小程序
读取数组中的数据:数组中的每个元素用法和变量完全相同
数组变量[i]
对象:数据,对数据的操作(功能 API)
数组对象的API:
1. arr.length属性:数组中的元素个数!
强调:length包含中间跳过的不存在的元素
固定套路:
arr[arr.length-1]: 访问最后一个元素
arr[arr.length]=值: 向数组末尾追加一个新元素
arr.length=3; 将数组截断,仅保留前3个元素
被截断的元素,仍然存在,无法回收
只能随数组对象一起回收
***数组 API
1. 遍历数组:
从第一个元素开始,依次取出每个元素,执行相同操作
三要素:1. 循环条件:下标位置<arr.length
2. 循环变量:下标,从0开始,每次增1
3. 循环体:对每个元素要执行的操作
for(var i=0; i<arr.length ;i++){
arr[i]——取每个元素
执行相同的操作
}
2. 索引数组:以自动的顺序的序号,作为下标的数组
var arr=['日','一','二','三','四','五','六'];
0 1 2 3 4 5 6
关联数组:以自定义的字符串为下标
何时使用关联数组:数组中如果每个元素都有特殊的意义
key value
键 值
var fbb={"属性名1":属性值1,
"属性名2":属性值2,
... ...
};
关联数组 vs 索引数组
1. 关联数组,没有length属性!
2. 关联数组的下标是自定义的属性名,没规律
专门遍历关联数组的固定套路:
for(var key in arr){//依次取出arr中每个元素的属性名
临时保存在变量key中
arr[key]——获得当前key中保存的value
}
***冒泡排序:从小到大
规则:
依次比较相邻两个元素,如果前数>后数,交换前后两数位置。
否则不变,继续比较后两个数
API:
1. 将数组转为字符串:
var str=arr.toString():
输出数组中的每个元素的内容,以","分割
var str=arr.join('分割符')
输出数组中的每个元素的内容,以自定义的"分隔符"连接
固定套路:
将字母拼成单词:
var chars=['H','e','l','l','o'];
var word=chars.join(""); //Hello
将单词组成句子:
var words=['no','zuo','no','die'];
var stmt=words.join(" "); //no zuo no die
var word='H'+'e'+'l'+'l'+'o';
vs
var chars=['H','e','l','l','o'];
var word=chars.join(""); //Hello
总结:当发现大量字符串拼接或+=操作时,更好的做法是
将所有子字符串,先装入一个数组,再用数组的join
乘法口诀表数组版:
for (var n=1; n<=9 ; n++){
/*打印第n行——公式*/
}
/*打印第n行公式*/
for(var i=1,str=[]; i<=n; i++){
var r=i+"x"+n+"="+(i*n);
str[str.length]=r;
//["1x9=9" , "2x9=18" , "3x9=27" , ]
}
console.log(str.join(" , "));
2. 连接和截取:
连接:
var newarr=arr.concat(值1,值2,.....)
(数组1,数组2,......)
(值1,数组,值2,)
将参数中的数据,打散成每个元素,追加到arr末尾!
不改变原对象,返回一个新对象。
截取:
var newarr=arr.slice(starti,endi+1);
获取原数组中从starti位置开始,到endi位置的元素
组成新数组,返回。
***js中:含头不含尾***
比如:获取第2个元素到第6个元素的子数组
1 5+1
3. 删除,插入,替换:splice
删除:arr.splice(开始下标,删除个数)
插入:arr.splice(开始下标,0,新值1,新值2...)
原位置及之后的内容,被先后顺移
替换:
arr.splice(开始下标,删除个数,新值1,新值2...)
删除个数和补充个数,可以不一样!
4. 颠倒数组中的元素顺序:arr.reverse();
1. 数组自定义排序: arr.sort();
特点:1. 默认升序排列;
2. 默认将所有元素转为字符串,再排列
***自定义排序:2步:
1. 先定义比较器函数:专门比较任意两数大小的函数
特点:1. 两个参数:a, b
2. 通过返回值的正负,决定两数大小
比如:a-b>0 说明a>b
a-b<0 说明a<b
a-b=0 说明a=b
function compare(a,b){
return a-b;
}
compare(3,5); <0 3<5
compare(8,6); >0 8>6
2. 将比较器函数对象,作为参数传递给sort方法:
arr.sort(比较器函数名);
***一切皆对象:
//function compare(a,b){return a-b;}
/*js中"Everything is Object"*/
var compare=function(a,b){return a-b;};
/*1. 函数体本身也是一个对象!
2. 函数名其实是一个引用函数对象的普通变量*/
何时使用(): 1. 当方法作为对象传递时,不加()
2. 当调用方法执行时,加()
function声明方式创建的函数:在预读阶段被提前
vs
var 函数名=函数直接量:在预读阶段,*不提前*!
2. js中的栈和队列:本质就是普通数组
栈:一段封闭,仅从另一端出入的序列
FILO
从数组末尾出入栈:
入栈/压栈:arr.push(值1,值2...)
出栈/弹栈:var elem=arr.pop();
从数组头出入栈:
入栈:arr.unshift(值1,值2...)
出栈:var elem=arr.shift();
队列:只能从一端进入,只能从另一端出
FIFO
何时用队列:顺序取出数组中的元素,做处理时
(从尾)入队列:arr.push(值);
(从头)出队列:var n=arr.shift();
1. 二维数组:数组中的元素,又引用了另一个子数组对象
何时使用二维数组:2种:1. 要存储的数据有行,列结构特点
2. 数据存在上下级的包含关系
创建二维数组:2种:
//创建同时初始化
var data=[
[2 ,4 ,8,16],
[0 ,4 ,2,0],
[16,8 ,8,0],
[4 ,16,0,8]
]; length=4
//先创建空数组,再追加每个元素的子数组
var data=[];
data[0]=[2 ,4 ,8 ,16];
data[1]=[4 ,4 ,2 , 4];
data[2]=[16,8 ,8 , 8];
data[3]=[4 ,16,32, 8];
如何访问二维数组中的每个元素:
data[父数组下标][子数组下标]
行 列
遍历二维数组:
//外层循环遍历每一行
for(var row=0;row<data.length;row++){
//内层循环遍历行中的每个格
for(var col=0;col<data[row].length;col++){
data[row][col]——当前正在遍历的单元格
}
}
2. ***String:由多个字符组成一个字符序列(数组)
*字符串一旦创建,内容不可改变!*
字符串其实就是一串内容不可改变的字符数组
内置对象:ECMA标准中规定好的,由浏览器厂商已经实现的对象
程序员不必关心内部实现机制,直接调用即可
11个:
String Number Boolean ——包装类型
Array Date Math RegExp
Error(TypeError;ReferenceError...)
Function Object
全局对象Global | Window
包装类型:专门封装原始类型数据,并提供对数据常用操作
为什么会有包装类型:原始类型不能调用函数!
必须先用包装类型,包装成对象,再调用函数
包装类型的生命周期:
当使用原始类型调用函数时,自动创建包装类型对象
比如:var n=123.456;
console.log(n.toFixed(2));
//自动翻译成:
console.log(new Number(n).toFixed(2));
其中:new 表示创建一个对象
Number表示要创建对象的类型
(n)表示要放入对象中保存的数据
当函数调用结束,包装类型对象,自动释放!