本系列使用 lodash 4.17.4
前言
本檔案無對引用其他檔案的引用
正文
/**
* Clamps `number` within the inclusive `lower` and `upper` bounds.
*
* @since 4.0.0
* @category Number
* @param {number} number The number to clamp.
* @param {number} lower The lower bound.
* @param {number} upper The upper bound.
* @returns {number} Returns the clamped number.
* @example
*
* clamp(-10, -5, 5)
* // => -5
*
* clamp(10, -5, 5)
* // => 5
*/
function clamp(number, lower, upper) {
number = +number
lower = +lower
upper = +upper
lower = lower === lower ? lower : 0
upper = upper === upper ? upper : 0
if (number === number) {
number = number <= upper ? number : upper
number = number >= lower ? number : lower
}
return number
}
export default clamp
複製程式碼
使用方式
// clamp函式的使用
// A low life whose power level is only 5
var me = {
powerLevel:5
}
me.drinkElixirOfWrath = function() {
this.powerLevel += 30
}
me.drinkElixirOfWrath() // I am now full of power!
// Hey, you are not allowed to be a monster after the founding of new China
me.powerLevel = clamp(me.powerLevel, null, 10) // Aww
me.powerLevel // 10
複製程式碼
使用場景
我儘量總結一下clamp函式實際的應用場景
1. 輸入框移除裁剪
var height = 180 // centimeter
// after input
height = 500
height = clamp(height, null, 270)
複製程式碼
2. ...
好吧其實我感覺使用的地方挺多的,但我一下沒想到具體的使用,請實際在專案中有用過或者有想法的人在評論區告知我,感激不盡。
原始碼分析
其實ES 2017的Math擴充套件裡面已經有了原生的實現了。點我檢視
Math.clamp(x, lower, upper)
複製程式碼
不過我們分析程式碼主要還是學知識的,讓我們來看看這幾十行程式碼裡有沒有什麼有趣的東西。
加號的奇妙使用
我在看過的一些原始碼中使用了相同的方法,這個加號的意義大家都知道嗎?加號其實是返回物件的數字表示式,大家可以試試下面這段程式碼
+(new Date()) // 1513429205460 (時間戳,結果可能不同)
+'3' // 3
複製程式碼
我之前見過的基本都是加號和Date物件組合來用,可以快速拿到時間戳進行運算。
其實加號還有一個奇妙的使用
+function() { console.log("Foo!"); }();
複製程式碼
它強制語法分析器(parser)把加號後面的部分當作一個表示式(expression),這個也可以用在立即執行函式(IIFE)裡面。
當然加號並不是唯一的選擇,-
、!
、~
等單目操作符(unary operator)其實都可以,所以我們經常看到下面這種立即執行函式
!function(){/* code */}();
複製程式碼
全等於自己
其實這個應該挺常見的var notANumber = +'keke'
notANumber === notANumber // false
複製程式碼
只有NaN不全等於自己,這個也可以用來判斷一個變數是不是NaN
本文章來源於午安煎餅計劃Web組 - 樑王