10个JavaScript开发必须会的实用小技巧

汽水音乐 百科排行 888

10个JavaScript开发必须会的实用小技巧-第1张图片-小猪号

每种编程语言都有一些“黑魔法”或者说小技巧,JS也不例外,今天笔者整理了一份自己最近用到的一些小技巧分享给大家,前4节是一些基础技术,虽然是基础但是在某些特殊时刻还蛮有用的,不至于加载一堆体积庞大的第三方库。后7节是借助ES6或者浏览器新特性实现,相信其中有些你一定用过,今天码云笔记用本文归纳一下分享给大家。

一、产生随机不重复ID

有时候在没有第三方类库的情况下,我们希望希望产生随机且不重复的ID,这时我会使用「随机数」搭配「时间戳」的方式,首先使用Math.random()产生0~1之间约16~17位数的随机浮点数,再通过toString(36)的方法缩短其位数,并转换为36进位( 0~9、a~z ),若嫌太长还可用substr方法进行自行截取。

1
2
Math.random ( ).toString ( 36 ).substr ( 2,n );
// 截取小数点后的部分,n在实际应用中修改成你需要的位数

第二步使用Date.now()取得目前的毫秒数,总共有13位数,和上个方法一样我们通过toString(36)的方法缩短其位数,并转换为36进位,接着用substr自行截取需要的位数。

1
2
Date.now ( ).toString ( 36 ).substr ( 4,n );
//由于前几位固定不变,我们从第 5位开始进去截取获取随机数,n在实际应用中修改成你需要的位数

将随机数的片段和时间戳的片段进行组合,就能产生一个随机不重复的id 。( 应该说重复机率低到不可能重复,如果你遇到重复的,恭喜你,建议你今天买彩票 )

1
Math.random ( ).toString ( 36 ).substr ( 2,n ) +  Date.now ( ).toString ( 36 ).substr ( 4,n );

二、模板标签替换

开发过程中有时会遇到要取出一段文字中的某些值,如果单纯只是要「替换成别的值」,使用replace()的方法就能轻松实现,对以下这段字符串来说,里面有几个利用{{}}包覆的标签需要你替换,你会怎么做呢:

大家好,我的公众号是{{name}},今年{{age}}岁了,创建于{{year}}年,欢迎你的关注

如果想要把所有「{{}}」两个大括号内的字替换成对应的值,可以通过以下的方式进行处理,核心的内容就是replace()方法里的正规表达式/{{(.*?)}}/g,/{|}/g:

1
2
3
4
5
6
7
8
9
const  text  =  '大家好,我的博客是{{name}},今年{{age}}岁了,创建于{{year}}年,欢迎你的关注’;
const obj = {
    name: '
码云笔记 ',
    age: 2,
    year: 2018
};
const result = text.replace(/{{(.*?)}}/g, e => {
    return obj[e.replace(/{|}/g,'
')];
});

得到的结果就会是:「大家好,我的博客是码云笔记,今年2岁了,创建于2018年,欢迎你的关注」。

三、快速取整数

在JavaScript中取整数,最常见的不外乎就是Math.round()四舍五入、Math.floor()返回小于等于给定数字的最大整数和 Math.ceil()函数返回大于或等于一个给定数字的最小整数(无条件进位)三种方法,不过如果通过两个「按位取反两次」~~(两个蚯蚓符号),也可以做到无条件舍去小数点的效果,这也是最快可以取整数的方法,下方的代码会先取得一个0~100的随机数,然后取出整数的部分。

1
2
3
const num  = Math.random ( ) *  100;
console.log (num );    // 输出原本的随机数
console.log (~~num )// 无条件舍去小数部分,类似Math.floor ( )

~是按位取反运算,~~是取反两次。在这里~~的作用是去掉小数部分,因为位运算的操作值要求是整数,其结果也是整数,所以经过位运算的都会自动变成整数。与Math.floor()不同的是,它只是单纯的去掉小数部分,不论正负都不会改变整数部分。

四、String转XML、XML转String

在JavaScript里如果直接读取XML,得到的会是一些XML节点构成的对象,如果要使用像是replace()..等字串的操作就必须转换成字串String才行,下方代码可以很简单的将XML转换成字串String,处理之后再转回XML。(注:ie需要特殊处理,感兴趣的可以去百度搜索)

XML转字串String

1
xmlToString  =  (new XMLSerializer ( ) ).serializeToString (xmlObject );

字串String转XML

1
stringToXML  =  (new DOMParser ( ) ).parseFromString (xmlString,  "text/xml" );

五、数组去重

1
2
const j  =  [...new Set ( [ 1233 ] ) ]
>>  [ 123 ]

六、数组清洗

洗掉数组中一些无用的值,如0, undefined, null, false等

1
2
3
4
5
6
myArray
    .map (item  ={
         // ...
     } )
     // Get rid of bad values
    .filter (Boolean );

七、合并对象

JS中我们经常会有合并对象的需求,比如常见的给用传入配置覆盖默认配置,通过ES6扩展运算符就能快速实现。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
const person  =  {  name'David Walsh', gender:  'Male'  };
const tools  =  { computer:  'Mac', editor:  'Atom'  };
const attributes  =  { handsomeness:  'Extreme', hair:  'Brown', eyes:  'Blue'  };

const  summary  =  {...person, ...tools, ...attributes };
/*
Object  {
   "computer""Mac",
   "editor""Atom",
   "eyes""Blue",
   "gender""Male",
   "hair""Brown",
   "handsomeness""Extreme",
   "name""David Walsh",
}
* /

八、创建空对象

我们可以使用对象字面量{}来创建空对象,但这样创建的对象有隐式原型__proto__和一些对象方法比如常见的hasOwnProperty,下面这个方法可以创建一个纯对象。

1
2
3
4
let dict  =  Object.create (null );

// dict.__proto__  ===  "undefined"
// No  object properties exist until you add them

该方法创建的对象没有任何的属性及方法

九、解构别名

ES6中我们经常会使用对象结构获取其中的属性,但有时候会想重命名属性名,以避免和作用域中存在的变量名冲突,这时候可以为解构属性名添加别名。

1
2
3
4
5
6
7
const obj  =  { x:  1  };

// Grabs obj.x as  { x  }
const  { x  }  = obj;

// Grabs obj.x as as  { otherName  }
const  { x: otherName  }  = obj;

十、设置函数必传参数

借助ES6支持的默认参数特性,我们可以将默认参数设置为一个执行抛出异常代码函数返回的值,这样当我们没有传参时就会抛出异常终止后面的代码运行。

1
2
3
4
5
6
7
8
9
10
11
12
13
const isRequired  =  ( )  ={ throw new Error ( 'param is required' )};

const hello  =  ( name  = isRequired ( ) )  ={ console.log (`hello $ { name }` )  };

// This will throw an error because no  name is provided
hello ( );

// This will also throw an error
hello (undefined );

// These are good!
hello (null );
hello ( 'David' );

十一、获取查询字符串参数

以前获取URL中的字符串参数我们需要通过函数写正则匹配,现在通过URLSearchParamsAPI即可实现。

1
2
3
4
5
6
7
8
9
// Assuming  "?post=1234&action=edit"

var urlParams  = new URLSearchParams (window.location.search );

console.log (urlParams.has ( 'post' ) )// true
console.log (urlParams.get ( 'action' ) )//  "edit"
console.log (urlParams.getAll ( 'action' ) )//  [ "edit" ]
console.log (urlParams.toString ( ) )//  "?post=1234&action=edit"
console.log (urlParams.append ( 'active''1' ) )//  "?post=1234&action=edit&active=1"

随着Javascript的不断发展,很多语言层面上的不良特性都在逐渐移除或者改进,如今的一行ES6代码可能等于当年的几行代码。

拥抱JS的这些新变化意味着前端开发效率的不断提升,以及良好的编码体验。当然不管语言如何变化,我们总能在编程中总结一些小技巧来精简代码。

结束语

今天JavaScript开发小技巧的分享就到这里,希望能在工作中对你有所帮助,建议大家经常整理梳理自己日常工作中会用到的小方法和小技巧,维护到自己的方法库里,到时用的时候会事半功倍。


赞( 0次)

抱歉,评论功能暂时关闭!