3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

冬だしモダンなWeb言語を習得してみるAdvent Calendar 2024

Day 6

久しぶりにJavaScriptを触る未来の私へ

Posted at

JavaScriptを学び中の今、混乱したこと・違和感を感じたことのリスト。
きっと数ヶ月・数年経って久しぶりにJavaScriptを使う私が同じところで躓くと思うので、ここに残します。

VSCodeでJavaScriptでデバッグする

参考:Visual Studio CodeでのJavaScriptのデバッグ方法

ファイル構成
model\
 `javascript01\
  |`sample.html
   `main.js
sample.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <script defer src="main.js"></script>
  </head>
  <body>
    <div class="container">
      <button id="go">GO!</button>
    </div>
  </body>
</html>
main.js
'use strict';

const goButton = document.querySelector("#go");

goButton.addEventListener("click", kansu);

function kansu() {
  // ここに処理を書く
}

JavaScriptは別にWebサイト・Webブラウザ上だけで動くわけじゃないんだけど
今回の学習の内容からしてもこんな実装したうえで動かすのがよさげ。

image.png

Live Previewでhtmlを表示してWebサーバ立ててURLをコピペしておく。

image.png

初めてデバッグさんボタンを押すとこんなメッセージが出るのでlaunch.jsonファイルを作成しますを選択。

image.png

image.png

当然最後はChromeでもいいんだけど今現在の私はEdge派。

ファイル構成
model\
|`.vscode\
|  `launch.js ★
 `javascript01\
  |`sample.html
   `main.js
launch.js
{
  // IntelliSense を使用して利用可能な属性を学べます。
  // 既存の属性の説明をホバーして表示します。
  // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387
  "version": "0.2.0",
  "configurations": [
    {
      "type": "msedge",
      "request": "launch",
      "name": "Open sample.html",
      "file": "{フォルダ格納しているパス}\\model\\javascript01\\sample.html"
    }
  ]
}

このlaunch.jsとかもなんなのかまだわかってない。12月末までにわかっているといいな。
んであとはいい感じにブレイクポイント貼っていい感じに実行すればいい。

image.png

image.png

image.png

配列の定数、再定義はできないけど値の更新はできる

なんでやねん!

sample.js
function kansu() {
  const fruits = ["apple", "banana", "orange"];

  fruits = ["one", "two", "three"];
}
console.log
Uncaught TypeError TypeError: Assignment to constant variable.
    at kansu (xxxxx\model\javascript01\main.js:10:10)

いっぽうで

sample.js
function kansu() {
  const fruits = ["apple", "banana", "orange"];

  fruits[0] = "lemon";

  console.log(fruits);
}
console.log
(3) ['lemon', 'banana', 'orange']
main.js:12
0 = 'lemon'
1 = 'banana'
2 = 'orange'
length = 3
[[Prototype]] = Array(0)
[[Prototype]] = Object

なぜなの!納得いかん。が、そういうものだと現状は理解。

ちなみにpushもできる。まじかよ。

sample.js
const fruits = ["apple", "banana", "orange"];
fruits.push("grape");

lengthは「要素数」。最後の要素の番号じゃない

sample.js
for(let i = 0; i < fruits.length; i++) {
  console.log(fruits[i]);
}

これはNG

i <= fruits.length

Perlあたりであったんだよな。最後の要素番号取るやつ。$#ARGVだっけ。
参考:perlにおける配列要素数の取得

コイツのせいでよくミスる。私だけじゃないはず。

forの条件式で定義した変数はループ後に解放される

sample.js
function kansu() {
  const fruits = ["apple", "banana", "orange"];

  for(let i = 0; i < fruits.length; i++) {
    console.log(fruits[i]);
    console.log(i);
  }
  console.log(i);
}
console.log
apple
main.js:11
0
main.js:12
banana
main.js:11
1
main.js:12
orange
main.js:11
2
main.js:12
Uncaught ReferenceError ReferenceError: i is not defined
    at kansu (xxxxx\model\javascript01\main.js:14:15)

オブジェクトという存在

あ、ちなみに自分、言語系の習熟ほぼ皆無です。肌でbashスクリプトとperlを身に着けている程度。
で、Java系やってるとよく聞くMapという存在。おそらくPerlでいうところのHashなんだろうけど、Progateだと「オブジェクト」っていう名前で紹介された。違うものなの?

参考:【JavaScript】これからはオブジェクトよりも Map オブジェクトを使おう!

あ、違うものなのね。積み本。

配列の中のオブジェクトの呼び出し方

なんだか「Perlで育ってきた人がJavaScriptを触るときに気をつけること」になってきたな。ニッチな需要だ。

sample.js
const fruits = [
{name: "orange", color: "orange"},
{name: "apple", color: "red"}
];

console.log(fruits[1].name);

これがPerlだと$fruits[1]{name}みたいな、だっけ?そんなんになるわけだ。すっごいわかりやすいね。

オマケにオブジェクトの中のオブジェクトも同じ。

sample.js
const user = {
  name: "Ki2neudon",
  favorite : {
    food: "soba",
    sport: "ランニング",
    game: "ビタミーナ王国"
  }
}
console.log(user.favorite.game);

めっちゃ直感的~!

アロー関数

JavaScript ES6 から導入されたらしい

sample.js
const hoge = function() {
  //
}

sample.js
const hoge = () => {
  //
}

って書ける…え、これ見やすい?でも覚えていないと「なぁにこれぇ」ってなりそう。

forとforEachの違い

いろいろあるんだろうけど、いったんいまの理解

sample.js
const fruits = ["orange", "apple", "lemon"];
for(let i = 0; i < fruits.length; i++){
  console.log(fruits[i]);
}
sample.js
const fruits = ["orange", "apple", "lemon"];
fruits.forEach((fruit) => {
  console.log(fruit);
})

いちいちiを定義しなくていい。あとforEachが関数ではなくて配列のメソッド、というところ。
今回体系的にゼロから学ばないとココもぼんやり認識している程度だったんだろうなぁ

3
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
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?