js的math中缺少的數(shù)學(xué)方法小結(jié)
JavaScript Math 對(duì)象包含一些真正有用且強(qiáng)大的數(shù)學(xué)運(yùn)算,可用于 Web 開發(fā),但它缺乏大多數(shù)其他語(yǔ)言提供的許多重要運(yùn)算,本文主要補(bǔ)充一些常用的數(shù)學(xué)方法。
sum 求和
sum函數(shù)將涉及對(duì)數(shù)組中的所有值求和。
有兩種編寫此函數(shù)的方法:我們可以使用循環(huán)for,或者使用reduce函數(shù)。
使用for循環(huán):
function sum(array){
let total = 0
for(let count = 0; count < array.length; count++){
total = total + array[count]
}
return total
}使用reduce:
function sum(array){
return array.reduce((sum, number) => sum + number, 0)
}這兩個(gè)函數(shù)的工作方式完全相同(reduce函數(shù)只是一個(gè)內(nèi)置for循環(huán)),并且將返回相同的數(shù)字(給定相同的數(shù)組)。但reduce功能要簡(jiǎn)潔得多。
能夠?qū)?shù)字列表求和可能是 JavaScript 的Math對(duì)象中最有用和最需要的但是缺失的數(shù)學(xué)操作。sum函數(shù)是一個(gè)很好的檢查工具。例如,在數(shù)獨(dú)中,我們可以通過(guò)檢查列/行之和是否為來(lái)檢查用戶在該列或行中是否沒有重復(fù)。如果我們想計(jì)算出總賬單,那么該函數(shù)在在線購(gòu)物應(yīng)用程序中也能很好地工作——假設(shè)所有價(jià)格都存儲(chǔ)在一個(gè)數(shù)組中。
按照購(gòu)物應(yīng)用程序示例,下面是示例:
const prices = [2.80, 6.10, 1.50, 1.00, 8.99, 2.99]
function totalCost(prices){
return prices.reduce((sum, item) => sum + item, 0)
}product 乘積
product函數(shù)將以與該函數(shù)類似的方式工作sum,只不過(guò)我們不是將列表中的所有數(shù)字相加,而是將它們相乘。
同樣我們可以使用與第一個(gè)sum函數(shù)幾乎相同的for循環(huán):
function product(array){
let total = 1
for(let count = 0; count < array.length; count++){
total = total * array[count]
}
return total
}注意,我們用1來(lái)初始化total變量,否則我們總是會(huì)得到.
使用reduce:
function product(array){
return array.reduce((total, num) => total*num, 1)
}這個(gè)函數(shù)的用途可能看起來(lái)并不明顯。但它在嘗試在一次計(jì)算中進(jìn)行多次轉(zhuǎn)換時(shí)非常有用。例如,如果我們想查找 10 個(gè)蘋果的價(jià)格(每個(gè) 1.5 元),滿10個(gè)打9折,與其使用巨大的乘法和,不如將所有值存儲(chǔ)在數(shù)組中并使用我們剛剛編寫的product函數(shù)。
const pricePer = 1.50 const number = 10 const discount = 0.9 const conversion = [1.5, 10, 0.9] const price = product(conversion)
奇數(shù)和偶數(shù)
這個(gè)函數(shù)將接受一個(gè)數(shù)字,并根據(jù)該數(shù)字是奇數(shù)還是偶數(shù)返回true或者false。
在 JavaScript 中編寫這些函數(shù)的最簡(jiǎn)單方法是使用余數(shù)運(yùn)算符(%)。當(dāng)一個(gè)數(shù)字除以另一個(gè)數(shù)字時(shí),這將返回余數(shù)。例如:
11 % 3 === 2 // 11 - 3 * 3 = 2
判斷是否偶數(shù)
function isEven(number){
return number % 2 === 0
}判斷是否是奇數(shù)
function isOdd(number){
return number % 2 !== 0
}能夠檢查一個(gè)數(shù)字是奇數(shù)還是偶數(shù)至關(guān)重要,而且非常簡(jiǎn)單。它可能看起來(lái)不那么重要,但可以作為一種很好的輸入驗(yàn)證技術(shù) - 例如,使用數(shù)組長(zhǎng)度來(lái)做判斷,簡(jiǎn)單地通過(guò)檢查兩人游戲的獲勝者??梢愿櫼呀?jīng)玩了多少輪。假設(shè)第一輪計(jì)為 1,如果數(shù)字為奇數(shù),則玩家 1 獲勝,如果數(shù)字為偶數(shù),則玩家 2 獲勝
function checkWinner(gamesPlayed){
let winner
if(isOdd(gamesPlayed)){
winner = "player1"
}
else{
winner = "player2"
}
return winner
}這些函數(shù)是可以互換的,我們很可能只需要使用其中一個(gè)。
factorial 階乘
自然數(shù)(任何嚴(yán)格大于 0 的整數(shù))的階乘是所有小于或等于該數(shù)的數(shù)的乘積。例如: 3 階乘(用 表示3!)是3 x 2 x 1 = 6。
有兩種創(chuàng)建factorial函數(shù)的方法:使用for循環(huán)和使用遞歸。遞歸算法,它們本質(zhì)上是重復(fù)調(diào)用自身直到達(dá)到“基本情況”的函數(shù)。
使用for循環(huán):
function factorial(number){
let total = 1
for (let i = 1; i < number+1; i++){
total = total * i
}
return total
}這種方式循環(huán)遍歷從 1 到 number 的所有數(shù)字(每次傳遞遞增),并將總數(shù)乘以每個(gè)數(shù)字,然后返回最終總數(shù)(數(shù)字階乘)。
使用遞歸:
function factorial(number){
if (number <= 0){
return 1
}
else{
return number * factorial(number - 1)
}
}在這個(gè)函數(shù)中,我們的基本情況為零,因?yàn)?code>0!的值為 1。這意味著,當(dāng)數(shù)字通過(guò)函數(shù)時(shí),只要它不為零,它就會(huì)將自身乘以factorial(number - 1)
factors 因子
因子成對(duì)出現(xiàn),每對(duì)因子相乘形成原始數(shù)字。例如:
- 10的因數(shù)是:1和10;2和5。
- 18的因數(shù)是:1和18;2和9;3和6。
factors函數(shù)接受一個(gè)數(shù)字,并返回一個(gè)包含其所有因子的數(shù)組。編寫此函數(shù)的方法有很多種,但最簡(jiǎn)單的方法是使用命令式方法:
function factors(number){
let factorsList = []
for(let count = 1; count < number+1; count++){
if(number % count === 0){
factorsList.push(count)
}
}
return factorsList
}首先,我們創(chuàng)建一個(gè)空數(shù)組。然后,我們使用for循環(huán)遍歷從 1 到數(shù)字本身的每個(gè)整數(shù),并在每次傳遞時(shí)檢查該數(shù)字是否可被該整數(shù)整除
查找數(shù)字的因子非常有用,特別是當(dāng)我們需要組建組時(shí) - 例如在在線游戲中,當(dāng)需要每個(gè)團(tuán)隊(duì)中有相同數(shù)量的用戶時(shí)。例如,如果我們有 20 個(gè)用戶,每個(gè)團(tuán)隊(duì)需要 10 名玩家,您可以使用一個(gè)factors函數(shù)將這 10 名用戶分成兩個(gè)團(tuán)隊(duì)進(jìn)行匹配。同樣,如果每支球隊(duì)需要四名球員,可以使用該factors函數(shù)將四支球隊(duì)匹配為五支球隊(duì)。
function createTeams(numberOfPlayers, numberOfTeams){
let playersInEachTeam
if(factors(numberOfPlayers).includes(numberOfTeams)){
playersInEachTeam = numberOfPlayers / numberOfTeams
}
else{
playersInEachTeam = "wait for more players"
}
return playersInEachTeam
}isPrime 質(zhì)數(shù)
質(zhì)數(shù):一個(gè)大于1的自然數(shù),除了1和它本身外,不能被其他自然數(shù)整除
我們可以結(jié)合上一個(gè)factors方法來(lái)實(shí)現(xiàn)。
function isPrime(number){
return factors(number).length === 2
}gcd 最大公約數(shù)
最大公約數(shù)運(yùn)算有時(shí)被稱為“最大公因數(shù)”,它可以找到兩個(gè)數(shù)字共有的最大因數(shù)。
例如:
- 12和15的GCD是3。
- 8 和 4 的 GCD 是 4。
解決這個(gè)問(wèn)題的一個(gè)簡(jiǎn)單方法是列出每個(gè)數(shù)字的所有因數(shù)(使用我們上面提到的factors``)并比較這些列表。然而,比較列表是一個(gè)效率低下的數(shù)組操作。
function gcd(number1, number2){
let inCommon = []
for(let i of factors(number1)){
if(factors(number2).includes(i)){
inCommon.push(i)
}
}
return inCommon.sort((a,b)=> b - a)[0]
}還有一種更簡(jiǎn)潔的方法是使用遞歸。這是一個(gè)非常著名的算法,稱為歐幾里得算法:
function gcd(number1, number2){
if(number2 === 0){
return number1
}
else{
return gcd(number2, number1%number2)
}
}lcm 最小公倍數(shù)
最小公倍數(shù)與最大公約數(shù)的類似,但是是找到的是兩個(gè)數(shù)字都是其因子的最小整數(shù)。
例如:
- 2和6的最小公倍數(shù)是6。
- 4和15的最小公倍數(shù)是60。
對(duì)于這個(gè)函數(shù),我們不能只創(chuàng)建一個(gè)包含每個(gè)數(shù)字的所有倍數(shù)的數(shù)組,因?yàn)檫@將是一個(gè)無(wú)限列表。
可以使用一個(gè)非常有用的公式來(lái)計(jì)算最小公倍數(shù):
(number1 x number2) / 最大公約數(shù)
比如:
(2 x 6) / gcd(2,6) = 12/2 = 6
實(shí)現(xiàn):
function lcm(number1, number2){
return (number1*number2)/gcd(number1, number2)
}這個(gè)函數(shù)可能沒有任何明顯的用途,但它非常適合兩個(gè)事件以不同時(shí)間間隔發(fā)生的情況,這意味著我們可以使用 lcm 來(lái)找出兩個(gè)事件何時(shí)同時(shí)發(fā)生。
例如,如果圖像被編程為每六秒出現(xiàn)一次,一段文本被編程為每八秒出現(xiàn)一次,則圖像和段落將在第 24 秒第一次一起出現(xiàn)。
到此這篇關(guān)于js的math中缺少的數(shù)學(xué)方法小結(jié)的文章就介紹到這了,更多相關(guān)js math缺少數(shù)學(xué)方法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
原生JS+CSS實(shí)現(xiàn)炫酷重力模擬彈跳系統(tǒng)的登錄頁(yè)面
今天小編給大家分享基于原生JS實(shí)現(xiàn)一個(gè)炫酷的登錄頁(yè)面,實(shí)現(xiàn)效果有點(diǎn)像重力模擬彈跳系統(tǒng),效果非常棒,需要的朋友參考下實(shí)現(xiàn)代碼吧2017-11-11
JS實(shí)現(xiàn)單張或多張圖片持續(xù)無(wú)縫滾動(dòng)的示例代碼
這篇文章主要介紹了JS實(shí)現(xiàn)單張或多張圖片持續(xù)無(wú)縫滾動(dòng)效果,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05
js實(shí)現(xiàn)鼠標(biāo)劃過(guò)給div加透明度的方法
這篇文章主要介紹了js實(shí)現(xiàn)鼠標(biāo)劃過(guò)給div加透明度的方法,涉及javascript動(dòng)態(tài)操作頁(yè)面元素屬性的相關(guān)技巧,該方法可兼容火狐與IE瀏覽器,需要的朋友可以參考下2015-05-05
JavaScript 事件監(jiān)聽實(shí)例代碼[兼容IE,firefox] 含注釋
JavaScript事件監(jiān)聽完整實(shí)例 含注釋,非常的不錯(cuò),大家可以直接使用。2009-08-08
javascript之IE版本檢測(cè)超簡(jiǎn)單方法
下面小編就為大家?guī)?lái)一篇javascript之IE版本檢測(cè)超簡(jiǎn)單方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-08-08
如何在uniapp項(xiàng)目中嵌套H5 頁(yè)面
在UniApp中可以通過(guò)使用 web-view 組件來(lái)嵌入H5頁(yè)面,大概思路是在該頁(yè)面的template部分添加web-view組件,設(shè)置src屬性為所需嵌入的H5頁(yè)面地址,感興趣的朋友跟隨小編一起看看吧2024-02-02
使用echarts實(shí)現(xiàn)3d柱狀圖+折線圖
這篇文章主要為大家詳細(xì)介紹了如何使用echarts實(shí)現(xiàn)3d柱狀圖和折線圖,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以了解一下2024-12-12
簡(jiǎn)單的前端js+ajax 購(gòu)物車框架(入門篇)
其實(shí),一直想把自己寫的一些js給總結(jié)下,也許是能力有限不能把它完美結(jié)合起來(lái)。只能自己默默的看著哪些代碼,無(wú)能為力2011-10-10
js為鼠標(biāo)添加右擊事件防止默認(rèn)的右擊菜單彈出
本文為大家介紹下如何為使用js為鼠標(biāo)添加右擊事件防止默認(rèn)的右擊菜單彈出,感興趣的朋友可以參考下,希望對(duì)大家有所幫助2013-07-07

