js中的小技巧

1. string 转换成数字

  • 可以用 *1 转数字
  • 常用: 也可以使用+来转化字符串为数字

2. 使用Boolean过滤数组中的所有假值

把Boolean构造函数当做回调参数传入,遍历时的每一项又传入Boolean。
const compact = arr => arr.filter(Boolean);
   
compact([0, 1, false, 2, '', 3, 'a', 'e' * 23, NaN, 's', 34])  

3. 双位运算符 ~~

可以使用双位操作符来替代 Math.floor()。双否定位操作符的优势在于它执行相同的操作运行速度更快。

Math.floor(4.9) === 4      //true
// 简写为:
~~4.9 === 4      //true

不过要注意,对整数来说 ~~ 运算结果与 Math.floor() 运算结果相同,而对于负数来说不相同:

~~4.5                   // 4
Math.floor(4.5)         // 4
~~-4.5                  // -4
Math.floor(-4.5)        // -5

4. 取整 | 0

1.3 | 0         // 1
-1.9 | 0        // -1

'1.5' | 0       // 1
'-1.2' | 0      // -1

5. 字符串比较时间先后

var a = "2014-08-08";
var b = "2014-09-09";
console.log(a > b, a < b);        // false true
console.log("21:00" < "09:10");   // false
console.log("21:00" < "9:10");    // true   时间形式注意补0

注意:因为字符串比较大小是按照字符串从左到右每个字符的charCode来的,但所以特别要注意时间形式注意补0

6. 精确到指定位数的小数

将数字四舍五入到指定的小数位数。使用 Math.round() 和模板字面量将数字四舍五入为指定的小数位数。 省略第二个参数 decimals ,数字将被四舍五入到一个整数。

const round = (n, decimals = 0) => Number(`${Math.round(`${n}e${decimals}`)}e-${decimals}`)
round(1.345, 2)                 // 1.35
round(1.345, 1)                 // 1.3

7. 数字补0操作

有时候比如显示时间的时候有时候会需要把一位数字显示成两位,这时候就需要补0操作,可以使用slice和string的padStart方法

const addZero1 = (num, len = 2) => (`0${num}`).slice(-len)
// ES6 字符串补位方法
const addZero2 = (num, len = 2) => (`${num}`).padStart( len, '0')
addZero1(3)          // 03
addZero2(32,4)       // 0032

8. Object [key]

虽然将 foo.bar 写成 foo ['bar'] 是一种常见的做法,但是这种做法构成了编写可重用代码的基础。许多框架使用了这种方法,比如element的表单验证。

请考虑下面这个验证函数的简化示例:

function validate(values) {
  if(!values.first) return false;

  if(!values.last) return false;
  
  return true;
}

console.log(validate({first: 'Bruce',last: 'Wayne'}));   // true

上面的函数完美的完成验证工作。但是当有很多表单,则需要应用验证,此时会有不同的字段和规则。如果可以构建一个在运行时配置的通用验证函数,会是一个好选择。

// object validation rules
const schema = {
    first: {
        required: true
    },
    last: {
        required: true
    }
}

// universal validation function
const validate = (schema, values) => {
    for (field in schema) {
        if (schema[field].required) {
            if (!values[field]) {
                return false;
            }
        }
    }

    return true;
}

console.log(validate(schema, {first:'Bruce'}));                 // false
console.log(validate(schema, {first:'Bruce',last:'Wayne'}));    // true

现在有了这个验证函数,我们就可以在所有窗体中重用,而无需为每个窗体编写自定义验证函数。

9. reduce方法同时实现map和filter

假设现在有一个数列,你希望更新它的每一项(map的功能)然后筛选出一部分(filter的功能)。如果是先使用map然后filter的话,你需要遍历这个数组两次。 在下面的代码中,我们将数列中的值翻倍,然后挑选出那些大于50的数。

const numbers = [10, 20, 30, 40];
const doubledOver50 = numbers.reduce((finalList, num) => {
  num = num * 2;
  if (num > 50) {
    finalList.push(num);
  }
  return finalList;
}, []);

doubledOver50;            // [60, 80]

10. 统计数组中相同项的个数

很多时候,你希望统计数组中重复出现项的个数然后用一个对象表示。那么你可以使用reduce方法处理这个数组。

下面的代码将统计每一种车的数目然后把总数用一个对象表示。

let cars = ['BMW','Benz', 'Benz', 'Tesla', 'BMW', 'Toyota'];
let carsObj = cars.reduce((obj, name) => {
  obj[name] = obj[name] ? ++obj[name] : 1;
  return obj;
}, {});

carsObj;  // { BMW: 2, Benz: 2, Tesla: 1, Toyota: 1 }

11. 使用解构来交换参数数值

let param1 = 1;
let param2 = 2;
[param1, param2] = [param2, param1];

12. 接收函数返回的多个结果

在下面的代码中,我们从/post中获取一个帖子,然后在/comments中获取相关评论。由于我们使用的是async/await,函数把返回值放在一个数组中。而我们使用数组解构后就可以把返回值直接赋给相应的变量。

async function getFullPost(){
  return await Promise.all([
     fetch('/post'),
     fetch('/comments')
  ]);
}
const [post, comments] = getFullPost();

13. 平铺多维数组

let arr = [1, 2, [3, 4], [5,6]];
let result = [].concat(...arr);
console.log(result) // [1,2,3,4,5,6]

以上方法只适用于二维数组,如果是二维以上数组,通过递归实现

 function spread(arr) {
    let result = [].concat(...arr);
     return result.some(item => Array.isArray(item)) ?
        spread(result) 
        : result;
 }

14. 格式化JSON代码

let obj = {
    name: 'jack',
    age: 12,
    skill: ['play', 'song']
}
console.log(JSON.stringify(obj, null, 4));
{
    "name": "jack",
    "age": 12,
    "skill": [
        "play",
        "song"
    ]
}

15. 整数转千分位三种方式

一、只转整数部分,如果有小数,只保留三位

  1. 方式1:
const number = 1234567890
const nf = new Intl.NumberFormat('us')
nf.format(number) //  如果有小数,最多保留三位小数
// 1,234,567,890
typeof nf.format(number) 
// string
  1. 方式2:
number.toLocaleString('us')
// 1,234,567,890 

二、会把小数也转成千分位

// 会把小数为也转成千分位
const reg = /(\d{1,3})(?=(?:\d{3})+(?!\d))/g;
// 如果有小数,则只转小数位
const reg1 =  /(\d)(?=(\d{3})+$)/g; 
number.toString().replace(reg, '$1,') 
// 1,234,567,890

三、只转整数部分,小数位不转

  1. 方式1:
function sep(n) {
  let [i, c] = n.toString().split(/(\.\d+)/)
  return i.split('').reverse().map((c, idx) => (idx+1) % 3 === 0 ? ',' + c: c).reverse().join('').replace(/^,/, '') + c
}
  1. 方式2:
function sep2(n){
  let str = n.toString()
  str.indexOf('.') < 0 ? str+= '.' : void 0
  return str.replace(/(\d)(?=(\d{3})+\.)/g, '$1,').replace(/\.$/, '')
}

16. 获取时间戳的方式

  1. Date.parse()
// 返回自定义时间戳
 Date.parse('2017/03/19')
 
// 返回当前时间的事件戳
 Date.parse(new Date())
  1. Date.getTime()
new Date().getTime()
  1. +new Date()
+new Date()
  1. Date.now()
Date.now()
  1. new Date().valueOf()
new Date().valueOf()

17. 判断值是否为纯对象

function isPlainObject(obj) {
  if (typeof obj !== 'object' || obj === null) return false

  let proto = obj
  while (Object.getPrototypeOf(proto) !== null) {
    proto = Object.getPrototypeOf(proto)
  }

  return Object.getPrototypeOf(obj) === proto
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,634评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,951评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,427评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,770评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,835评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,799评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,768评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,544评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,979评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,271评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,427评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,121评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,756评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,375评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,579评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,410评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,315评论 2 352

推荐阅读更多精彩内容

  • 1.!!来转换成boolean 有时候我们需要对一个变量查检其是否存在或者检查值是否有一个有效值,如果存在就返回t...
    day_day_up阅读 183评论 0 2
  • 转载来源:编程学习网 1. 将彻底屏蔽鼠标右键oncontextmenu=”window.event.return...
    努力的河马君阅读 405评论 0 3
  • #23 - 转换数值的快速方法 将字符串转换为数字是非常常见的。最简单和最快的方式来实现,将使用+(加)算法。 你...
    芗芗_阅读 269评论 0 3
  • 夜半十一点钟的光景,我在路边一家起来亮堂整洁的螺蛳粉店内,吃着我的晚饭。可能是我看起来太狼狈了吧,不用照镜子我也知...
    無敵娃娃音阅读 374评论 0 0
  • 电影《死亡诗社》里尼尔为了追求自由选择了死亡,那一刻是一种惊心的感觉,不自觉的想到了现实生活中的我们,当梦想和现实...
    總不往矣阅读 305评论 0 1