diff --git a/README.md b/README.md index 0c605f96..837278aa 100644 --- a/README.md +++ b/README.md @@ -817,13 +817,21 @@ button.addEventListener('click', function(event) { ### ステージ5 -サーバーと通信するトレーニング +非同期処理のトレーニング #### サーバーとの通信 -JavaScript にはサーバーと通信するための API が -用意されています。 +非同期処理の代表例といえばサーバーとの通信です。 + +サーバーとの通信はネットワークを通過するため、 +かなりの時間がかかります。そこで、レスポンスが +返ってくるまでの間に、別の処理をおこなうことに +よって、時間を有効活用することが重要になります。 + + +JavaScript にはサーバーと非同期に通信するための +API が用意されています。 - [fetch API](http://www.hcn.zaq.ne.jp/___/WEB/Fetch-ja.html) @@ -855,7 +863,7 @@ fetch('/users.json') console.log('parsed json', json) }) .catch(function(error) { - console.log('parsing failed', error) + console.error('parsing failed', error) }); ``` @@ -894,7 +902,7 @@ fetch('/users.json') // /users.json の取得時にエラーがでたときに、 // error をログに出力する - console.log(error); + console.error(error); }); ``` @@ -1101,19 +1109,19 @@ bower で管轄したいファイルのディレクトリを開き、 このパッケージの作者を指定します。 -##### 7. license +##### 8. license 好きなライセンスを選ぶとよいです。 デフォルトは [MIT ライセンス](http://sourceforge.jp/projects/opensource/wiki/licenses%2FMIT_license)です。 -##### 8. homepage +##### 9. homepage このパッケージの情報が見られる URL を記述します。 -##### 9. set currenttly installed components as dependencies? +##### 10. set currenttly installed components as dependencies? 既に `bower_components` に含まれている コンポーネントをパッケージ設定に @@ -1122,7 +1130,7 @@ bower で管轄したいファイルのディレクトリを開き、 n で構いません。 -##### 10. add commonly ignored files to ignore list? +##### 11. add commonly ignored files to ignore list? `.gitignore` などのファイルから、 パッケージに含めないファイルの指定を @@ -1131,7 +1139,7 @@ n で構いません。 y で読み込ませます。 -##### 11. would you like to mark this package as private which prevents it from being accidentaly published to the registry? +##### 12. would you like to mark this package as private which prevents it from being accidentaly published to the registry? bower のレジストリへ登録できないようにするか どうか指定します。 @@ -1139,7 +1147,7 @@ bower のレジストリへ登録できないようにするか y でレジストリへの公開ができないように設定します。 -##### 12. Looks good? +##### 13. Looks good? この設定で問題なければ y を入力します。 @@ -1193,13 +1201,27 @@ y でレジストリへの公開ができないように設定します。 よくあるイディオムを読み書きするトレーニング +このステージでは、よくある JavaScript の +不思議な書き方を学びます。 + +なお、今回はヒントがありません! +ぜひ自分で調べて、結果を確かめてみてください! + + +なお、興味のある方は、ステージ「闇」に +挑戦してみてくださいね! + +`.skip` を削除すれば挑戦できるようにに +なります。 + + #### 実習 下のテストが green になるように、 -`public/stage6/tests.js` を +`public/stage7/tests.js` を 修正してください。 -[http://localhost:8000/stage6/](http://localhost:8000/stage6/) +[http://localhost:8000/stage7/](http://localhost:8000/stage7/) diff --git a/public/stage7/.csslintrc b/public/stage7/.csslintrc new file mode 100644 index 00000000..a45be0e9 --- /dev/null +++ b/public/stage7/.csslintrc @@ -0,0 +1,4 @@ +{ + "//": "さすがにいまどき IE7 はやめてほしい", + "box-sizing": false +} diff --git a/public/stage7/.eslintrc b/public/stage7/.eslintrc new file mode 100644 index 00000000..f6d7f11c --- /dev/null +++ b/public/stage7/.eslintrc @@ -0,0 +1,17 @@ +{ + "env": { + "browser": true, + "mocha": true + }, + "rules": { + "no-unused-expressions": 0, + "no-undef-init": 0 + }, + "globals": { + "$": false, + "jQuery": false, + "fetch": false, + "Promise": false, + "HTMLCollection": false + } +} diff --git a/public/stage7/index.html b/public/stage7/index.html new file mode 100644 index 00000000..701812a5 --- /dev/null +++ b/public/stage7/index.html @@ -0,0 +1,31 @@ + + + + mixi JS Training + + + + + + + + + +
+ + + + + + + + + + diff --git a/public/stage7/style.css b/public/stage7/style.css new file mode 100644 index 00000000..3d2d8efd --- /dev/null +++ b/public/stage7/style.css @@ -0,0 +1,5 @@ +.js-training-sample-link { + display: block; + margin: 10px auto; + text-align: center; +} diff --git a/public/stage7/tests.js b/public/stage7/tests.js new file mode 100644 index 00000000..f6021af2 --- /dev/null +++ b/public/stage7/tests.js @@ -0,0 +1,195 @@ +describe('ステージ7(よくあるJSのイディオムを読める)', function() { + 'use strict'; + + it('クロージャー', function() { + var createCounter = function() { + var i = 0; + + return function() { + return i++; + }; + }; + + var counter = createCounter(); + + expect(counter()).to.equal(/* ここに値を書き込んでください */); + expect(counter()).to.equal(/* ここに値を書き込んでください */); + expect(counter()).to.equal(/* ここに値を書き込んでください */); + }); + + + it('ショートサーキット演算', function() { + expect(true && 'default').to.equal(/* ここに値を書き込んでください */); + + expect(false || 'default').to.equal(/* ここに値を書き込んでください */); + + expect(0 || 'default').to.equal(/* ここに値を書き込んでください */); + + expect({} || 'default').to.deep.equal(/* ここに値を書き込んでください */); + + var func = function(arg) { + return arg || {}; + }; + + expect(func({ foo: 'bar' })).to.deep.equal(/* ここに値を書き込んでください */); + + expect(func()).to.deep.equal(/* ここに値を書き込んでください */); + }); + + + it('無名即時実行関数', function() { + var num = 0; + + (function() { + num = 1; + })(); + + expect(num).to.equal(/* ここに値を書き込んでください */); + }); + + + it('setTimeout 0 パターン', function() { + var num = 0; + + setTimeout(function() { + num = 1; + }, 0); + + expect(num).to.equal(/* ここに値を書き込んでください */); + }); + + + it('真偽値変換', function() { + var truthy = 1; + var falsey = 0; + + expect(!!truthy).to.equal(/* ここに値を書き込んでください */); + expect(!!falsey).to.equal(/* ここに値を書き込んでください */); + expect(Boolean(truthy)).to.equal(/* ここに値を書き込んでください */); + expect(Boolean(falsey)).to.equal(/* ここに値を書き込んでください */); + }); + + + it('prototype 継承', function() { + var GrandParent = function() { + this.grandParent = true; + }; + + var Parent = function() { + this.parent = true; + }; + Parent.prototype = new GrandParent(); + + var Child = function() { + this.child = true; + }; + Child.prototype = new Parent(); + + var parent = new Parent(); + var child = new Child(); + + expect(parent.grandParent).to.equal(/* ここに値を書き込んでください */); + + expect(parent.child).to.equal(/* ここに値を書き込んでください */); + + expect(child.grandParent).to.equal(/* ここに値を書き込んでください */); + + expect(child.parent).to.equal(/* ここに値を書き込んでください */); + }); +}); + + +describe.skip('闇', function() { + it('== 演算子', function(){ + expect('10' == 10) + .to.equal(/* ここに値を書き込んでください */); + + expect(null == undefined) + .to.equal(/* ここに値を書き込んでください */); + + expect(null == false) + .to.equal(/* ここに値を書き込んでください */); + + expect(true == 1) + .to.equal(/* ここに値を書き込んでください */); + + expect([0, 1] == 0) + .to.equal(/* ここに値を書き込んでください */); + + expect([1] == 1) + .to.equal(/* ここに値を書き込んでください */); + }); + + + it('new 演算子', function(){ + expect(Boolean(false) ? true : false) + .to.equal(/* ここに値を書き込んでください */); + + expect(Boolean(0) ? true : false) + .to.equal(/* ここに値を書き込んでください */); + + expect(new Boolean(0) ? true : false) + .to.equal(/* ここに値を書き込んでください */); + + expect('abc' ? true : false) + .to.equal(/* ここに値を書き込んでください */); + + expect('' ? true : false) + .to.equal(/* ここに値を書き込んでください */); + + expect(String(0) ? true : false) + .to.equal(/* ここに値を書き込んでください */); + + expect(String('') ? true : false) + .to.equal(/* ここに値を書き込んでください */); + + expect(new String(0) ? true : false) + .to.equal(/* ここに値を書き込んでください */); + + expect(new String('') ? true : false) + .to.equal(/* ここに値を書き込んでください */); + }); + + + it('暗黙のキャスト', function(){ + expect(+'10' === '10').to.equal()/* ここに値を書き込んでください */; + + expect(10 === (10 + '')).to.equal(/* ここに値を書き込んでください */); + }); + + + it('Array コンストラクタ', function(){ + expect(Array(3)).to.deep.equal(/* ここに値を書き込んでください */); + + expect(Array(1, 2, 3)).to.deep.equal(/* ここに値を書き込んでください */); + }); + + + it('with文', function(){ + var obj = { 'foo': undefined, 'undefined': true }; + + with (obj) { + expect(obj.foo === undefined) + .to.equal(/* ここに値を書き込んでください */); + } + }); + + + it('typeof 演算子', function(){ + expect(typeof 0).to.equal(/* ここに値を書き込んでください */); + + expect(typeof true).to.equal(/* ここに値を書き込んでください */); + + expect(typeof 'string').to.equal(/* ここに値を書き込んでください */); + + expect(typeof function() {}).to.equal(/* ここに値を書き込んでください */); + + expect(typeof {}).to.equal(/* ここに値を書き込んでください */); + + expect(typeof []).to.equal(/* ここに値を書き込んでください */); + + expect(typeof undefined).to.equal(/* ここに値を書き込んでください */); + + expect(typeof null).to.equal(/* ここに値を書き込んでください */); + }); +});