JavaScriptプログラミングの基礎と実践

JavaScriptの学習には、阮一峰老师的网络电子书をお勧めします。JavaScriptはかつて的设计思想を経て广泛的に使用されている言語ではなく、ブラウザアプリケーション開発の实践中に流行起来的です。主にブラウザ側で动作し、DOMオブジェクトを操作します。

ブラウザ側には、多くのオブジェクトが存在します。例えばwindow、document、consoleなどが代表的です。XMLHttpRequestも非常に基础的で日常的なオブジェクトであり、网络通信に使用されます。现在では多くのライブラリが方便的 に封装されていますが、基本的な原理は変わりません!

    const loginData = {
        "userId": "user001",
        "passKey": "secure123",
        "deviceId": "IMEI12345"
    };
    
    const request = new XMLHttpRequest();
    request.open("POST", "https://api.example.com/auth/login", true);
    request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    
    request.onreadystatechange = function(){
        /**
         * readyStateの状態
         * 0: 未初期化
         * 1: サーバー接続済み
         * 2: リクエスト受信済
         * 3: 処理中
         * 4: 完了、レスポンス準備完了
         **/
        if (request.readyState === 4) {
            if (request.status === 200) {                
                const response = request.responseText;
                console.log("レスポンス:", response);
                const parsedData = JSON.parse(JSON.parse(response));
            } else {
                console.log("エラー発生:", request.status);
            } 
        }
    };
    
    request.send(JSON.stringify(loginData));

JavaScriptにはJavaのような強力なコレクションクラスがありませんが、配列 자체还是很强大的。多次元配列を一次元配列に変換する 방법은以下の通りです:

const nestedArray = [[1, 2], [3, 4], [5, [6, 7, 8]]];

const flattenArray = function(array) {
    return array.reduce((accumulator, currentValue) => {
        return accumulator.concat(
            Array.isArray(currentValue) ? flattenArray(currentValue) : currentValue
        );
    }, []);
};

console.log(flattenArray(nestedArray));
// 結果: [1, 2, 3, 4, 5, 6, 7, 8]

JavaScriptには还有很多特性,其设计有历史原因。学习js的方法,更多的是看别人代码,从中模仿学习。

// 計算プロパティ名の例
const keyName = 'userEmail';
const userObject = {
    [keyName]: 'test@example.com',
    id: 1001
};

JavaScriptのPromiseオブジェクトは、的非執行タスクに使用されます。的非処理をよりシンプルに書くことができます。

function fetchUserData(userId) {
    return new Promise((resolve, reject) => {
        const xhr = new XMLHttpRequest();
        xhr.open('GET', `/api/users/${userId}`);
        xhr.onload = () => {
            if (xhr.status === 200) {
                resolve(JSON.parse(xhr.responseText));
            } else {
                reject(new Error('リクエスト失敗'));
            }
        };
        xhr.onerror = () => reject(new Error('ネットワークエラー'));
        xhr.send();
    });
}

デコレータを使用すると、既存のクラスに新しいメソッドを簡単に追加できます。デコレータは、修飾対象のオブジェクトをパラメータとして受け取る関数として理解できます。

function logMethod(target, name, descriptor) {
    const originalMethod = descriptor.value;
    descriptor.value = function(...args) {
        console.log(`メソッド '${name}' が呼び出されました`);
        return originalMethod.apply(this, args);
    };
    return descriptor;
}

class Calculator {
    @logMethod
    add(a, b) {
        return a + b;
    }
}

Node.jsとブラウザ端的JavaScriptでは、動作環境が異なります。ブラウザ专用のコードはNode.jsで実行できません:



<header></header>
<body>
    <h1>サンプルページ</h1>
    <script>
        // ブラウザでは動作するが、Node.jsではエラーになる
        const http = require('http');
        
        const server = http.createServer((req, res) => {
            res.writeHead(200, {'Content-Type': 'text/plain'});
            res.end('Hello World');
        });
        
        server.listen(3000);
    </script>
</body>

ES6で書かれたコードをNode.jsで実行しようとしてエラーに遭遇することがあります。この場合、ES6のモジュールシステムが関係している可能性があります。

Node.jsのv14以上のバージョンではES6モジュールのサポートが改善されています。使用しているNode.jsのバージョンを確認し、必要に応じて升级することをお勧めします。

ES5とES6の主な差别如下:

変数宣言: var vs let/const 関数定義: function vs アロー関数 クラス構文の導入 モジュール化: require vs import/export Promiseによる非同期処理

参考: ES6 教程

タグ: javascript XMLHttpRequest Promise nodejs ES6

8月1日 11:53 投稿