今天要介紹的咒語Math.pow()
相對單純
「這是一個非常古老的大砲。」
直接唸一遍就開始吧!
「寐偲,砲!」
Math.pow()
唸起來就像是中文某種火砲的名稱呢!但不是。在英文中要表示a
的b
次方會說「a to the power of b」,所以pow
就是指英文的power
,因此而得名。
Math.pow(base, exponent)
放入一個數字作為基底數
放入一個數字作為指數
它會回傳 base 的 exponent 次方,有幾個情況會回傳NaN
:
NaN
。NaN
且 exponent 不為0
。±1
且 exponent 為±Infinity
。0
且 exponent 不為整數。
這個函式會將傳入的base
跟exponent
轉成數字,最後回傳 Number::exponentiate(base, exponent)
,看起來又是一個不知道什麼操作,讓我們進去看看吧!
底下演算法的部分就忽略吧!我們目前只需要知道這個操作的目的:
「抽象操作—數字求冪,接收『base』跟『exponent』然後回傳一個數字,他會是 base 的 exponent 次方的近似值。」
下面的註解:
「當 base 為1
或-1
且 exponent 為正無限大或負無限大,或base為1
且 exponent 為NaN
時,base ** exponent 的結果會與IEEE 754-2019不同。ECMAScript 的最初版將這個結果定為NaN
,而IEEE 754後續的版本改成了1
。ECMAScript 基於相容性問題,選擇保留了之前NaN
的版本。」
這個運算在先前的版本中結果會是NaN
,有些開發者可能會利用這樣的結果來進行邏輯判斷,如果後續更改了它的結果,在這些舊版的程式中的運算就有可能朝向錯誤的邏輯分支,因此 ECMAScript 保留了舊版的行為來確保舊版的程式依舊能正常執行。
咦?啊結果看一看Math.pow()
跑出了**
運算子?
結果去找還真的被我找到(廢話):
在一般的數字操作上**
也是一樣的規範,所以我們可以認定Math.pow()
跟**
在這個部分是一樣的操作(但實際上引擎要不要用一樣的方式實作還是取決他們自己),但可以注意到下面,**
也能做BigInt
的運算。
既然他們都做一樣的事,那該如何取捨呢?
這邊提供大家一個網站Can I use
在裡面搜尋關鍵字就能知道這個語法在各瀏覽器版本的支援程度,就能當作一個你該不該使用這個語法的根據之一。
可以看到支援Math.pow()
的版本是比較多的,因為**
是2016 ES7才被引入的。
也就是說在一些版本相對較舊的瀏覽器是沒有辦法使用**
的,那為了確保程式能夠正常執行,使用Math.pow()
是相對安全的做法!
但現今大多瀏覽器都已經支援**
了,這個新的語法顯得更簡潔有力,尤其是在一連串的數學運算中,且又能做BigInt
的運算,所以除非你將運行的瀏覽器實在太老舊,否則**
似乎是更好的選擇。
最後來測試使用看看吧!
console.log(Math.pow(2, 3)); //8
console.log(Math.pow(-2, 3)); //-8
console.log(Math.pow(3, 0)); //1
console.log(Math.pow(1, Infinity)); //NaN
console.log(Math.pow(2, Infinity)); //Infinity
console.log(Math.pow(Infinity, 3)); //Infinity
console.log(Math.pow(NaN, 0)); //1
console.log(Math.pow(NaN, 1)); //NaN
雖然Math.pow()
已過時,但詠唱著古老的咒語是不是也充滿著神秘力量呢?
「寐偲,砲!」
明天再見啦~
參考資料:
MDN-Math.pow()
ECMAScript-Math.pow()
can i use