[TOC]
## 关于arguments
arguments是一个类数组集合,它不是数组,不能直接使用数组的方法
## slice
```
//Array.prototype.slice = function(){}
var ary = [12,23,34];
ary.slice(); //让找到的slice方法执行,在执行 slic方法的过程中,才把ary数组进行了截取
```
IE6~8中,不支持借用数组的slice实现将元素集合的类数组转化为数组,但是arguments是支持的。
```
var utils = {
listToArray:function(likeAry){
var ary = [];
try{
ary = Array.prototype.slice.call(likeAry);
}catch(e){
for(var i=0;i<likeAry.length;++i){
ary[ary.length] = likeAry[i];
}
}
return ary;
}
}
```
## toString
```
console.log([1,2,3,4,5].toString()) //1,2,3,4,5
```
模拟内置的slice实现数组克隆的功能
```javscript
Array.prototype.mySlice = function(start,end){
//this->当前要操作的这个数组ary
var ary = [];
end=end?end:this.length-1;
for(var i=start;i<end;++i){
ary[ary.length] = this[i];
}
return ary;
}
```
```
//--- --- ---
//arguments变成真·数组原理
// for(var i=0;i<arguments.length;++i){
// ary[ary.length] = arguments[i];
// }
// return ary;
//通过call等将slice方法中的this替换成了aruguments
```
## sort
返回排序后的数组。原数组已经被排序后的数组代替
sort默认不传参可以处理10以内的数字排序
```
ary.sort();
```
回调函数:把一个方法A当做参数值传递给另外一个函数B,然后在B执行的过程中,我们随时根据需求让A方法执行
```
function A(){
}
function b(){
fn();
fn();
fn();
}
B(A)
```
```
ary.sort(function(a,b){
//a->每一次执行匿名函数的时候,找到的数组中的当前项
//b->当前项的后一项
return a-b; //->升序
return b-a;//->降序
//->return的是一个>0 或 <=0的数,大于>0让a和b交换位置,小于等于0,原来的位置不动
})
```
```
ary.sort(functio(a,b){
return 1; //永远交换位置
});
```
### 二维数组排序
```
var ary = [
{name:'克丽丝',age:78}
,{name:'安吉拉',age:13}
,{name:'艾伯特',age:107}
,{name:'梅森',age:256}
];
//->给二维数组排序,按照年龄由小到大进行排序
ary.sort(function(a,b){
return parseFloat(a.age) - parseFloat(b.age);
})
```
### localeCompare
![](https://box.kancloud.cn/403c370d3d804972ced1038186673fc6_402x431.png)
```
ary.sort(function(a,b){
return a.name.localeCompare(b.name);
})
```
关于sort实现:
sort依据传入的数组不同,选择的算法不同。
## 求最大值,最小值
1)sort排序法
```
ary.sort(function(a,b){
return a-b;
})
var min = ary[0];
var max= ary[ary.length-1];
```
2)`Math.min`需要将要比较的数一个个传递进来,这样才可以得到最后的结果,一下放一个ary数组进来是不可以的
```
var min = Math.min.apply(null,ary);
```
或则通过`eval`和字符串拼接
```
var max = eval(`Math.max(${ary.toString()})`)
```
3)假设法:假设当前数组中的第一个值是最大值,然后拿这个值和后面的项逐一进行比较,如果后面某一个值比假设的还要大,说明假设错了,我们把假设的值进行替换...
```
var max = ary[0],min=ary[0];
for(var i=1;i<ary.length;++i){
var cur = ary[i];
cur>max?max=cur:null;
cur<min?min=cur:null;
}
```
## 求平均数
```
//去掉最大和最小
function avgFn(){
//->1、 将类数组转换为数组
var ary = Array.prototype.slice.call(arguments)
//->2、 给数组排序,去掉开头和结尾,剩下的就是求平均数
ary.sort(function(a,b){
return a-b;
});
ary.shift();
ary.pop();
return eval(ary.join("+"))/ary.length.toFixed(2);
}
//xx.toFixed(n) number类型的方法,保留小数点后n位
```
```
function avgFn(){
[].sort.call(arguments,function(a,b){
return a-b;
});
[].shift.call(arguments);
[].pop.call(arguments);
return eval([].join.call(arguments,"+")/arguments.length).toFixed(2)
}
```
## join
### undefined 和 join
undefined这一项会直接被忽视,包括属于它的`,`
```
let o = {a:1,b:2,c:3}
console.log(o[undefined]) //undefined
console.log([undefined,1].join('')) //1
```
## forEach
**无法跳出循环!** 除了try catch 抛出异常,但显然这没鸟用
- 空白目录
- window
- location
- history
- DOM
- 什么是DOM
- JS盒子模型
- 13个核心属性
- DOM优化
- 回流与重绘
- 未整理
- 文档碎片
- DOM映射机制
- DOM库封装
- 事件
- 功能组件
- table
- 图片延迟加载
- 跑马灯
- 回到顶部
- 选项卡
- 鼠标跟随
- 放大镜
- 搜索
- 多级菜单
- 拖拽
- 瀑布流
- 数据类型的核心操作原理
- 变量提升
- 闭包(scope)
- this
- 练习题
- 各种数据类型下的常用方法
- JSON
- 数组
- object
- oop
- 单例模式
- 高级单例模式
- JS中常用的内置类
- 基于面向对象创建数据值
- 原型和原型链
- 可枚举和不可枚举
- Object.create
- 继承的六种方式
- ES6下一代js标准
- babel
- 箭头函数
- 对象
- es6勉强笔记
- 流程控制
- switch
- Ajax
- eval和()括号表达式
- 异常信息捕获
- 逻辑与和或以及前后自增
- JS中的异步编程思想
- 上云
- 优化技巧
- 跨域与JSONP
- 其它跨域相关问题
- console
- HTML、XHTML、XML
- jQuery
- zepto
- 方法重写和方法重载
- 移动端
- 响应式布局开发基础
- 项目一:创意简历