LoginSignup
0
0

概要

文系(体育科)卒業の僕が、人並みのアルゴリズムを身につけるためにLeetCodeを初めてみました。
日本だとAtCoderが一般的なようですが、海外エンジニアへの憧れを持つ僕はLeetCodeを選びました。

フロントの言語しかほぼ触ったことがないのでJavaScriptでやっていこうと思います。

問題

text

問題文

Write a function expect that helps developers test their code. It should take in any value val and return an object with the following two functions.
toBe(val) accepts another value and returns true if the two values === each other. If they are not equal, it should throw an error "Not Equal".
notToBe(val) accepts another value and returns true if the two values !== each other. If they are equal, it should throw an error "Equal".

初期コード

/**
 * @param {string} val
 * @return {Object}
 */
var expect = function(val) {
    
};

問題を整理すると...

  • テストコード
  • expect()はstring型のvalを受け取る
  • オブジェクトをreturnする
    • オブジェクトには関数が2つ
    • 関数はval以外ののvalueも受け取る
      • toBe(val)
        • 同じ値だったら→true
        • 違う値だったら→"Not Equal"
      • notToBe(val)
        • 同じ値だったら→Equal
        • 違う値だったら→"true"

急に難しくなっていないか🤔
そもそもこのvar expect = function(val) {}に馴染みが薄いので調べたみた。

これは、JavaScriptにおける関数の宣言の一つの形式です。
この形式では、var キーワードを使用して、変数 expect を宣言し、その変数に関数を代入しています。この形式は「関数式」と呼ばれ、関数を変数に格納することで、他の変数と同様に扱うことができます。具体的には次のような特徴があります。

🔸関数式
関数式は、関数を変数に代入する形式です。
関数名は省略することができます(無名関数または匿名関数と呼ばれます)。
宣言された関数は、変数に代入された後から利用可能になります(このため、変数のスコープやホイスティングの挙動に注意が必要です)。

🔸関数の宣言との違い
関数宣言(function foo() {} の形式)とは異なり、関数式は変数のスコープのルールに従います。たとえば、var を使用した場合、その関数は宣言された関数全体でアクセス可能ですが、宣言前には利用できません。
関数宣言はホイスティングされ、スクリプトのロード時に関数全体が先に処理されますが、関数式は実行フローがその行に到達したときに初めて評価されます。

を参考に下記のようにreturnしてみました。

/**
 * @param {string} val
 * @return {Object}
 */
var expect = function(val) {
    return {
        toBe(val2) {
            if(val === val2) {
                return true;
            } else {
                throw new Error("Not Equal")
            }
        },
        notToBe(val2) {
            if(val === val2) {
                throw new Error("Equal")
            } else {
                return true;
            }
        }
    }
};

returnの中身ですが下記のように書いてもいいみたいです。
ですが、上の書き方の方が推奨されているらしいのでこんな書き方もできるんだ程度に覚えておこう。

return {
    toBe: functions(val2) {
        //省略
    },
    notToBe: function(val2) {
        //省略
    }
}

これで実行してみると...
CleanShot 2024-06-25 at 06.00.59@2x.jpg
やったー全てのケースで通ったー。if(){} else {}の書き方はもっと改善できそうだけど、一旦これで提出してみます。

CleanShot 2024-06-25 at 06.02.20@2x.jpg

なんかもっと改善できそうだけど、朝の支度をせねばなので諦めます!😜

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0