让你5分钟掌握9个JavaScript小技巧


Posted in Javascript onJune 09, 2018

译者按: 技巧虽好、重在掌握并使用起来!

  • 原文: Learn these neat JavaScript tricks in less than 5 minutes
  • 译者: Fundebug

为了保证可读性,本文采用意译而非直译。另外,本文版权归原作者所有,翻译仅用于学习。

1. 删除数组尾部元素

一个简单的用来清空或则删除数组尾部元素的简单方法就是改变数组的length属性值。

const arr = [11, 22, 33, 44, 55, 66];
// truncanting
arr.length = 3;
console.log(arr); //=> [11, 22, 33]
// clearing
arr.length = 0;
console.log(arr); //=> []
console.log(arr[2]); //=> undefined

2.使用对象解构来模拟命名参数

如果你需要将一系列可选项作为参数传入函数,那么你也许倾向于使用了一个对象(Object)来定义配置(Config)。

doSomething({ foo: 'Hello', bar: 'Hey!', baz: 42 });
function doSomething(config) {
	const foo = config.foo !== undefined ? config.foo : 'Hi';
	const bar = config.bar !== undefined ? config.bar : 'Yo!';
 	const baz = config.baz !== undefined ? config.baz : 13;
 	// ...
}

这是一个陈旧、但是很有效的方法,它模拟了JavaScript中的命名参数。不过呢,在doSomething中处理config的方式略显繁琐。在ES2015中,你可以直接使用对象解构。

function doSomething({ foo = 'Hi', bar = 'Yo!', baz = 13 }) {
 // ...
}

如果你想让这个参数是可选的,也很简单。

function doSomething({ foo = 'Hi', bar = 'Yo!', baz = 13 } = {}) {
 // ...
}

3. 使用对象解构来处理数组

可以使用对象解构的语法来获取数组的元素:

const csvFileLine = '1997,John Doe,US,john@doe.com,New York';
const { 2: country, 4: state } = csvFileLine.split(',');

4. 在switch语句中用范围值

可以使用下面的技巧来写满足范围值的switch语句:

function getWaterState(tempInCelsius) {
 let state;
 
 switch (true) {
  case (tempInCelsius <= 0): 
   state = 'Solid';
   break;
  case (tempInCelsius > 0 && tempInCelsius < 100): 
   state = 'Liquid';
   break;
  default: 
   state = 'Gas';
 }
 return state;
}

5. await多个async函数

在使用async/await的时候,可以使用Promise.all来await多个async函数。

await Promise.all([anAsyncCall(), thisIsAlsoAsync(), oneMore()])

6. 创建一个纯(pure)对象

你可以创建一个100%的纯对象,他不从Object中继承任何属性或则方法(比如,constructor,toString()等等)。

const pureObject = Object.create(null);
console.log(pureObject); //=> {}
console.log(pureObject.constructor); //=> undefined
console.log(pureObject.toString); //=> undefined
console.log(pureObject.hasOwnProperty); //=> undefined

7. 格式化JSON代码

JSON.stringify不止可以将一个对象字符化,还可以格式化输出JSON对象。

const obj = { 
 foo: { bar: [11, 22, 33, 44], baz: { bing: true, boom: 'Hello' } } 
};
// The third parameter is the number of spaces used to 
// beautify the JSON output.
JSON.stringify(obj, null, 4); 
// =>"{
// =>  "foo": {
// =>    "bar": [
// =>      11,
// =>      22,
// =>      33,
// =>      44
// =>    ],
// =>    "baz": {
// =>      "bing": true,
// =>      "boom": "Hello"
// =>    }
// =>  }
// =>}"

8. 从数组中移除重复元素

ES2015中,有了集合的语法。通过使用集合语法和Spread操作,可以很容易将重复的元素移除:

const removeDuplicateItems = arr => [...new Set(arr)];
removeDuplicateItems([42, 'foo', 42, 'foo', true, true]);
//=> [42, "foo", true]

9. 平铺多维数组

使用Spread操作,可以很容易去平铺嵌套多维数组:

const arr = [11, [22, 33], [44, 55], 66];
const flatArr = [].concat(...arr); //=> [11, 22, 33, 44, 55, 66]

可惜,上面的方法仅仅适用于二维数组。不过,通过递归,我们可以平铺任意维度的嵌套数组。

unction flattenArray(arr) {
 const flattened = [].concat(...arr);
 return flattened.some(item => Array.isArray(item)) ? 
  flattenArray(flattened) : flattened;
}

const arr = [11, [22, 33], [44, [55, 66, [77, [88]], 99]]];
const flatArr = flattenArray(arr); 
//=> [11, 22, 33, 44, 55, 66, 77, 88, 99]

就这些啦!我希望这些小技巧可以帮你写出更加漂亮的JS代码!如果还不够,那么不妨用Fundebug做你的辅助!

精选评论

Ethan B Martin: 这个switch的写法很巧妙,不过不推荐。请不要鼓励开发者用这种方式去写JS代码。我们曾经有一个工程师这么写,后来在代码review的时候,造成了很大的阅读苦难。好在我们及时将其重构为更加容易读懂的代码。不妨对比一下用swtich和if的区别:

function getWaterState1(tempInCelsius) {
 let state;
 
 switch (true) {
  case (tempInCelsius <= 0): 
   state = 'Solid';
   break;
  case (tempInCelsius < 100): 
   state = 'Liquid';
   break;
  default: 
   state = 'Gas';
 }
 return state;
}
function getWaterState2(tempInCelsius) {
 if (tempInCelsius <= 0) {
  return 'Solid';
 }
 if (tempInCelsius < 100) {
  return 'Liquid';
 }
 return 'Gas';
}

第二种写法有几点优势:
A) 代码量更少,更加易读;B) 你不需要声明一个局部变量,读者不会一直要去追踪你如何对这个变量做了更改;C) switch(true)真的会让人莫名其妙。

Flo Sloot: 很棒的文章!不过不推荐第六招,除非你一定要使用。因为它的执行效率很慢,而且占用空间更大。因为V8并没有对空对象做优化。

Javascript 相关文章推荐
jquery 表单下所有元素的隐藏
Jul 25 Javascript
JS通过相同的name进行表格求和代码
Aug 18 Javascript
JavaScript拖拽、碰撞、重力及弹性运动实例分析
Jan 08 Javascript
Bootstrap实现下拉菜单效果
Apr 29 Javascript
JS实现拖动滚动条评分的效果代码分享
Sep 29 Javascript
JS获取IE版本号与HTML设置IE文档模式的方法
Oct 09 Javascript
H5上传本地图片并预览功能
May 08 Javascript
require.js与bootstrap结合实现简单的页面登录和页面跳转功能
May 12 Javascript
JS库之Waypoints的用法详解
Sep 13 Javascript
javascript少儿编程关于返回值的函数内容
May 27 Javascript
对angular 监控数据模型变化的事件方法$watch详解
Oct 09 Javascript
详解TypeScript中的类型保护
Apr 29 Javascript
jQuery基于闭包实现的显示与隐藏div功能示例
Jun 09 #jQuery
JS实现区分中英文并统计字符个数的方法示例
Jun 09 #Javascript
详解angular脏检查原理及伪代码实现
Jun 08 #Javascript
解析vue路由异步组件和懒加载案例
Jun 08 #Javascript
node中modules.exports与exports导出的区别
Jun 08 #Javascript
Vue不能观察到数组length的变化
Jun 08 #Javascript
Node.js中的child_process模块详解
Jun 08 #Javascript
You might like
如何对PHP程序中的常见漏洞进行攻击
2006/10/09 PHP
php生成局部唯一识别码LUID的代码
2012/10/06 PHP
使用PHP编写的SVN类
2013/07/18 PHP
php中使用PHPExcel读写excel(xls)文件的方法
2014/09/15 PHP
postfixadmin忘记密码后的修改密码方法详解
2016/07/20 PHP
Laravel 连接(Join)示例
2019/10/16 PHP
常用的javascript function代码
2008/05/23 Javascript
使用jquery读取html5 localstorage的值的方法
2013/01/04 Javascript
时间戳转换为时间 年月日时间的JS函数
2013/08/19 Javascript
jquery选择器、属性设置用法经验总结
2013/09/08 Javascript
JavaScript实现上下浮动的窗口效果代码
2015/10/12 Javascript
详解JavaScript中的构造器Constructor模式
2016/01/14 Javascript
asp.net+jquery.form实现图片异步上传的方法(附jquery.form.js下载)
2016/05/05 Javascript
AngularJS实现数据列表的增加、删除和上移下移等功能实例
2016/09/05 Javascript
JavaScript实现Fly Bird小游戏
2016/12/15 Javascript
json对象及数组键值的深度大小写转换问题详解
2018/03/30 Javascript
写一个Vue loading 插件
2020/11/09 Javascript
使用node-media-server搭建一个简易的流媒体服务器
2021/01/20 Javascript
[01:03:22]LGD vs OG 2018国际邀请赛淘汰赛BO3 第一场 8.25
2018/08/29 DOTA
python自动化测试之setUp与tearDown实例
2014/09/28 Python
详解pytorch 0.4.0迁移指南
2019/06/16 Python
使用Windows批处理和WMI设置Python的环境变量方法
2019/08/14 Python
Python绘制动态水球图过程详解
2020/06/03 Python
简单的Python人脸识别系统
2020/07/14 Python
用python 绘制茎叶图和复合饼图
2021/02/26 Python
python 中 .py文件 转 .pyd文件的操作
2021/03/04 Python
优衣库澳大利亚官网:UNIQLO澳大利亚
2017/01/18 全球购物
巴基斯坦购物网站:Goto
2019/03/11 全球购物
计算机应用专业毕业生求职信
2013/10/24 职场文书
高级电工工作职责
2013/11/21 职场文书
青年教师培训方案
2014/02/06 职场文书
物理专业大学生职业生涯规划书
2014/02/07 职场文书
C++程序员求职信
2014/05/07 职场文书
护士自荐信怎么写
2015/03/06 职场文书
2015年文秘个人工作总结
2015/10/14 职场文书
python多次执行绘制条形图
2022/04/20 Python