這是我參與8月更文挑戰的第4天,活動詳情查看:8月更文挑戰javascript
代碼以下:html
function sum(a, b, c, d, e, f, g, h, i, j) {
var total = a + b + c + d + e + f + g + h + i + j;
return total;
}
sum(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
複製代碼
函數形參的侷限性:java
任意多個實參,此時形參不固定了。咋辦?
數組
爲了解決上面的形參的種種限制,瀏覽器爲函數內置一個arguments對象;瀏覽器
arguments:arguments叫作內置的實參集合,這個對象裏面包含了函數執行時傳遞進來的全部實參(內置:函數天生自帶的機制,不論是否設置了形參,也無論你是否傳遞了實參,arguments一直都存在)。markdown
使用arguments:函數
function sum2(n, m) {
console.log(n, m);
console.log(arguments);
arguments它是一個類數組(不是數組,不能直接使用數組中的方法)
即便設置形參變量,形參該是什麼仍是什麼,可是arguments存儲的是全部傳進來的實參,因此arguments被稱爲 實參集合
咱們發現它有索引,有length,能夠用for循環遍歷
{
0: 1,
1: 2,
2: 5,
3: 7,
4: 8
length: 5,
callee: 存儲的當前函數自己 arguments.callee == sum2 -> true
}
}
sum2(1, 2, 5, 7, 8);
複製代碼
function sum(...arg) {
...叫作展開運算符
arg 是一個形參變量
console.log(arg); arg是一個數組
}
sum(1, 2, 4, 5, 7);
複製代碼
思路:post
基礎版:ui
function sum3() {
1. 設立初始值
var total = 0;
2. 遍歷arguments
for (var i = 0; i < arguments.length;i++) {
var item = arguments[i];
total += item;
}
3. 把計算結果返回
return total;
}
var result = sum3(1, 2, 4, 5);
console.log(result);
複製代碼
升級版:爲了提升代碼的健壯性,咱們累加的時候須要判斷一下咱們傳進來的實參是否是一個數字,若是不是數字,咱們先給它轉成數字,而後再看轉換後是否是有效數字,若是是再加,若是不是就不加了。spa
function sum4() {
1. 設立初始值
var total = 0;
2. 遍歷arguments對象,取出每一項
for (var i = 0; i < arguments.length; i++) {
3. 無論你傳進來的是否是數字,都轉一次
var item = Number(arguments[i]);
4. 判斷轉換後的結果是否是有效數字累加,非有效數字直接跳過
if (!isNaN(item)) {
若是不是NaN就讓total加等於item
total += item;
}
}
return total;
}
console.log(sum4(10, '20', 'aa')); 30
複製代碼
2.1 函數表達式:把函數當作賦值給變量或者元素對象的事件屬性 2.2 自執行函數:建立和執行一塊兒完成的
var fn = function () {
console.log('我是一個函數表達式');
};
fn(); fn是一個變量名,它表明的也是一個函數
賦值給元素對象的事件屬性:
oBox.onclick = function () {};
普通對象的屬性值:
var obj = {
getName: function () {
console.log('江外琉璃')
}
}
obj.getName(); 由於obj.getName 是一個函數,所以也能夠執行
複製代碼
(function (i) {
第一部分是函數定義
console.log('i 是', i);
})(10); 後面的小括號放在函數後面就是讓函數執行的
如下都是自執行函數
~function (i) {
console.log(i);
}(10);
+function (i) {
console.log(i);
}(10);
!function (i) {
console.log(i);
}(10);
複製代碼
函數:分爲定義部分和執行部分
function rSum(num) {
if (num === 10) {
return 10
}
return num + rSum(num + 1)
若是函數的返回值遇到一個表達式,那麼函數會等着這個表達式求值完成最後把這個值返回出去。
return 1 + rSum(2)
return 1 + 2 + rSum(3)
return 1 + 2 + 3 + rSum(4)
return 1 + 2 + 3 + 4 + rSum(5)
return 1 + 2 + 3 + 4 + 5 + rSum(6)
return 1 + 2 + 3 + 4 + 5 + 6 + rSum(7)
return 1 + 2 + 3 + 4 + 5 + 6 + 7 + rSum(8)
return 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + rSum(9)
return 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + rSum(10)
return 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10
}
console.log(rSum(1));
複製代碼
function rSum2(num) {
if (num === 10) {
return 0
}
if (num % 3 === 0) {
return num + rSum2(num + 1)
} else {
return rSum2(num + 1);
}
return rSum2(2)
return rSum2(3)
return 3 + rSum2(4)
return 3 + rSum2(5)
return 3 + rSum2(6)
return 3 + 6 + rSum2(7)
return 3 + 6 + rSum2(8)
return 3 + 6 + rSum2(9)
return 3 + 6 + 9 + rSum(10)
return 3 + 6 + 9 + 0
}
console.log(rSum2(1));
複製代碼
注意:遞歸和for循環同樣,在使用時考慮好遞歸終止的條件。否則就會形成死循環,致使棧內存溢出(stack overflow)
var ary1 = [1, 2, 3];
var r1 = ary1.push(4, 5);
console.log(ary1, r1);
複製代碼
var ary2 = [1, 2, 4];
var r2 = ary2.pop();
console.log(ary2, r2);
複製代碼
var ary3 = [1, 2, 3];
var r3 = ary3.unshift(4, 5);
console.log(ary3, r3);
複製代碼
var ary4 = [1, 2, 3];
var r4 = ary4.shift();
console.log(ary4, r4);
複製代碼
var ary5 = [1, 2, 3];
var r5 = ary.splice(1, 2);
console.log(ary5, r5);
複製代碼
var ary6 = [1, 2, 3];
var r6 = ary6.splice(1, 1, 5);
console.log(ary6, r6);
複製代碼
var r7 = ary.splice(1, 0, 5);
var ary7 = [1, 2, 3];
console.log(ary7, r7);
複製代碼
var ary8 = [1, 2, 4, 5];
var r8 = ary8.slice(1, 3);
var r9 = ary8.slice(1);
var r10 = ary8.slice();
var r11 = ary.slice(0);
console.log(r8);
console.log(r9);
console.log(r10);
console.log(r11);
複製代碼
var ary12 = [1, 3, 5, 7];
var r12 = ary12.concat([9, 11]); 參數傳遞一個數組
console.log(ary12, r12);
var r13 = ary12.concat(9, 11); 參數傳遞數組項
console.log(ary12, r13);
var r14 = ary12.concat(); 一個參數不傳至關於把數組複製一份
console.log(r14);
console.log(r14 === ary12); false
複製代碼
var ary15 = [1, 3, 5, 7];
var str15 = ary15.join('+');
console.log(ary15, str15);
複製代碼
var ary16 = [1, 2, 5, 8];
var str16 = ary16.toString();
console.log(ary16, str16);
複製代碼
var ary17 = [1, 3, 5, 7];
var r17 = ary17.indexOf(3);
console.log(ary17, r17);
var r18= ary17.indexOf('bingo');
console.log(ary17, r18); -1
複製代碼
var ary19 = [1, 3, 5, 7, 3];
var r19 = ary19.lastIndexOf(3);
console.log(ary19, r19);
var r20 = ary19.lastIndexOf('bingo');
console.log(ary19, r20); -1
複製代碼
})
var ary21 = [1, 5, 2, 6, 4];
var r21 = ary21.sort(function (a, b) {
return a - b
});
var r22 = ary21.sort(function (a, b) {
return b - a;
});
console.log(ary21, r21, r22);
複製代碼
var re = ary21.reverse();
console.log(ary21, re);
複製代碼
})
var ary23 = [1, 2, 5, 7, 9];
var r23 = ary23.forEach(function (item, index) {
console.log(item, index);
});
console.log(ary23, r23);
複製代碼
var ary24 = [1, 2, 5];
var r24 = ary24.map(function (item, index) {
return item 2;
});
console.log(ary24, r24);
複製代碼