[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

```
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
- 方法重寫和方法重載
- 移動端
- 響應式布局開發基礎
- 項目一:創意簡歷