资讯专栏INFORMATION COLUMN

19种JS高(炫)效(技)缩写法!

shmily / 1134人阅读

摘要:双重按位非双重按位非的效果等于相当于注意注意,这条确实不利于其他人看懂,需要合作的项目勿用,用了记得加注释由你来补充那我来补充一条吧双重就是的次方,也不用调用的方法了

原文:19+ JavaScript Shorthand Coding Techniques

1 使用三目运算符

使用三目运算符,可以更简洁地把if else写成一行

const x = 20;
let answer;
if (x > 10) {
    answer = "greater than 10";
} else {
    answer = "less than 10";
}
const answer = x > 10 ? "greater than 10" : "less than 10";
2 短路求值

当你把一个变量的值赋给另一个变量,如果你要求原变量不能是空或者未定义,你有一长一短两种写法

if (variable1 !== null || variable1 !== undefined || variable1 !== "") {
     let variable2 = variable1;
}
const variable2 = variable1  || "new";
3 声明变量的简写
let x;
let y;
let z = 3;

写成

let x, y, z=3;

(译者注:其实现在standard风格不推荐声明简写)

4 if的简写
if (likeJavaScript === true)
//简化为
if (likeJavaScript)

注意:这两个例子不严格相等,likeJavaScript还可能是其他“为真”的值,参考这里

let a;
if ( a !== true ) {
// do something...
}
//简化为
let a;
if ( !a ) {
// do something...
}
5 JavaScript for循环简写
for (let i = 0; i < allImgs.length; i++)
//简化为
for (let index of allImgs)
//译者拓展,用于循环key,不推荐在数组使用
for (let index in allImgs)
6 短路求值

其实就是第二点...

7 十进制指数

可能你早就知道了,这是一个不用在末尾写一堆0的方法。例如1e7代表1后面跟7个0,也就是十进制的1000000。

for (let i = 0; i < 1e7; i++) {}

// All the below will evaluate to true
1e0 === 1;
1e1 === 10;
1e2 === 100;
1e3 === 1000;
1e4 === 10000;
1e5 === 100000;
8 对象属性的缩写

ES6提供的方法让你更简单地创建对象字面量,如果属性名和值一样的话,你可以如下缩写

const obj = { x:x, y:y };
// 等同于
const obj = { x, y };
9 用箭头函数让代码更简洁
function sayHello(name) {
  console.log("Hello", name);
}

setTimeout(function() {
  console.log("Loaded")
}, 2000);

list.forEach(function(item) {
  console.log(item);
});
// 简化为
sayHello = name => console.log("Hello", name);

setTimeout(() => console.log("Loaded"), 2000);

list.forEach(item => console.log(item));

另外,注意箭头函数里的this和普通函数不同

10 箭头函数的隐形return
function calcCircumference(diameter) {
  return Math.PI * diameter
}
// 简化为
calcCircumference = diameter => Math.PI * diameter

注意:这个情况下返回的必须是一行语句,如果返回对象要加(),多行语句还是用{}return

11 默认参数

ES6允许你的函数有默认参数了,赶紧用起来

function volume(l, w, h) {
  if (w === undefined)
    w = 3;
  if (h === undefined)
    h = 4;
  return l * w * h;
}
// 简化为
volume = (l, w = 3, h = 4 ) => (l * w * h);

volume(2) //output: 24
12 反引号与模板字符串
const welcome = "You have logged in as " + first + " " + last + "."

const db = "http://" + host + ":" + port + "/" + database;
// 简化为
const welcome = `You have logged in as ${first} ${last}`;

const db = `http://${host}:${port}/${database}`;
13 结构赋值

引入一个组件之后你还要一个一个拆出来?现在不用了!

const observable = require("mobx/observable");
const action = require("mobx/action");
const runInAction = require("mobx/runInAction");

const store = this.props.store;
const form = this.props.form;
const loading = this.props.loading;
const errors = this.props.errors;
const entity = this.props.entity;
import { observable, action, runInAction } from "mobx";

const { store, form, loading, errors, entity } = this.props;
// 你还可以更改变量名
const { store, form, loading, errors, entity:contact } = this.props;
14 反引号与多行字符串
JavaScriptconst lorem = "Lorem ipsum dolor sit amet, consectetur
	"
    + "adipisicing elit, sed do eiusmod tempor incididunt
	"
    + "ut labore et dolore magna aliqua. Ut enim ad minim
	"
    + "veniam, quis nostrud exercitation ullamco laboris
	"
    + "nisi ut aliquip ex ea commodo consequat. Duis aute
	"
    + "irure dolor in reprehenderit in voluptate velit esse.
	"
// 简化为
const lorem = `Lorem ipsum dolor sit amet, consectetur
    adipisicing elit, sed do eiusmod tempor incididunt
    ut labore et dolore magna aliqua. Ut enim ad minim
    veniam, quis nostrud exercitation ullamco laboris
    nisi ut aliquip ex ea commodo consequat. Duis aute
    irure dolor in reprehenderit in voluptate velit esse.`
15 扩展运算符

可以代替一些数组操作,并且比数组操作更灵活

// joining arrays
const odd = [1, 3, 5];
const nums = [2 ,4 , 6].concat(odd);

// cloning arrays
const arr = [1, 2, 3, 4];
const arr2 = arr.slice()
// joining arrays
const odd = [1, 3, 5 ];
const nums = [2 ,4 , 6, ...odd];
console.log(nums); // [ 2, 4, 6, 1, 3, 5 ]

// cloning arrays
const arr = [1, 2, 3, 4];
const arr2 = [...arr];

译者:扩展运算符就等于把内容摊开,你可以简单理解为把[]去掉
跟concat()不同,你可以在数组任何地方使用扩展运算符展开

const odd = [1, 3, 5 ];
const nums = [2, ...odd, 4 , 6];

也可以结合结构赋值使用

const { a, b, ...z } = { a: 1, b: 2, c: 3, d: 4 };
console.log(a) // 1
console.log(b) // 2
console.log(z) // { c: 3, d: 4 }
16 强制参数(其实又跟11一样)
function foo(bar) {
  if(bar === undefined) {
    throw new Error("Missing parameter!");
  }
  return bar;
}
// 简化为
mandatory = () => {
  throw new Error("Missing parameter!");
}

foo = (bar = mandatory()) => {
  return bar;
}
17 Array.find

你可能用for循环写过一个find函数,但是ES6已经引入了这个新特性!

const pets = [
  { type: "Dog", name: "Max"},
  { type: "Cat", name: "Karl"},
  { type: "Dog", name: "Tommy"},
]

function findDog(name) {
  for(let i = 0; i pet.type ==="Dog" && pet.name === "Tommy");
console.log(pet); // { type: "Dog", name: "Tommy" }

(译者:find跟filter的区别是filter返回数组,find只返回找到的第一个)

18 Object [key]

你知道foo.bar可以写成foo["bar"]吗?当然,不是知道这种用法就该这么用,但是这么写可以让你重用一些代码。
以下是一个简单的验证函数

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
19 双重按位非

双重按位非的效果等于Math.floor()

Math.floor(4.9) === 4  //true
// 相当于
~~4.9 === 4  //true

注意注意,这条确实不利于其他人看懂,需要合作的项目勿用,用了记得加注释

20 由你来补充 ? 21 那我来补充一条吧!双重*
3 ** 3 === 3 * 3 * 3
//a ** b就是a的b次方,也不用调用Math的方法了

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/91910.html

相关文章

  • 不“破”阿里终不还,“寒潮”之下Java程序员的凌云壮志

    摘要:终上所述这一切的一切,就是因为你技术不行但使龙城飞将在,不破楼兰终不还但使双手两眼在,不入阿里终不还是的,只要你双手还能敲代码,双眼还能看得见,对于程序员来说,阿里等这些大厂将会是你技术的必达点。 人在屋檐下,哪能不低头 (记2018年底互联网大寒潮) showImg(https://segmentfault.com/img/bVbmULW?w=240&h=240); 伴随着深冬凌冽的...

    GitCafe 评论0 收藏0
  • 不“破”阿里终不还,“寒潮”之下Java程序员的凌云壮志

    摘要:终上所述这一切的一切,就是因为你技术不行但使龙城飞将在,不破楼兰终不还但使双手两眼在,不入阿里终不还是的,只要你双手还能敲代码,双眼还能看得见,对于程序员来说,阿里等这些大厂将会是你技术的必达点。 人在屋檐下,哪能不低头 (记2018年底互联网大寒潮) showImg(https://segmentfault.com/img/bVbmULW?w=240&h=240); 伴随着深冬凌冽的...

    高璐 评论0 收藏0
  • 谈谈常见H5制作方法——视频与CSS3

    摘要:但目前白名单申请途径已经关闭。目前在安卓有一种同层播放器的解决方案。可解决安卓机自动全屏以及视频播放完毕会跳出广告的问题,并且可以实现交互。 本文在H5动效的常见制作手法的基础上,对相印的H5动效制作手法进行了扩展和整理,并结合案例谈谈怎么将其做得生动。 视频类 1、体验案例 视频类h5可以带给用户动效逼真,流畅的体验。虽然说制作视频的难度较大,但是瑕不掩瑜,一支视频可以尽可能地创造出...

    tracy 评论0 收藏0

发表评论

0条评论

shmily

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<