首页 > 代码库 > Unit06: 数组的常用方法_2 、 二维数组 、 String_1
Unit06: 数组的常用方法_2 、 二维数组 、 String_1
1.数组API
数组=数据+操作数据的API
1. 数组 to String:2种:
var str=arr.toString();
-->输出数组中的内容,每个元素用逗号分隔
-->自动调用
var str=arr.join("连接符") *******
-->输出数组中的内容,自定义元素间连接符
批量操作页面元素时,可以用join拼接成innerHTML,一次性修改
何时使用:2种固定套路
1. 将字符组成单词:arr.join("")
2. 将单词组成句子:arr.join(" ")
2. 拼接和截取:*API无法直接修改原对象,而返回新对象*
拼接:var newArr=arr.concat(另一个数组,值1,值2...) 另一个数组会打散成每个元素;
复制子数组:var subArr=arr.slice(starti,endi+1); **********
含头不含尾
endi+1 可省略,截取到最后一位;
两个参数都可以给负值,负值从后数,从-1开始;含头不含尾不会改变;
3. splice: 删除 插入 替换
1. 删除:直接修改原数组对象
[var deleted=]arr.splice(starti,删除个数)
返回本次删除元素组成的数组
2. 插入:
arr.splice(starti,0,新值1,...)
3. 替换:
arr.splice(starti,删除个数,新值1,...)
4. arr.reverse(); 颠倒数组中所有元素; 直接修改原数组对象
优化:
1.问题:频繁字符串拼接,造成内存浪费;(频繁+=会有浪费的字符串;) (demo1)
解决:先将要拼接的字符串放入数组;
最后 arr.join("");
2.数组API
1.数组排序;arr.sort(); (demo2)
sort()将一切数组元素默认转成 字符串 比较的;升序排序;
*比较器函数:
专门判断或者比较任意两数大小的函数;
2个特点:
- “固定要2个参数”,分别表示要比较的任意两值;
- 无论比较逻辑是什么,都要“返回一个数字”(这个数字要说明两个参数的关系);
**函数"对象"作为参数:
js中函数本质是一个对象;
函数名本质是指向函数对象的变量;
函数名后加“( )”,表示立即执行,
将函数作为对象传递时,不加“( )”;
如何自定义sort方法的排序?
arr.sort(比较器函数)
*颠倒比较器结果的正负,可改升序为降序排列*
2.栈和队列:数组模拟 (demo3)
栈和队列:js中没有真正的栈和队列的类型
一切都是用数组对象模拟的
栈:只能从一端进出的数组,另一端封闭
FILO
何时使用:今后只要仅希望数组只能从一端进出时
如何使用:2种情况:
1. 末尾出入栈:已入栈元素的下标不再改变
入栈: arr.push(新值1,...)
出站: var last=arr.pop()
2. 开头出入栈:每次入栈新元素时,已入栈元素的位置都会向后顺移。
入栈:arr.unshift(新值1,...);
出站:var first=arr.shift();
队列:只允许从末尾进入数组,必须从开头出数组
FIFO
结尾入队列:arr.push();
开头出队列:var first=arr.shift();
Map:对数组中每个元素执行相同的函数;
var arr=[4,9,16];
arr=arr.map(Math.sqrt);
console.log(arr);//[2,3,4]
var arr=[4,9,16];
function fun(n){
return n+1;
}
arr=arr.map(fun);
console.log(arr);//[5, 10, 17]
Map调用回调函数,不修改原数组;
回调函数要求:
必须要有一个参数;
必须要有一个返回值;
3.二维数组:(demo4)
数组中的元素,又引用了另一个数组对象
使用:2种;
- 保存横行竖列的二维数据;
- 保存上下级关系;
如何创建:
1.先创建空数组,再赋值;
var arr=[];
arr[0]=["石家庄","保定","唐山"]
arr[1]=["德州","济南","烟台"]
2. 创建数组时,同时初始化子数组:
var data=http://www.mamicode.com/[
[0,2,2,4],
[2,4,4,8],
[16,32,16,8],
[4,2,128,4]
];
3.如何访问二维数组中的数据:arr[行下标][列下标]
比如:data中第2行,第3个元素
data[1][2]
强调:二维数组中,行下标不能越界!
console.log(data[1][5]); //undefined
console.log(data[5][1]); //
//undefined[1]
arr.indexOf(值):在数组中找某个值得位置,找到返回下标,没找到返回-1;
遍历二维数组:
固定套路:外层循环遍历行,内层循环遍历列;****
var arr=[[...],[...]...]
for(var r=0;r<arr.length;r++){
for(var c=0;c<arr[r].length;c++){
}
}
4.string:(demo5)
多个字符组成的一个只读的集合(数组);
凡是数组对象中,不修改原对象的API,字符串都能用。
.length属性;字符个数,可以用[i]访问每个字符;
如:slice(),indexOf()
凡是数组对象中,直接修改原对象的API,字符串都不能用。
如:push(),sort(),splice()
内置对象:
ES标准中已经定义好的,由浏览器厂商已经实现的对象;
11个:
String Number Bollean 包装类型
Array Date RegExp Math(不能new)
Error
Function Object
Global(全局,在浏览器中叫 Window)
包装类型:(demo5) String Number Bollean(不能new)
封装原始类型数据,提供了对原始类型数据的操作方法。
自动使用。
原始类型的值,本身没有任何方法,当程序中,使用原始类型数据调用方法时(方法前必须是个对象),程序会自动创建“包装类型对象”封装该数据。
函数调用完,包装类型自动释放。
String API:*所有API都无法直接修改原字符串*
转义字符:
当字符串的内容和程序的特殊符号冲突时
或字符串中包含功能字符时,都用“\”转化字符的意义,
\n:换行 \t: 一次缩进Tab键
大小写转换:
将字符串中所有字符都统一转为大写或小写
何时使用:不区分大小写时
比如:用户名 验证码 电子邮件
转大写:str=str.toUpperCase();
转小写:str=str.toLowerCase();
获取指定位置的字符:3种:
1. str[i]
2. str.charAt(i)
3. str.charCodeAt(i)-->获得字符的unicode号
查找关键字的位置:2种:
1. var i=str.indexOf(kword[,starti]);
从左向右,查找kword首字符在字符串中的下标
如果没找到,返回-1
starti:从starti位置开始向后查找下一个
如果省略starti,默认从0开始找
2. var i=str.lastIndexOf(kword[,starti])
从starti位置开始,向左找!下一个kword ;starti是负数时,lastIndexOf会将它变为0;******
lastIndexOf只关心关键字第一个字符在自己的哪边;
解决:如果最后一次找到0就立即退出;break
转成字符串最快的方法就是:加空字符串+""; *****************
return后不加数据,单独使用,表示退出“函数”执行;
break:停止"当前结构"的执行,并跳出当前结构;不影响程序继续向后运行。单独用;********** 不是每个case都要加break;
面试题:
var str="youcanyouup nozuonodie";
var arr=str.split("").sort().join("").match(/(.)\1+/ig); // \1:与第一个()相同的内容;
arr.sort(function(a,b){return b.length-a.length});
console.log(arr[0][0]); //出现次数最多的字符是哪个
console.log(arr[0].length); //出现次数最多的字符的长度
Unit06: 数组的常用方法_2 、 二维数组 、 String_1