題目說明
創建一個名為 ArrayWrapper 的類,它在其建構函式中接受一個整數陣列作為參數。該類別應具有以下兩個特性:
當使用 + 運算子將兩個該類的實例相加時,結果值為兩個陣列中所有元素的總和。當在實例上調用 String() 函數時,它將傳回一個由逗號分隔的括在方括號中的字串。例如,[1,2,3] 。
解題思路
題目看起來很難懂,我看了評論中其他網友的說明才知道,這和JavaScript中的自動類型轉換機制有關。
- JavaScript 中的自動類型轉換機制
- 加號運算符 (+) 與
valueOf()
,當使用 + 運算符時: - JavaScript 會嘗試將操作數轉換為原始值(primitive value)
- 在此轉換過程中,會自動調用對象的
valueOf()
方法,如果valueOf()
返回原始值(如數字),則使用該值進行運算 - 例如,
obj1 + obj2
; // 10
String()
函數與toString()
,當調用 String() 函數時:- JavaScript 會嘗試將參數轉換為字串
- 在此轉換過程中,會調用
toString()
方法 - 例如,
String(obj)
; // "[23,98,42,70]" (由逗號分隔的括在方括號中的字串)
- 加號運算符 (+) 與
簡單來說,當調用 valueOf()
方法時,要將nums中的元素相加,當調用 toString()
方法時,要將nums中的元素重新接成由逗號隔開且由中括號包裹的字串。
var ArrayWrapper = function(nums) {
this.nums = Array.isArray(nums) ? nums : [] // 首先判斷nums是否為陣列
};
ArrayWrapper.prototype.valueOf = function() { // 加號運算符 (+) 相當於調用 valueOf()
return this.nums.reduce((s, n) => s + n, 0)
}
ArrayWrapper.prototype.toString = function() { // String() 函數相當於調用 toString()
return `[${this.nums.join(",")}]`
}
總結
也就是說,當題目說「使用 + 運算符」時,表示需要實現 valueOf()
方法;而「調用 String() 函數」時,則表示需要實現 toString()
方法。這些是 JavaScript 中約定俗成的行為模式。
此外,由於JavaScript 沒有直接的運算符重載,但透過覆寫 valueOf()
與 toString()
方法,可以實現類似功能,使得物件可以參與數學運算,如 obj1 + obj2
、obj1 > obj2
等。
並且,由於ArrayWrapper
封裝了陣列,因此可以防止外部直接操作內部資料。
在本題目中,可以掌握以下實用技巧
Array.isArray()
用於類型檢查reduce()
用於陣列的結合操作- 模板字串與
join()
用於字串處理
在寫題目的過程中,除了能夠練習各種演算法的使用,也能夠累積JavaScript的基本知識點,cp值非常高🤩。