跳至內容
Astera Technology

console.log 有顯示,不等於函式有傳回值

把記錄動作和傳回值拆開看,找出 undefined 的來源。

下載完整個案資料及參考答案 ↓

先追這段程式

兩個函式都把 4 乘二:一個把 8 放入記錄,另一個傳回 8。例子用陣列模擬顯示記錄,方便一次過比較。

完整原始程式
const transcript=[];
function loggedDouble(n){transcript.push(n*2);}
function returnedDouble(n){return n*2;}
const result={logged:typeof loggedDouble(4),returned:returnedDouble(4),transcript};
console.log(JSON.stringify(result));
確實的 console 輸出
{"logged":"undefined","returned":8,"transcript":[8]}
值與執行位置
函式記錄呼叫者收到
loggedDouble(4)transcript: [8]undefined
returnedDouble(4)沒有寫入記錄8

結果為何如此

函式跑到結尾而沒有 return,呼叫者收到 undefined。記下數字是另一件事。這裡用 typeof 顯示 undefined;直接放入 JSON 物件,該欄反而會被省略。

比較另一種寫法

呼叫結果再加一會得 NaN,即使記錄內有 8。用 String() 寫清楚 NaN,避免 JSON 把它變成 null。

另開的有限例子
const transcript=[];function loggedDouble(n){transcript.push(n*2);}
console.log(JSON.stringify({next:String(loggedDouble(4)+1),transcript}));
另一寫法的輸出
{"next":"NaN","transcript":[8]}

試清邊界

loggedDouble 怎樣保留記錄,同時讓呼叫者算出 9?

查看參考答案

先存 n*2,寫入記錄後 return 同一值。呼叫者收到 8,便可再加一。

重新建立的邊界例子
const transcript=[];function doubled(n){const value=n*2;transcript.push(value);return value;}
console.log(JSON.stringify({zero:doubled(0),next:doubled(4)+1,transcript}));
邊界例子的輸出
{"zero":0,"next":9,"transcript":[0,8]}

原始例子檔案