Utility
英文文章来源于: https://github.com/Chalarangelo/30-seconds-of-code/blob/master/README.md
coalesce
返回参数列表中第一个非 null 和 undefined 的参数.
用 Array.find() 实现返回第一个非 null/undefined 参数.
- const coalesce = (...args) = >args.find(_ = >![undefined, null].includes(_))
- // coalesce(null,undefined,"",NaN,"Waldo") ->""
- coalesceFactory
返回一个 customCoalesce, 用自定义函数中的 validate 函数是否返回 true 来对 customCoalesce 中传入的参数列表尽心过滤.
用 Array.find()去遍历参数列表, 用给定的 validate 函数的返回值来过滤参数列表.
- const coalesceFactory = valid = >(...args) = >args.find(valid);
- // const customCoalesce = coalesceFactory(_ => ![null, undefined, "", NaN].includes(_))
- // customCoalesce(undefined, null, NaN, "","Waldo") //->"Waldo"
- getType
返回给定值的基本类型.
返回给定值的构造函数名字的小写形式, 如果是 "undefined" 或 "null", 返回 "undefined" 或 "null"
- const getType = v = >v === undefined ? 'undefined': v === null ? 'null': v.constructor.name.toLowerCase();
- // getType(new Set([1,2,3])) -> "set"
- extendHex
将一个 3 位的 HEX 颜色值转化为 6 位的.
用 Array.map(), split() 和 Array.join() 来实现.
如果 HEX 是以 #开始的, 用 String.slice()返回一个没有该字符的字符串.
- const extendHex = shortHex = >'#' + shortHex.slice(shortHex.startsWith('#') ? 1 : 0).split('').map(x = >x + x).join('')
- // extendHex('#03f') -> '#0033ff'
- // extendHex('05a') -> '#0055aa'
- hexToRGB
转换 HEX 颜色为 rgb() , 如果 alpha 提供的化, 转化为 rgba() .
用按位右移操作符 (>>>) 和掩码 (&) 操作符去转换 3 位进制的颜色为 RGB 颜色.
如果是三位进制的就先转化为标准的 6 位的. 如果在 6 位后指定 alpha 值, 则返回 rgba() .
- const hexToRGB = hex = >{
- let alpha = false,
- h = hex.slice(hex.startsWith('#') ? 1 : 0);
- if (h.length === 3) h = [...h].map(x = >x + x).join('');
- else if (h.length === 8) alpha = true;
- h = parseInt(h, 16);
- return 'rgb' + (alpha ? 'a': '') + '(' + (h >>> (alpha ? 24 : 16)) + ', ' + ((h & (alpha ? 0x00ff0000: 0x00ff00)) >>> (alpha ? 16 : 8)) + ', ' + ((h & (alpha ? 0x0000ff00: 0x0000ff)) >>> (alpha ? 8 : 0)) + (alpha ? `, $ { (h & 0x000000ff)
- }`: '') + ')';
- };
- // hexToRGB('#27ae60ff') -> 'rgba(39, 174, 96, 255)'
- // hexToRGB('27ae60') -> 'rgb(39, 174, 96)'
- // hexToRGB('#fff') -> 'rgb(255, 255, 255)'
- RGBToHex
将 RGB 颜色转换为 HEX 颜色.
将 RGB 的颜色用操作符 (<<) 和 toString(16) 转换 16 进制的字符串, 然后 padStart(6,'0') 得到一个 6 位的 HEX 颜色
padStart() 是 ES6 中的新方法, 定义字符串的格式, 第一个参数是设定字符串的长度, 第二个参数指定不足位置用什么来代替
- const RGBToHex = (r, g, b) = >((r << 16) + (g << 8) + b).toString(16).padStart(6, '0');
- // RGBToHex(255, 165, 1) -> 'ffa501'
- isArray
判断给定给定的值是否是否是数组.
用 Array.isArray() 判断给定的值是否为一个数组.
- const isArray = val = >!!val && Array.isArray(val);
- // isArray(null) -> false
- // isArray([1]) -> true
- isBoolean
半段给定的值是否是一个基本的 Boolean 值.
用 typeof 判断一个值是否为一个基本的 Boolean 值.
- const isBoolean = val = >typeof val === 'boolean';
- // isBoolean(null) -> false
- // isBoolean(false) -> true
- isFunction
检查给定的值是否为一个函数.
用 typeof 判断给定的值是否为一个基本的函数类型.
- const isFunction = val = >val && typeof val === 'function';
- // isFunction('x') -> false
- // isFunction(x => x) -> true
- isNumber
判断给定的值是否为一个数字类型.
用 typeof 判断一个值是否为基本的数字类型.
- const isNumber = val = >typeof val === 'number';
- // isNumber('1') -> false
- // isNumber(1) -> true
- isString
判断给定的值是否为一个字符串.
用 typeof 判断给定的值是否为一个基本的字符串类型.
- const isString = val = >typeof val === 'string';
- // isString(10) -> false
- // isString('10') -> true
- isSymbol
判断给定的值是否为 symbol 类型.
用 typeof 判断给定的值是否为基本的 symbol 类型.
- const isSymbol = val = >typeof val === 'symbol';
- // isSymbol('x') -> false
- // isSymbol(Symbol('x')) -> true
- timeTaken
计算函数执行的时间.
用 console.time() 和 console.timeEnd() 去计算从函数开始执行到执行结束所花费的时间.
- const timeTaken = callback => {
- console.time('timeTaken'); const r = callback();
- console.timeEnd('timeTaken'); return r;
- };
- // timeTaken(() => Math.pow(2, 10)) -> 1024
- // (logged): timeTaken: 0.02099609375ms
- toDecimalMark
用 toLocaleString() 去转换浮点数, 用逗号将数字分割成字符串的格式 Decimal mark.
- const toDecimalMark = num = >num.toLocaleString("en-US");
- // toDecimalMark(12305030388.9087) -> "12,305,030,388.9087"
- toOrdinalSuffix
为数字添加序号后缀.
用模操作符 (%) 取得指定值的个位和十分位的数值. 然后找到相对应的序号与之匹配.
如果 digit 上没有找到, 就用 tpattern
- const toOrdinalSuffix = num => {
- const int = parseInt(num), digits = [(int % 10), (int % 100)],
- ordinals = ['st', 'nd', 'rd', 'th'], oPattern = [1, 2, 3, 4],
- tPattern = [11, 12, 13, 14, 15, 16, 17, 18, 19];
- return oPattern.includes(digits[0]) && !tPattern.includes(digits[1]) ? int + ordinals[digits[0] - 1] : int + ordinals[3];
- };
- // toOrdinalSuffix("123") -> "123rd"
- UUIDGenerator
生成 UUID.
用 crypto API 生成 UUID, 参考资料 RFC4122 version 4.
- const UUIDGenerator = () =>
- ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, c =>
- (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16)
- );
- // UUIDGenerator() -> '7982fcfe-5721-4632-bede-6000885be57d'
- validateNumber
如果给定的值是数字类型, 那么返回 true; 否则 false.
用 !isNaN 结合 parseFloat() 来判定给定的值是否是数字类型.
用 isFinite() 数字的长度是否有限.
用 Number() 去进行是否为数字的强迫检查.
- const validateNumber = n => !isNaN(parseFloat(n)) && isFinite(n) && Number(n) == n;
- // validateNumber('10') -> true
更多关于 30-seconds-code 中文翻译 https://github.com/lvzhenbang/article/blob/master/js/30-seconds-code/index.md
来源: http://www.jianshu.com/p/8373703b2bd2