Closed18

JavaScriptのショートハンド特集

Kazuki YonemotoKazuki Yonemoto

1. 複数の OR(||) 条件を持つ if 文記述の省略

carの値をチェックするif文を書くと、OR演算子使うことになる。
ただ、この場合だと複数の値を比較したい場合に可読性が落ちてしまう。

before
if (car === 'audi' || car === 'BMW' || car === 'Tesla') {
    //code
}

配列に確認したい値を格納して、includes() メソッドを用いる。

after
if (['audi', 'BMW', 'Tesla', 'grapes'].includes(car)) {
   //code
}

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/includes

引用: Change your old methods for writing a JavaScript Code - Shorthand's for JavaScript Code

Kazuki YonemotoKazuki Yonemoto

2. 複数のAND(&&)条件を持つ if 文の記述

OR演算子の場合と同じく、以下の書き方だと複数比較対象がある場合は読みづらくなる。

before
if(obj && obj.tele && obj.tele.stdcode) {
    console.log(obj.tele.stdcode)
}

この場合、オプショナルチェーン (?.)の使用が記載されていた。
ここで注意が必要なのがオプショナルチェーン (?.)を使うと、エラーにならない代わりにundefinedを返すようになる。

この挙動を意図しない場合は気を付けた方がよさそう。👀

after
console.log(obj?.tele?.stdcode);

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Optional_chaining

引用: Change your old methods for writing a JavaScript Code - Shorthand's for JavaScript Code

Kazuki YonemotoKazuki Yonemoto

4. 複数の選択肢からswich文で値を選択する

複数の選択肢から条件に合うものを返したい場合はswich文のままでもいい気はする。
これは好みの問題かも!?👀

before
switch (number) {
  case 1:
     return 'Case one';
  case 2:
     return 'Case two';
  default:
     return;
}

Map オブジェクトを使用して簡略化する。
ただし、swich文は厳密等価 (===)で比較されるため挙動の差異には注意が必要。

after
const data = {
  1: 'Case one',
  2: 'Case two'
};
//Access it using
data[num]

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Map
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Strict_equality

引用: Change your old methods for writing a JavaScript Code - Shorthand's for JavaScript Code

Kazuki YonemotoKazuki Yonemoto

6. 条件に応じた関数呼び出し

if文でコールしたい関数が異なる場合、そのまま書くとこうなる。

before
function height() {
    console.log('height');
}
function width() {
    console.log('width');
}
if(type === 'heigth') {
    height();
} else {
    width();
}

即時関数と条件 (三項) 演算子で書くとシンプル?

after
(type === 'heigth' ? height : width)()

コメントにもあったけどこっちの方が良さげ。

after
type === 'heigth' ? height() : width()

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Conditional_Operator

引用: Change your old methods for writing a JavaScript Code - Shorthand's for JavaScript Code

Kazuki YonemotoKazuki Yonemoto

1. 配列のマージ

2つ以上の配列を合体させたい場合、concatメソッドが利用できる。
concatメソッドは既存の配列を変更せず、代わりに新しい配列を返します。

before
let apples = ['🍎', '🍏'];
let fruits = ['🍉', '🍊', '🍇'].concat(apples);

console.log( fruits );
//=> ["🍉", "🍊", "🍇", "🍎", "🍏"]

スプレッド構文 (...) を使っとよりスッキリかけるかな。👀

after
let apples = ['🍎', '🍏'];
let fruits = ['🍉', '🍊', '🍇', ...apples];  // <-- here

console.log( fruits );
//=> ["🍉", "🍊", "🍇", "🍎", "🍏"]

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/concat
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Spread_syntax

引用: 10 Awesome JavaScript Shorthands

Kazuki YonemotoKazuki Yonemoto

2. 配列のマージ(配列の最初に追加)

fruits配列の最初にapples配列のすべての項目を追加したい場合は次のように unshift() メソッドが使用できる。

before
let apples = ['🍎', '🍏'];
let fruits = ['🥭', '🍌', '🍒'];

// Add all items from apples onto fruits at start
Array.prototype.unshift.apply(fruits, apples)

console.log( fruits );
//=> ["🍎", "🍏", "🥭", "🍌", "🍒"]
  1. と同じくスプレッド構文 (...)を使えばより簡潔に書ける。 🥳
after
let apples = ['🍎', '🍏'];
let fruits = [...apples, '🥭', '🍌', '🍒'];  // <-- here

console.log( fruits );
//=> ["🍎", "🍏", "🥭", "🍌", "🍒"]

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/unshift
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Spread_syntax

引用: 10 Awesome JavaScript Shorthands

Kazuki YonemotoKazuki Yonemoto

3. 配列の複製

slice() メソッドを使用すると、配列を以下のように複製できます。

before
let fruits = ['🍉', '🍊', '🍇', '🍎'];
let cloneFruits = fruits.slice();

console.log( cloneFruits );
//=> ["🍉", "🍊", "🍇", "🍎"]

ここでも毎度お馴染みスプレッド構文 (...)が活躍する。 😊

after
let fruits = ['🍉', '🍊', '🍇', '🍎'];
let cloneFruits = [...fruits];  // <-- here

console.log( cloneFruits );
//=> ["🍉", "🍊", "🍇", "🍎"]

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/slice
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Spread_syntax

引用: 10 Awesome JavaScript Shorthands

Kazuki YonemotoKazuki Yonemoto

4. 分割代入

配列を操作していると以下のように値を取り出して別の変数に代入したいケースが出てくる時がある。
ただ、取り出す値が多くなると複数行書かないと行けなくなってしまう。

before
let apples = ['🍎', '🍏'];
let redApple = apples[0];
let greenApple = apples[1];

console.log( redApple );    //=> 🍎
console.log( greenApple );  //=> 🍏

分割代入を利用するとスッキリ書ける✨

after
let apples = ['🍎', '🍏'];
let [redApple, greenApple] = apples;  // <-- here

console.log( redApple );    //=> 🍎
console.log( greenApple );  //=> 🍏

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment

引用: 10 Awesome JavaScript Shorthands

Kazuki YonemotoKazuki Yonemoto

5. テンプレートリテラル

文字列の連結を行うには以下のような手法がある。

before
// Display name in between two strings
let name = 'Palash';
console.log('Hello, ' + name + '!');
//=> Hello, Palash!

// Add & Subtract two numbers
let num1 = 20;
let num2 = 10;
console.log('Sum = ' + (num1 + num2) + ' and Subtract = ' + (num1 - num2));
//=> Sum = 30 and Subtract = 10

テンプレートリテラルを使うと${...} でラップすることにより、任意の式を文字列に埋め込むことができる。可読性が良くなるので積極的に使って行きたいですね☺️

after
// Display name in between two strings
let name = 'Palash';
console.log(`Hello, ${name}!`);  // <-- No need to use + var + anymore
//=> Hello, Palash!

// Add two numbers
let num1 = 20;
let num2 = 10;
console.log(`Sum = ${num1 + num2} and Subtract = ${num1 - num2}`);
//=> Sum = 30 and Subtract = 10

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Template_literals

引用: 10 Awesome JavaScript Shorthands

Kazuki YonemotoKazuki Yonemoto

6. forループ処理

forループ文で配列を扱うと以下のように書ける。

before
let fruits = ['🍉', '🍊', '🍇', '🍎'];

// Loop through each fruit
for (let index = 0; index < fruits.length; index++) { 
  console.log( fruits[index] );  // <-- get the fruit at current index
}

//=> 🍉
//=> 🍊
//=> 🍇
//=> 🍎

for...of 文を使うともう少しスッキリ書ける。

after
let fruits = ['🍉', '🍊', '🍇', '🍎'];

// Using for...of statement 
for (let fruit of fruits) {
  console.log( fruit );
}

//=> 🍉
//=> 🍊
//=> 🍇
//=> 🍎

https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Loops_and_iteration
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/for...of

引用: 10 Awesome JavaScript Shorthands

Kazuki YonemotoKazuki Yonemoto

7. アロー関数

配列をforEach()メソッドで処理すると以下のようになる。ただ、もう少し簡潔に書きたいと思うかもしれない。

before
let fruits = ['🍉', '🍊', '🍇', '🍎'];

// Using forEach method
fruits.forEach(function(fruit){
  console.log( fruit );
});

//=> 🍉
//=> 🍊
//=> 🍇
//=> 🍎

その場合はアロー関数を使ってよりスッキリ書ける場合がある。

after
let fruits = ['🍉', '🍊', '🍇', '🍎'];
fruits.forEach(fruit => console.log( fruit ));  // <-- Magic ✨

//=> 🍉
//=> 🍊
//=> 🍇
//=> 🍎

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Functions/Arrow_functions

引用: 10 Awesome JavaScript Shorthands

Kazuki YonemotoKazuki Yonemoto

8. 配列内から特定のオブジェクトを見つける

配列内のオブジェクトを見つけるには、for ループが利用できます。
以下参考例ではApplesという値を持つオブジェクトを抽出しています。ただ、ご覧の通り記述量がそれなりにあります。

before
let inventory = [
  {name: 'Bananas', quantity: 5},
  {name: 'Apples', quantity: 10},
  {name: 'Grapes', quantity: 2}
];

// Get the object with the name `Apples` inside the array
function getApples(arr, value) {
  for (let index = 0; index < arr.length; index++) {

    // Check the value of this object property `name` is same as 'Apples'
    if (arr[index].name === 'Apples') {  //=> 🍎

      // A match was found, return this object
      return arr[index];
    }
  }
}

let result = getApples(inventory);
console.log( result )
//=> { name: "Apples", quantity: 10 }

find() メソッドを使用すると、次のように簡単に実現できます。

after
// Get the object with the name `Apples` inside the array
function getApples(arr, value) {
  return arr.find(obj => obj.name === 'Apples');  // <-- here
}

let result = getApples(inventory);
console.log( result )
//=> { name: "Apples", quantity: 10 }

アロー関数の良さを引き出すなら以下のような書き方をすると1行でもやれちゃう。👀

after
let result = inventory.find(obj => obj.name === 'Apples');
console.log( result );

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/find

引用: 10 Awesome JavaScript Shorthands

Kazuki YonemotoKazuki Yonemoto

9. 文字列を整数に変換

parseInt() 関数は、文字列を解析して整数を返してくれます。

before
let num = parseInt("10")

console.log( num )         //=> 10
console.log( typeof num )  //=> "number"

文字列の前に + のプレフィックスを追加することで、同じことができる。

after
let num = +"10";

console.log( num )           //=> 10
console.log( typeof num )    //=> "number"
console.log( +"10" === 10 )  //=> true

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/parseInt

引用: 10 Awesome JavaScript Shorthands

Kazuki YonemotoKazuki Yonemoto

10. 短絡評価

以下のようにif-else ステートメントを使うことが多いかもしれない。

before
function getUserRole(role) {
  let userRole;

  // If role is not falsy value
  // set `userRole` as passed `role` value
  if (role) {
    userRole = role;
  } else {

    // else set the `userRole` as USER
    userRole = 'USER';
  }

  return userRole;
}

console.log( getUserRole() )         //=> "USER"
console.log( getUserRole('ADMIN') )  //=> "ADMIN"

論理演算子(||)の短絡評価を利用するとより短くかける。

after
function getUserRole(role) {
  return role || 'USER';  // <-- here
}

console.log( getUserRole() )         //=> "USER"
console.log( getUserRole('ADMIN') )  //=> "ADMIN"

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Logical_OR

引用: 10 Awesome JavaScript Shorthands

このスクラップは2022/12/03にクローズされました