javaScript的Math數學物件 --用法大全
Math
是 JavaScript 的原生物件,提供各種數學功能。該物件不是建構函式,不能生成例項,所有的屬性和方法都必須在Math
物件上呼叫。簡而言之就如同java的靜態類一樣,都是通過類名.方法名()呼叫的。
Math物件的用法大致可以分為“靜態屬性”和“靜態方法”這兩大類,幾乎所有的前端運算都可以採取這兩種方式解決。有許多運算甚至如同小學生般的簡單,今日我就帶領大家“回爐重造,重返小學”。現在想想假如我們從小學就已經開始程式設計了,那麼……(今天公司的CTO可能就是你們,站在舞臺上裝逼的也是你們,你們也許就不會看我的技術文章了,而我可能還在繼續我的寫作)。
1.Math物件的靜態屬性
Math
物件的靜態屬性,提供以下一些數學常數。
Math.E
:常數e
。Math.LN2
:2 的自然對數。Math.LN10
:10 的自然對數。Math.LOG2E
:以 2 為底的e
的對數。Math.LOG10E
:以 10 為底的e
的對數。Math.PI
:常數π
。Math.SQRT1_2
:0.5 的平方根。Math.SQRT2
:2 的平方根。
Math.E // 2.718281828459045 Math.LN2 // 0.6931471805599453 Math.LN10 // 2.302585092994046 Math.LOG2E // 1.4426950408889634 Math.LOG10E // 0.4342944819032518 Math.PI // 3.141592653589793 Math.SQRT1_2 // 0.7071067811865476 Math.SQRT2 // 1.4142135623730951
特別注意: 這些屬性都是隻讀的,不能修改。
其實,我想說,上面這些亂七八糟的屬性,我壓根就不太懂,除了那個π,其它的一個也不認識,你們認識嗎?認識的請舉手,不認識的請閃過(因為這不重要)。
2.Math物件的靜態方法
Math
物件提供以下一些靜態方法。
Math.abs()
:絕對值Math.ceil()
:向上取整Math.floor()
:向下取整Math.max()
:最大值Math.min()
:最小值Math.pow()
:指數運算Math.sqrt()
:平方根Math.log()
:自然對數Math.exp()
:e
的指數Math.round()
Math.random()
:隨機數
下面我帶領大家一起來逐個分析這些小學生的方法:
2.1 Math.abs() 求絕對值
Math.abs(1) // 1
Math.abs(-1) // 1
各位同學們,有沒有回憶起來,小學的那節課將到了求絕對值的只是啊?歲月真是把殺豬刀,轉眼間,青春年華已逝去,往事不堪回首程式碼中。
2.2 Math.max(),Math.min() 返回最大,最小值
Math.max
方法返回引數之中最大的那個值,Math.min
返回最小的那個值。如果引數為空, Math.min
返回Infinity
, Math.max
返回-Infinity
。(補充:Infinity是javaScript能表達的最大整數,反之-Infinity是最小的。)
Math.max(2, -1, 5) // 5
Math.min(2, -1, 5) // -1
Math.min() // Infinity
Math.max() // -Infinity
2.3 Math.floor(),Math.ceil() 向下,上取整
Math.floor
方法返回小於引數值的最大整數(地板值)。
Math.floor(3.2) // 3
Math.floor(-3.2) // -4
Math.ceil
方法返回大於引數值的最小整數(天花板值)。
Math.ceil(3.2) // 4
Math.ceil(-3.2) // -3
同學們注意了,這裡有一個坑需要注意:如果你想捨棄掉小數部分,許多人往往會採用Math.floor()方法,那就錯了。因為如果引數是一個負小數,採用Math.floor()方法就改變,增大了負整數部分的值了。那麼如何解決這個問題呢?我們並不知道傳如的到底是正數,還是負數。這個時候高手就會想到用三元運算子,一氣呵成,菜鳥就總想著用if……else判斷,彷彿如果美妙的歌唱般習慣性的if…… “假如時光到流我能做什麼,找你沒說的卻想要的,假如我不放手你多年以後,會怪我恨我或感動。”對,沒錯,慣用if else的菜鳥們,就是這個節奏。
其實,咋們可以寫一個函式,解決這個問題:
function ToInteger(x) {
x = Number(x);
return x < 0 ? Math.ceil(x) : Math.floor(x);
}
ToInteger(3.2) // 3
ToInteger(3.5) // 3
ToInteger(3.8) // 3
ToInteger(-3.2) // -3
ToInteger(-3.5) // -3
ToInteger(-3.8) // -3
3.4 Math.round() 四捨五入法
Math.round(0.1) // 0
Math.round(0.5) // 1
Math.round(0.6) // 1
// 等同於
Math.floor(x + 0.5)
注意,它對負數的處理(主要是對0.5
的處理),且開始反人類了,顛覆你的三觀。
Math.round(-1.1) // -1
Math.round(-1.5) // -1
Math.round(-1.6) // -2
看看上面的程式碼,Math.round(-1.1),按照四捨五入的規則,小數點1小於5,所以捨棄了,返回了-1,這好正常哦。可是當小數點是5的時候,尼瑪的,不是說四捨五入嗎?為啥5還是被捨棄掉了;再看當小數點大於5的時候,尼瑪的且返回了-2,不是應該進一位嗎,怎麼越變越小了啊?這不科學啊!我覺得應該扇javaScript原設計者Brendan Eich兩耳光。有沒有人認同我的觀念?告訴你們,可千萬別被我前面的三言兩語給忽悠了。你仔細想想啊,如果負數也嚴格按照四捨五入進行的話,-0.5就該增大,就應該變成0,不是0難道還變成1不成?這不瞎搞嗎! 然後 -1.1呢,說是四捨五入,所以就捨棄了0.1,但是因為是負數啊,捨棄了小數位反而是增加了值,所以看上去有些別捏,不合常理。最後呢-1.6,你說該怎麼個取捨法?四捨五入,增大一位 + 1?那不就變成0了嗎?oh!my god!簡直不可理喻。
3.5 Math.pow() 求引數x次方的值
Math.pow
方法返回以第一個引數為底數、第二個引數為冪的指數值。
// 等同於 2 ** 2
Math.pow(2, 2) // 4
// 等同於 2 ** 3
Math.pow(2, 3) // 8
下面是計算圓面積的方法(圓的面積計算公式是 π×r2 ):
var radius = 20;
var area = Math.PI * Math.pow(radius, 2);
2.6 Math.sqrt() 求引數的平方根
Math.sqrt
方法返回引數值的平方根。如果引數是一個負值,則返回NaN
。
Math.sqrt(4) // 2
Math.sqrt(-4) // NaN
2.7 Math.log() 返回以e
為底的自然對數值
Math.log(Math.E) // 1
Math.log(10) // 2.302585092994046
如果要計算以10為底的對數,可以先用Math.log
求出自然對數,然後除以Math.LN10
;求以2為底的對數,可以除以Math.LN2
。
Math.log(100)/Math.LN10 // 2
Math.log(8)/Math.LN2 // 3
2.8 Math.exp() 返回常數e
的引數次方。
Math.exp(1) // 2.718281828459045
Math.exp(3) // 20.085536923187668
2.9 Math.random() 返回0到1之間的一個偽隨機數,可能等於0,但是一定小於1。
Math.random() // 0.7151307314634323
任意範圍的隨機數生成函式如下:
function getRandomArbitrary(min, max) {
return Math.random() * (max - min) + min;
}
getRandomArbitrary(1.5, 6.5)
// 2.4942810038223864
上面的函式所生成的隨機化的範圍是 0 - max之間,為什麼呢?想不明白的請關注公眾號《深度程式設計》留言諮詢。
任意範圍的隨機整數生成函式如下:
function getRandomInt(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
getRandomInt(1, 6) // 5
返回隨機字元的例子如下:
function random_str(length) {
var ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
ALPHABET += 'abcdefghijklmnopqrstuvwxyz';
ALPHABET += '0123456789-_';
var str = '';
for (var i = 0; i < length; ++i) {
var rand = Math.floor(Math.random() * ALPHABET.length);
str += ALPHABET.substring(rand, rand + 1);
}
return str;
}
random_str(6) // "NdQKOr"
上面程式碼中,random_str
函式接受一個整數作為引數,返回變數ALPHABET
內的隨機字元所組成的指定長度的字串。想不明白的請關注公眾號《深度程式設計》留言諮詢。學習要認真,別一眼飄過,看不懂的時候一定要停下來,弄懂了才能有所進步。
2.10 三角函式方法
Math
物件還提供一系列三角函式方法。
Math.sin()
:返回引數的正弦(引數為弧度值)Math.cos()
:返回引數的餘弦(引數為弧度值)Math.tan()
:返回引數的正切(引數為弧度值)Math.asin()
:返回引數的反正弦(返回值為弧度值)Math.acos()
:返回引數的反餘弦(返回值為弧度值)Math.atan()
:返回引數的反正切(返回值為弧度值)
Math.sin(0) // 0
Math.cos(0) // 1
Math.tan(0) // 0
Math.sin(Math.PI / 2) // 1
Math.asin(1) // 1.5707963267948966
Math.acos(1) // 0
Math.atan(1) // 0.7853981633974483
上面這一坨,我真不知道是什麼東東,我也不想知道。哈哈哈……
好了,親愛的同學們,如果有什麼疑問需要交流,或者想獲取更多資訊及技術的推送,請關注我們的公眾號《深度程式設計》,謝謝!