函數(shù)中的形參和實(shí)參
形參: 相當(dāng)于生產(chǎn)洗衣機(jī)的時(shí)候提供的入口,需要用戶(hù)執(zhí)行函數(shù)的時(shí)候把需要的值傳遞進(jìn)來(lái),形參是個(gè)變量,用來(lái)存儲(chǔ)和接受這些值
實(shí)參: 用戶(hù)執(zhí)行的時(shí)候傳遞給形參的具體值
// 隨便求出兩個(gè)數(shù)的和
function sum(num1,num2){ // num1/num2 就是形參變量(類(lèi)似于var了一下)
var total = num1 + num2;
total *= 10;
total = total.toFixed(2);
console.log(total)
}
//
sum(1,2) // -> 30.00
sum(3,4) // -> 70.00
sum(23,41) // -> 640.00
sum(10) // num1 = 10;num2 = undefined; undefined = NaN ; 10 + NaN = NaN;
// 隨便求出兩個(gè)數(shù)的和
function sum(num1,num2){
// 如果有一個(gè)值沒(méi)有傳遞的話(huà),為了保證結(jié)果不是NaN,我們?yōu)槠湓O(shè)置一個(gè)默認(rèn)的值: 0;
typeof num1 === "undefined"?num1 = 0: null; // -> num1 = num1 || 0;
typeof num2 === "undefined"?num2 = 0: null; // -> num2 = num2 || 0;
// 容錯(cuò)處理
var total = num1 + num2;
total *= 10;
total = total.toFixed(2);
console.log(total)
}
arguments 實(shí)參集合
當(dāng)我們不知道用戶(hù)具體要傳遞幾個(gè)值的時(shí)候(傳遞幾個(gè)值都行),此時(shí)我們無(wú)法設(shè)置形參的個(gè)數(shù),遇到此類(lèi)需求,需要使用內(nèi)置的實(shí)參集合: arguments
- arguments只有函數(shù)才有
- 不管執(zhí)行函數(shù)的時(shí)候時(shí)候傳遞實(shí)參, arguments天生就存在,沒(méi)有傳遞實(shí)參arguments是個(gè)空集合, 傳遞了arguments中包含了所有的實(shí)參值
- 不管是否設(shè)置了形參,arguments中始終存儲(chǔ)了所有的實(shí)參信息.
function sum(){
console.log(arguments);
}
sum(1,2,3) // ->Arguments(3) [1, 2, 3, callee: ?, Symbol(Symbol.iterator): ?]
arguments是一個(gè)類(lèi)數(shù)組集合
- 以數(shù)字作為索引(屬性名), 從零開(kāi)始
arguments[0] 第一個(gè)實(shí)參
arguments[1] 第二個(gè)實(shí)參
...- 有一個(gè)length的屬性,存儲(chǔ)的是當(dāng)前集合的長(zhǎng)度(當(dāng)前傳遞的實(shí)參個(gè)數(shù))
arguments.length
arguments['length']arguments.callee: 存儲(chǔ)的是當(dāng)前函數(shù)本身
arguments.callee.caller: 存儲(chǔ)的是當(dāng)前函數(shù)在哪執(zhí)行的(宿主本身),在全局環(huán)境下執(zhí)行的,結(jié)果是: null
"use strict" // 開(kāi)啟嚴(yán)格模式
function sum(){
console.log(arguments.callee)
// Uncaught TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them
}
sum()
// arguments.callee或者arguments.callee.caller一般真正的項(xiàng)目中很少使用,因?yàn)樵趈s嚴(yán)格模式下,或報(bào)錯(cuò)
function sum(){
var total = null;
for (var i = 0; i < arguments.length; i++) {
var cur = arguments[i]; // 每一輪循環(huán)獲取當(dāng)前傳遞的那個(gè)實(shí)參值
// 為了防止字符串+數(shù)字是字符串拼接不是數(shù)學(xué)累加,我們最好把其他數(shù)據(jù)類(lèi)型首先轉(zhuǎn)換為number類(lèi)型
cur = Number(cur);
if(isNaN(cur) === false){
total += cur;
}
}
console.log(total);
}
sum(10,20);
sum();
sum(10,20,'30');
sum(10,20,'30','lelei');
function sum(){
var total = null;
for (var i = 0; i < arguments.length; i++) {
var cur = Number(arguments[i]);
!isNaN(cur)?total += cur:null;
}
console.log(total);
}
sum(10,20);
sum();
sum(10,20,'30');
sum(10,20,'30','lelei');