js1 JavaScript の基礎
問題一覧
1
できない。 Webページ上のJavaScriptは、ハードディスク上の任意のファイルの読み書きや、それらのコピー、プログラムの実行をすることができません。OSのシステム機能に直接アクセスすることはできません。
2
基本はできない設計となっているが、 両方のページ にデータ交換を行うための特別なJavaScriptコードを含めれば可能。 また上記を実施しないでも、同一オリジンであれば、可能。 以下抜粋 異なるタブやウィンドウは一般的にお互いについて知りません。時々、例えばあるウィンドウがJavaScriptを利用して別のウィンドウを開くケースはあります。しかし、この場合においても、あるページからのJavaScriptは、別のサイト(異なるドメイン、プロトコル、ポート)からのものである場合は、アクセスすることはできません。 これは “Same Origin Policy” と呼ばれています。回避するためには、 両方のページ にデータ交換を行うための特別なJavaScriptコードを含める必要があります。 この制限もユーザの安全のためです。ユーザが開いた http://anysite.com というサイトのページは、URL http://gmail.com の別のブラウザのタブにアクセスし、そこから情報を盗むことはできません。
3
同一オリジンポリシーによってアクセスできない。 回避するためには、 両方のページ にデータ交換を行うための特別なJavaScriptコードを含める必要があります。
4
ブラウザがこのタグを見つけたときに自動的に実行される ボディ読み込んだあとでpタグのあと
5
src属性を指定する。 現在のページからの相対パスで指定する <script src="/path/to/script.js"></script> 完全なURLも同様に可能 <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.2.0/lodash.js"></script>
6
最もシンプルなスクリプトだけをHTML内に置きます。より複雑なものは別のファイルに置きます。 例 <script src="file.js"></script> <script> alert(1); </script これはだめ <script src="file.js"> alert(1); // src が設定されているので、このコンテンツは無視されます。 </script>
7
ダウンロードしたjsファイルはキャッシュ化されるため、他のページで同じjsファイルを利用する際にダウンロードの節約となる。 以下抜粋 ファイル分割のメリットは、ブラウザがダウンロードしてそれをブラウザのキャッシュに保存するためです。 以降、同じスクリプトが必要な他のページは、ダウンロードする代わりにキャッシュから取得します。そのため、ファイルは実際には一度だけダウンロードされます。 これはネットワーク通信量を節約しページをより速くします。
8
書いてあるやつもあるけどいらない。 スクリプトの言語を type="text/javascript" のような MIMEタイプで指定します。HTML4.01では必須の属性として定義されていましたが、HTML5 では省略時は type="text/javascript" とみなされるようになりました。
9
一応うごく 勝手にセミコロンつけてくれる。 だけど非推奨
10
スラッシュ二つか、スラッシュアスタリスクで囲む // この行全体がコメントになります。 alert('Hello'); /* 2つのメッセージを含む例。 これは複数行のコメントです。 */ alert('Hello'); ちなみに ほとんどのエディタでは、コードの行は1行コメントとして Ctrl+/ ホットキーによりコメントアウトすることができます。そして Ctrl+Shift+/ で複数行コメントです(コードの一部を選択し、ホットキーを押します)。
11
これがスクリプトの先頭に位置する場合、すべてのスクリプトは “最新の” 方法で動作します。 "use strict"; // このコードはモダンな方法で動作します。 ... 常に "use strict" で始まるスクリプトは推奨されます
12
カンマでくぎれば、letは省略可能 let user = 'John', age = 25, message = 'Hello';
13
"use strict"; がなければ動くが非推奨である。
14
const const myBirthday = '18.04.1982';
15
値の再代入が禁止される。 ※値の変更はできる const myBirthday = '18.04.1982'; myBirthday = '01.01.2001'; // エラー, 定数の再代入はできません!
16
大文字の定数は、実行する前から値が変わらないものをハードコートしたもの。 小文字の定数は、 実行中にランタイムで 計算 されますが、代入後は変更されないもの。 const BIRTHDAY = '18.04.1982'; // make uppercase? const age = someCode(BIRTHDAY); // make uppercase
17
基本はconst letは再代入が想定されるものに利用する。 varは現在の実行コンテキスト(モジュールorグローバル) もしくはレキシカル環境に直ぐロードさせたい場合 または、ブロックスコープの外でもみえるような変数を定義したい場合(非推奨) var で宣言された変数のスコープは、その現在の実行コンテキストとそのクロージャであり、その中で宣言された関数、あるいは関数の外で宣言された変数の場合はグローバルになります
18
Infinity、 -Infinity、 NaN Infinity は数学的な無限大 ∞ を表します。どの値よりも大きい特別な値です 0除算で得ることができる。 alert( 1 / 0 ); ベタ書きもできる。 alert( Infinity ); NaN は計算上のエラーを表します。 alert( "not a number" / 2 );
19
BigInt型 末尾の "n" は BigInt を意味します const bigInt = 1234567890123456789012345678901234567890n;
20
バッククォートを利用した引用符のことで、変数を ${…} の中にラップすることで、変数を埋め込み文字列の中で表現することができる。 let name = "John"; // 変数が埋め込まれた場合 alert( `Hello, ${name}!` ); // Hello, John! // 式が埋め込まれた場合 alert( `the result is ${1 + 2}` ); // 結果は 3
21
null は “無し”、“空” または “不明な値” と言った意味を持つ特別な値です undefined は値が代入されていないことを示す。宣言されているが値がない変数とか 存在しないプロパティはそうなる。 一般的には、 “空” や “不明な値” と言った用途では null を使い、undefined は変数が割り当てられているか、もしくは似たような確認のために使います。 ちなみにnullはリテラルで、undefined は変数 undefined 変数が上書きされてる懸念ありなので、void 0を使う
22
typeofを利用する 。 二つのパターンがある。 演算子として: typeof x. 関数スタイル: typeof(x). 例 typeof undefined // "undefined" typeof 0 // "number" typeof 10n // "bigint" typeof true // "boolean" typeof "foo" // "string" typeof Symbol("id") // "symbol" typeof Math // "object" typeof null // "object" これは 公式に認められたエラーらしい。 typeof alert // "function"
23
alert("Hello");
24
promptを使う 戻り値は入力された値、 入力がキャンセルされた場合には null が返却されます。 例 let age = prompt('How old are you?', 100); 第一引数は出力メッセージで、第二引数は任意で、デフォルト値
25
confirm 関数をつかう。 戻り値はBoolean let isBoss = confirm("Are you the boss?");
26
ある関数、演算子などで、期待される型でないものが入力された場合、暗黙的に型変換が行われること。
27
文字列変換は、文字列形式の値が必要なときに発生します。 たとえば、alert(value) は値を表示するためにそれを行います。
28
String(value) 関数が実行されている。 let value = true; alert(typeof value); // boolean value = String(value); // 今、値は文字列の "true" alert(typeof value); // string
29
数値変換は数学的関数や表現の中で自動的に起こります。例えば除算などの演算子を使った時で "6" / "2" は数値の3が出力される。
30
Number(value) let str = "123"; alert(typeof str); // string let num = Number(str); // 数値の 123 になります alert(typeof num); // number
31
文字列が有効な数値でない場合、このような変換の結果は NaN です。
32
undefined は NaN nullは 0 true と false は 1 and 0 string は トリムされて空なら0 数値の文字ならそのまま変換 変換できない文字ならNaN alert( Number(" 123 ") ); // 123 alert( Number("123z") ); // NaN ("z" の読み込みでエラー) alert( Number(true) ); // 1 alert( Number(false) ); // 0
33
論理演算を行なったときに変換される。
34
Boolean(value)を利用する。 alert( Boolean(1) ); // true alert( Boolean(0) ); // false alert( Boolean("hello") ); // true alert( Boolean("") ); // false
35
0, 空文字, null, undefined や NaN のように直感的に “空” の値は false それ以外はtrue
36
0の文字列はtrue ちなみに 数値ならfalseになる。 スペースはtrue 空文字はfalse
37
文字列の’12’が出力される。 +演算子は足し算か文字列結合が判別できないので、文字列がある場合は、文字列結合として判断が優先されるため、型変換が行われる。 ちなみに+以外は数値に変換されて計算される。 alert( 6 - '2' ); // 4, '2' を数値に変換します alert( '6' / '2' ); // 3, 両方のオペランドを数値に変換します
38
左側から計算されるため、2たす2はそのまま足し算で計算され、1は文字結合される。 41 122になる。
39
+は単項演算子で、かける1するのと全く同じ意味。 つまり、trueは数値変換が行われ1になる。 つまりNumber(...) と同じですが、より短い表現です 以下のような書き方ができる。 // 二項演算子プラスの処理の前に、両方の値が数値に変換されます alert( +apples + +oranges ); // 5 // 長い書き方 // alert( Number(apples) + Number(oranges) ); // 5
40
演算子として扱われている。 JavaScript のすべての演算子は値を返却します。これは + や - では明らかですが、= の場合にも当てはまります。 x = value の呼び出しでは、value を x に書き込み、その値を返却します。
41
代入演算子ということで、 計算の途中で代入することができる。 以下の例では、計算の途中でaに代入している。 let a = 1; let b = 2; let c = 3 - (a = b + 1); b(2)と1を計算した後、aに格納、その後3-a(3)を行う。ということ。 他に代入をチェーンすることができる。 let a, b, c; a = b = c = 2 + 2; 2+2を行なってcに入れてそれをbに入れて。。みたいな感じ、なのでみんな4が入る。 ただ可読性がわるいので非推奨とのこと
42
counterの結果は、前置式と後置式どちらも違いはないが、 前置式を利用してそれを出力する際は、先に計算(プラス1)してから出力 let counter = 0; alert( ++counter ); // 1 alert( counter ); // 1 後置式を利用してそれを出力する際は、出力後に計算する let counter = 0; alert( counter++ ); // 0 alert( counter ); // 1 以下のような例は可読性が悪くなるので禁止 let counter = 1; alert( 2 * ++counter ); // 4 let counter = 1; alert( 2 * counter++ ); // 2, counter++ は "古い" 値を返すからです
43
AND ( & ) OR ( | ) XOR ( ^ ) NOT ( ~ ) LEFT SHIFT ( << ) RIGHT SHIFT ( >> ) ZERO-FILL RIGHT SHIFT ( >>> )
44
カンマ演算子を使うと複数の式を評価できます。それらの式はカンマ ',' で区切られています。それぞれが評価されますが、最後の結果のみが返却されます。 つまり結果は3+4の結果である7となる 1 + 2 の結果はどこかへ捨てられる。
45
1行で複数のアクションを書くことができる。 // 1行に3つの演算子 for (a = 1, b = 3, c = a * b; a < 10; a++) { ... } 補足 z = (x = 4, y = 8, y += x); console.log(z); >> 12 一番右のオペランドをかえす! カンマ演算子は for 文の初期化式や変化式で複数の式を記述する場合に主に使用します。 for (let i = 1, j = 4; i < 5; i++, j--){ console.log("i = " + i + ", j = " + j); } Iもjもインクリメント、デクリメントを実行させている。(複数アクション!
46
" -9 " + 5 = " -9 5" " -9 " - 5 = -14 null + 1 = 1 undefined + 1 = NaN " \t \n" - 2 = -2 ↑について 文字列の先頭/末尾のスペースは、文字列が数値に変換される際に削除されます。ここでは文字列全体が \t や \n、“通常” のスペース文字から構成されています。したがって、空文字列のときと同様、0 になります。
47
数値に変換されて評価される ちなみに、等価演算子の場合は数値優先で変換を行う 型が合わせれない場合はfalseとする
48
2は数値に変換され、true 01は数値に変換され、true ※数値は読めるなら変換可能
49
falseは数値だと0なのでtrue 空文字は数値だと0なのでtrue
50
===で厳密な判断 alert( 0 === false );// false
51
trueである。 nullやundifinedは等価の場合、数値に変換されず、この二つは等価としてシステムが判断している。 等価演算子の説明 両方のオペランドがオブジェクトである場合、同じオブジェクトを指している場合に限り true を返します。 一方のオペランドが null で、もう一方が undefined であった場合は true を返します。 オペランドの型が異なる場合は、比較前に同じ型に変換を試みます。 数値と文字列を比較する場合、文字列を数値に変換しようとします。 一方のオペランドが論理値である場合、その論理値のオペランドが true である場合は 1 に、 false である場合は +0 に変換します。 オペランドのうちの一方がオブジェクトで、もう一方が数値または文字列である場合は、そのオブジェクトの valueOf() および toString() メソッドを使用してプリミティブに変換を試みます。 nullやundefined は変換しません。
52
比較の場合は、nullは数値に変換されるが、等価は変換されないので、 1はfalse 2もfalse 3はtrue nullと0は等価でない!!
53
undefined も比較の場合は数値に変換される→NaNなのでそれが絡むとFalseとされる。 等価は変換されない。 なので全部false
54
厳密な等価 === 以外の比較演算子については、例外的な注意を払って undefined/null の比較を行ってください。 → undefined/null がくることもテストパターンの想定とすること。 本当に正しい場合でない限り、null/undefined かもしれない変数に対して比較 >= > < <= は使ってはいけません。変数がこのような値を持つ可能性がある場合は、それらを別々にチェックしてください →比較パターンで、nullやundefinedが起こりうるなら、条件を増やして別々のチェックを行うこと! 等価はnullやundefined がきたら変換しないのでもう一方のオペランドがちがうものならfalseになる 比較は数値に変換さるので、 nullの場合は0、undefinedの場合はNanになることを意識する if(3>null)なら0扱いなのでtrue if(3>undefined)ならNANになるので強制false←これは考慮すべき
55
どれも文字列同士の比較なので変換等はない。 文字列の比較は辞書順なので false true となる
56
できる。が可読性が悪いため非推奨 if (year == 2015) alert( 'You are right!' );
57
単純にtrueだった場合は右の結果を出力し、falseなら次の分岐へみたいな感じ。 if (age < 3) { message = 'Hi, baby!'; } else if (a < 18) { message = 'Hello!'; } else if (age < 100) { message = 'Greetings!'; } else { message = 'What an unusual age!'; } これの糖衣構文
58
短絡評価を行う。 つまり、最初のtrueを探す処理! 左から右にオペランドを評価します。 それぞれのオペランドで、それを Boolean に変換します。もしも結果が true であれば、停止しオペランドの本来の値を返します。 もしもすべての他のオペランドが評価された場合(i.e. すべて 偽 のとき), 最後のオペランドを返します。
59
1 真の値がかえる 0 全て偽なら最後の値がかえる
60
SuperCoderがかえる
61
trueがかえり、短絡評価なのでアラートは実施されない 条件の左側が false のときにだけコマンドを実行するためにこの特徴を利用する人もいます。 でも非推奨!
62
短絡評価で、最初のfalseを見つける処理 falseの値を返しなければ最後の値をかえす 左から右にオペランドを評価します。 それぞれのオペランドで、それを Boolean に変換します。もしも結果が false の場合、ストップしそのオペランドの本来の値を返します。 もしもすべての他のオペランドが評価された場合(i.e. すべて 真 のとき), 最後のオペランドを返します。
63
let x = 1; (x > 0) && alert( 'Greater than zero!' ); みたいにifの代わりにつかわない ||はないなら次の処理 &&はあるなら次の処理 みたいなかんじ 以下と同様 let x = 1; if (x > 0) alert( 'Greater than zero!' );
64
Booleanに変換され、逆の値がかえる alert( !0 ); // true
65
値を単に真偽値型に変換するために使われることがあります: alert( !!null ); はfalse alert( !!"non-empty string" ); // true
66
組み込みのBoolean関数を利用する alert( Boolean("non-empty string") ); // true alert( Boolean(null) ); // false
67
アラートは何も返さない。つまりundefinedがかえる。 1が表示され、2がtrueなので2が表示されておわり。
68
1とundefined
69
if (!(age >= 14 && age <= 90)) 前にNOTつけるとドモルガンの法則利用しなくてもよい if (age < 14 || age > 90)
70
&&が優先されるので -1 && 1は1 null || 1は1なのでtrue よって表示される
71
NULL合体演算子は2つの疑問符 ?? で記述されます これは null と undefined を同じように扱う 2つのオペランドのうちから、最初の “定義済み” の値を取得することができる。 a ?? b の結果は: a が (null あるいは undefined )でなければ a, それ以外の場合は b aが定義済みで有効な値(null undefined以外)であればa ちがったらb
72
|| は false, 0, 空文字 ""も含まれてしまう。 上記を省いてnullとundefined だけをチェックしたい場合は??がよい falseや0も判定されるのは確かに微妙
73
100 0
74
オペランドはi だけとしている。 0になるとfalseになるため。 ブロックがない。
75
つかえる let i = 0; do { alert( i ); i++; } while (i < 3);
76
begin ループに入ると1度実行されます。 condition すべてのループのイテレーションの前にチェックされます。条件が偽の場合、ループを停止します。 step 各イテレーションで、条件チェックの前に本体の後に実行されます。 つまり、begin を1度実行し、その後、各 condition の評価の後、body と step が実行されるという繰り返しになります
77
let i = 0; for (i = 0; i < 3; i++) { // 既存の変数を使用 alert(i); // 0, 1, 2 } インライン変数宣言 for (let i = 0; i < 3; i++) { alert(i); // 0, 1, 2 } begin 省略する let i = 0; // すでに i を宣言し代入済み for (; i < 3; i++) { // "begin" 不要 stepの省略 let i = 0; for (; i < 3;) { alert( i++ ); }
78
ラベル は、ループの前のコロンがついた識別子です ループ前以外には使用しない!! labelName: for (...) { ... } break labelname;で 一度に複数のネストしたループから抜け出すことが必要となる場合に利用される 例 outer: for (let i = 0; i < 3; i++) { for (let j = 0; j < 3; j++) { let input = prompt(`Value at coords (${i},${j})`, ''); // 文字から文字またはキャンセルされた場合、両方のループから抜ける if (!input) break outer; // (*) // 値に何かをする処理... } } alert('Done!');
79
continue ディレクティブもラベルと一緒に使うことができます。このケースでは、実行はラベル付けされたループの次のイテレーションにジャンプします。 つまり、内側ではなく外側のループの次の実行にいくということ!
80
厳密は等価判断が行われる if (x === 'value1')
81
caseはグルーピングできる let a = 2 + 2; switch (a) { case 4: alert('Right!'); break; case 3: // (*) 2つのケースをグループ化 case 5: alert('Wrong!'); alert("Why don't you take a math class?"); break; default: alert('The result is strange. Really.'); } ケースを “グループ化” する機能は、break がない場合の switch/case の動作の副作用です。ここで case 3 の実行は、break がないので (*) の行から始まり、case 5 を通り抜けます。
82
呼び出し可能 fromには値がコピーされてはいる。 textにはundefinedが入る
83
デフォルト値は以下のように定義する。 関数をデフォルト値として指定もできる! function showMessage(from, text = anotherFunction()) { // anotherFunction() はテキストが与えられなかった場合にのみ実行されます // その結果がtextの値になります } つまり、 片方しか指定して呼ばれない可能性がある場合は、デフォルト値を定義した方が良い
84
パターン1 ifを利用する function showMessage(text) { if (text === undefined) { text = 'empty message'; } alert(text); } showMessage(); // empty message パターン2 ||をつかう // パラメータが省略 or "" の場合, 'empty' を設定 function showMessage(text) { text = text || 'empty'; ... } これは空も判定する! パターン3 ??を使う function showCount(count) { alert(count ?? "unknown"); } これはnullとundefinedを判定する。
85
関数は短く明確に1つのことを行うべきです。もし関数が大きい場合、恐らくそれを幾つかの小さい関数に分けることは価値があるでしょう。 再利用よりも可読性をよくするために関数化できる。 関数はコメントともいえる。 function showPrimes(n) { nextPrime: for (let i = 2; i < n; i++) { // i が素数であるかをチェックする for (let j = 2; j < i; j++) { if (i % j == 0) continue nextPrime; } alert( i ); // a prime } } これは以下のようにわかりやすくできる。 // 2からnまで繰り返し処理する function showPrimes(n) { for (let i = 2; i < n; i++) { if (!isPrime(i)) continue; alert(i); // a prime } } // nが素数かどうか判断する関数 function isPrime(n) { for (let i = 2; i < n; i++) { if ( n % i == 0) return false; } return true; }
86
関数式と関数宣言という違いがある 関数式はセミコロンがいる。 どちらもsayHiに関数オブジェクトが束縛されてる点はおなじ 関数式は、実行がそれに到達した時に作られ、それ以降で利用可能になります。 関数宣言はスクリプト/コードブロック全体で使用できます。 こっちは大丈夫だけど sayHi("John"); function sayHi(name) { alert( `Hello, ${name}` ); } 関数式だとエラー sayHi("John"); // エラー! let sayHi = function(name) { // (*) no magic any more alert( `Hello, ${name}` ); };
87
アロー関数※1行ならreturnキーワードは不要! let sum = (a, b) => a + b; 引数が一つならカッコも省略できる let double = n => n * 2; 引数なしはこう let sayHi = () => alert("Hello!"); 複数行の処理内容をかくには波括弧をつける let sum = (a, b) => { let result = a + b; return result; // 波括弧を使う場合、明示的な return が必要です };
88
関数の文書化のための特別な構文 JSDoc があります。: 使用方法、パラメータ、返却値 例: /** * Returns x raised to the n-th power. * * @param {number} x The number to raise. * @param {number} n The power, must be a natural number. * @return {number} x raised to the n-th power. */ function pow(x, n) { ... }
89
トランスパイラ transpilerは、ソースコードを別のソースコードに変換する特別なソフトウェアです。最新のコードを解析し、古い構文を使って書き換えることで、古いエンジンでも動作するようにすることができます。 Polyfills 新しい言語の機能には、構文構造や演算子だけでなく組み込みの関数も含んでいる可能性があります。 例えば、Math.trunc(n) は数値の小数部分を “切り取る” 関数で、例えば Math.trunc(1.23) = 1 となります。 (非常に古い) JavaScript エンジンでは、Math.trunc は存在しないためこのようなコードは失敗します。 構文変更ではなく、新しい関数について話しているので、ここではトランスパイルは必要ありません。単に不足している関数を定義する必要があります。 新しい機能を更新/追加するスクリプトは “polyfill” と呼ばれます。ギャップを “埋め”、不足している実装を追加します
90
できる。 Function A(){ return ‘a’; } A(); // a A(this); // a
91
argumentsプロパティを利用すると渡された情報を確認できる function MyFunc (){ var num = arguments.length; var i; for(i=0;i < num;i++){ // 引数から渡されたデータを取得する var data = arguments[i]; console.log("id:" + i + " data:" + data); } }
92
変数は宣言されてないとつかえないので、未定義ならエラー。 プロパティは未定義ならundefined
その他
その他
谷峻輔 · 12問 · 2年前その他
その他
12問 • 2年前LWC
LWC
谷峻輔 · 100問 · 2年前LWC
LWC
100問 • 2年前LWC2
LWC2
谷峻輔 · 28問 · 2年前LWC2
LWC2
28問 • 2年前Javascript
Javascript
谷峻輔 · 100問 · 2年前Javascript
Javascript
100問 • 2年前javascript2
javascript2
谷峻輔 · 58問 · 2年前javascript2
javascript2
58問 • 2年前js2 コード品質、オブジェクト基本、データ型
js2 コード品質、オブジェクト基本、データ型
谷峻輔 · 100問 · 2年前js2 コード品質、オブジェクト基本、データ型
js2 コード品質、オブジェクト基本、データ型
100問 • 2年前js3 データ型
js3 データ型
谷峻輔 · 100問 · 2年前js3 データ型
js3 データ型
100問 • 2年前js4 データ型、関数の高度な機能
js4 データ型、関数の高度な機能
谷峻輔 · 100問 · 2年前js4 データ型、関数の高度な機能
js4 データ型、関数の高度な機能
100問 • 2年前js5 関数の高度な機能 オブジェクトプロパティの設定 プロトタイプ, 継承プロトタイプ, 継承、クラス
js5 関数の高度な機能 オブジェクトプロパティの設定 プロトタイプ, 継承プロトタイプ, 継承、クラス
谷峻輔 · 96問 · 2年前js5 関数の高度な機能 オブジェクトプロパティの設定 プロトタイプ, 継承プロトタイプ, 継承、クラス
js5 関数の高度な機能 オブジェクトプロパティの設定 プロトタイプ, 継承プロトタイプ, 継承、クラス
96問 • 2年前js6 クラス Promise, async/await
js6 クラス Promise, async/await
谷峻輔 · 100問 · 2年前js6 クラス Promise, async/await
js6 クラス Promise, async/await
100問 • 2年前js7 Promise, async/await、ジェネレータ, 高度なイテレーション、モジュール
js7 Promise, async/await、ジェネレータ, 高度なイテレーション、モジュール
谷峻輔 · 96問 · 2年前js7 Promise, async/await、ジェネレータ, 高度なイテレーション、モジュール
js7 Promise, async/await、ジェネレータ, 高度なイテレーション、モジュール
96問 • 2年前js8 その他
js8 その他
谷峻輔 · 57問 · 2年前js8 その他
js8 その他
57問 • 2年前Javaとは〜
Javaとは〜
谷峻輔 · 83問 · 2年前Javaとは〜
Javaとは〜
83問 • 2年前Reactクイックスタート
Reactクイックスタート
谷峻輔 · 15問 · 2年前Reactクイックスタート
Reactクイックスタート
15問 • 2年前デザインパターン
デザインパターン
谷峻輔 · 5問 · 2年前デザインパターン
デザインパターン
5問 • 2年前承認申請
承認申請
谷峻輔 · 16問 · 2年前承認申請
承認申請
16問 • 2年前アプリケーションビルダー2
アプリケーションビルダー2
谷峻輔 · 100問 · 2年前アプリケーションビルダー2
アプリケーションビルダー2
100問 • 2年前アプリケーションビルダー3
アプリケーションビルダー3
谷峻輔 · 100問 · 2年前アプリケーションビルダー3
アプリケーションビルダー3
100問 • 2年前アプリケーションビルダー4
アプリケーションビルダー4
谷峻輔 · 100問 · 2年前アプリケーションビルダー4
アプリケーションビルダー4
100問 • 2年前アプリケーションビルダー5
アプリケーションビルダー5
谷峻輔 · 94問 · 2年前アプリケーションビルダー5
アプリケーションビルダー5
94問 • 2年前アプリケーションビルダー6
アプリケーションビルダー6
谷峻輔 · 100問 · 2年前アプリケーションビルダー6
アプリケーションビルダー6
100問 • 2年前アプリケーションビルダー7
アプリケーションビルダー7
谷峻輔 · 100問 · 2年前アプリケーションビルダー7
アプリケーションビルダー7
100問 • 2年前アプリケーションビルダー8
アプリケーションビルダー8
谷峻輔 · 98問 · 2年前アプリケーションビルダー8
アプリケーションビルダー8
98問 • 2年前アプリケーションビルダー9
アプリケーションビルダー9
谷峻輔 · 70問 · 2年前アプリケーションビルダー9
アプリケーションビルダー9
70問 • 2年前フロー
フロー
谷峻輔 · 42問 · 2年前フロー
フロー
42問 • 2年前レポート、ダッシュボード
レポート、ダッシュボード
谷峻輔 · 60問 · 2年前レポート、ダッシュボード
レポート、ダッシュボード
60問 • 2年前SalesCloud
SalesCloud
谷峻輔 · 18問 · 2年前SalesCloud
SalesCloud
18問 • 2年前標準機能
標準機能
谷峻輔 · 72問 · 2年前標準機能
標準機能
72問 • 2年前宣言的開発
宣言的開発
谷峻輔 · 8問 · 2年前宣言的開発
宣言的開発
8問 • 2年前数式、人力規則
数式、人力規則
谷峻輔 · 18問 · 2年前数式、人力規則
数式、人力規則
18問 • 2年前アクセスレベル
アクセスレベル
谷峻輔 · 63問 · 2年前アクセスレベル
アクセスレベル
63問 • 2年前データ型変換
データ型変換
谷峻輔 · 22問 · 2年前データ型変換
データ型変換
22問 • 2年前オブジェクト、項目
オブジェクト、項目
谷峻輔 · 91問 · 2年前オブジェクト、項目
オブジェクト、項目
91問 • 2年前アプリ、タブ
アプリ、タブ
谷峻輔 · 92問 · 2年前アプリ、タブ
アプリ、タブ
92問 • 2年前自動化
自動化
谷峻輔 · 17問 · 2年前自動化
自動化
17問 • 2年前組織、開発モデル
組織、開発モデル
谷峻輔 · 65問 · 2年前組織、開発モデル
組織、開発モデル
65問 • 2年前ボタン、アクション
ボタン、アクション
谷峻輔 · 69問 · 2年前ボタン、アクション
ボタン、アクション
69問 • 2年前インテグレーション
インテグレーション
谷峻輔 · 40問 · 2年前インテグレーション
インテグレーション
40問 • 2年前ページレイアウト、リストビュー、レコードタイプ、プロセス
ページレイアウト、リストビュー、レコードタイプ、プロセス
谷峻輔 · 46問 · 2年前ページレイアウト、リストビュー、レコードタイプ、プロセス
ページレイアウト、リストビュー、レコードタイプ、プロセス
46問 • 2年前標準オブジェクト
標準オブジェクト
谷峻輔 · 42問 · 2年前標準オブジェクト
標準オブジェクト
42問 • 2年前ServiceCloud
ServiceCloud
谷峻輔 · 16問 · 2年前ServiceCloud
ServiceCloud
16問 • 2年前ユーザ、ライセンス、プロファイル、権限セット
ユーザ、ライセンス、プロファイル、権限セット
谷峻輔 · 41問 · 2年前ユーザ、ライセンス、プロファイル、権限セット
ユーザ、ライセンス、プロファイル、権限セット
41問 • 2年前データインポート、エクスポート
データインポート、エクスポート
谷峻輔 · 3回閲覧 · 12問 · 2年前データインポート、エクスポート
データインポート、エクスポート
3回閲覧 • 12問 • 2年前Chatter
Chatter
谷峻輔 · 21問 · 2年前Chatter
Chatter
21問 • 2年前承認申請
承認申請
谷峻輔 · 15問 · 2年前承認申請
承認申請
15問 • 2年前フロー
フロー
谷峻輔 · 44問 · 2年前フロー
フロー
44問 • 2年前レポート、ダッシュボード
レポート、ダッシュボード
谷峻輔 · 65問 · 2年前レポート、ダッシュボード
レポート、ダッシュボード
65問 • 2年前SalesCloud
SalesCloud
谷峻輔 · 18問 · 2年前SalesCloud
SalesCloud
18問 • 2年前標準機能
標準機能
谷峻輔 · 72問 · 2年前標準機能
標準機能
72問 • 2年前宣言的開発
宣言的開発
谷峻輔 · 8問 · 2年前宣言的開発
宣言的開発
8問 • 2年前アクセスレベル
アクセスレベル
谷峻輔 · 52問 · 2年前アクセスレベル
アクセスレベル
52問 • 2年前数式、人力規則
数式、人力規則
谷峻輔 · 17問 · 2年前数式、人力規則
数式、人力規則
17問 • 2年前データ型変換
データ型変換
谷峻輔 · 22問 · 2年前データ型変換
データ型変換
22問 • 2年前オブジェクト、項目
オブジェクト、項目
谷峻輔 · 89問 · 2年前オブジェクト、項目
オブジェクト、項目
89問 • 2年前アプリ、タブ
アプリ、タブ
谷峻輔 · 100問 · 2年前アプリ、タブ
アプリ、タブ
100問 • 2年前自動化
自動化
谷峻輔 · 18問 · 2年前自動化
自動化
18問 • 2年前組織、開発モデル
組織、開発モデル
谷峻輔 · 60問 · 2年前組織、開発モデル
組織、開発モデル
60問 • 2年前ボタン、アクション
ボタン、アクション
谷峻輔 · 69問 · 2年前ボタン、アクション
ボタン、アクション
69問 • 2年前インテグレーション
インテグレーション
谷峻輔 · 40問 · 2年前インテグレーション
インテグレーション
40問 • 2年前ページレイアウト、リストビュー、レコードタイプ、プロセス
ページレイアウト、リストビュー、レコードタイプ、プロセス
谷峻輔 · 44問 · 2年前ページレイアウト、リストビュー、レコードタイプ、プロセス
ページレイアウト、リストビュー、レコードタイプ、プロセス
44問 • 2年前標準オブジェクト
標準オブジェクト
谷峻輔 · 32問 · 2年前標準オブジェクト
標準オブジェクト
32問 • 2年前ServiceCloud
ServiceCloud
谷峻輔 · 17問 · 2年前ServiceCloud
ServiceCloud
17問 • 2年前ユーザ、ライセンス、プロファイル、権限セット
ユーザ、ライセンス、プロファイル、権限セット
谷峻輔 · 18問 · 2年前ユーザ、ライセンス、プロファイル、権限セット
ユーザ、ライセンス、プロファイル、権限セット
18問 • 2年前データインポート、エクスポート
データインポート、エクスポート
谷峻輔 · 11問 · 2年前データインポート、エクスポート
データインポート、エクスポート
11問 • 2年前Chatter
Chatter
谷峻輔 · 21問 · 2年前Chatter
Chatter
21問 • 2年前一時
一時
谷峻輔 · 89問 · 2年前一時
一時
89問 • 2年前一時2
一時2
谷峻輔 · 29問 · 2年前一時2
一時2
29問 • 2年前js9 ドキュメント
js9 ドキュメント
谷峻輔 · 80問 · 2年前js9 ドキュメント
js9 ドキュメント
80問 • 2年前問題一覧
1
できない。 Webページ上のJavaScriptは、ハードディスク上の任意のファイルの読み書きや、それらのコピー、プログラムの実行をすることができません。OSのシステム機能に直接アクセスすることはできません。
2
基本はできない設計となっているが、 両方のページ にデータ交換を行うための特別なJavaScriptコードを含めれば可能。 また上記を実施しないでも、同一オリジンであれば、可能。 以下抜粋 異なるタブやウィンドウは一般的にお互いについて知りません。時々、例えばあるウィンドウがJavaScriptを利用して別のウィンドウを開くケースはあります。しかし、この場合においても、あるページからのJavaScriptは、別のサイト(異なるドメイン、プロトコル、ポート)からのものである場合は、アクセスすることはできません。 これは “Same Origin Policy” と呼ばれています。回避するためには、 両方のページ にデータ交換を行うための特別なJavaScriptコードを含める必要があります。 この制限もユーザの安全のためです。ユーザが開いた http://anysite.com というサイトのページは、URL http://gmail.com の別のブラウザのタブにアクセスし、そこから情報を盗むことはできません。
3
同一オリジンポリシーによってアクセスできない。 回避するためには、 両方のページ にデータ交換を行うための特別なJavaScriptコードを含める必要があります。
4
ブラウザがこのタグを見つけたときに自動的に実行される ボディ読み込んだあとでpタグのあと
5
src属性を指定する。 現在のページからの相対パスで指定する <script src="/path/to/script.js"></script> 完全なURLも同様に可能 <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.2.0/lodash.js"></script>
6
最もシンプルなスクリプトだけをHTML内に置きます。より複雑なものは別のファイルに置きます。 例 <script src="file.js"></script> <script> alert(1); </script これはだめ <script src="file.js"> alert(1); // src が設定されているので、このコンテンツは無視されます。 </script>
7
ダウンロードしたjsファイルはキャッシュ化されるため、他のページで同じjsファイルを利用する際にダウンロードの節約となる。 以下抜粋 ファイル分割のメリットは、ブラウザがダウンロードしてそれをブラウザのキャッシュに保存するためです。 以降、同じスクリプトが必要な他のページは、ダウンロードする代わりにキャッシュから取得します。そのため、ファイルは実際には一度だけダウンロードされます。 これはネットワーク通信量を節約しページをより速くします。
8
書いてあるやつもあるけどいらない。 スクリプトの言語を type="text/javascript" のような MIMEタイプで指定します。HTML4.01では必須の属性として定義されていましたが、HTML5 では省略時は type="text/javascript" とみなされるようになりました。
9
一応うごく 勝手にセミコロンつけてくれる。 だけど非推奨
10
スラッシュ二つか、スラッシュアスタリスクで囲む // この行全体がコメントになります。 alert('Hello'); /* 2つのメッセージを含む例。 これは複数行のコメントです。 */ alert('Hello'); ちなみに ほとんどのエディタでは、コードの行は1行コメントとして Ctrl+/ ホットキーによりコメントアウトすることができます。そして Ctrl+Shift+/ で複数行コメントです(コードの一部を選択し、ホットキーを押します)。
11
これがスクリプトの先頭に位置する場合、すべてのスクリプトは “最新の” 方法で動作します。 "use strict"; // このコードはモダンな方法で動作します。 ... 常に "use strict" で始まるスクリプトは推奨されます
12
カンマでくぎれば、letは省略可能 let user = 'John', age = 25, message = 'Hello';
13
"use strict"; がなければ動くが非推奨である。
14
const const myBirthday = '18.04.1982';
15
値の再代入が禁止される。 ※値の変更はできる const myBirthday = '18.04.1982'; myBirthday = '01.01.2001'; // エラー, 定数の再代入はできません!
16
大文字の定数は、実行する前から値が変わらないものをハードコートしたもの。 小文字の定数は、 実行中にランタイムで 計算 されますが、代入後は変更されないもの。 const BIRTHDAY = '18.04.1982'; // make uppercase? const age = someCode(BIRTHDAY); // make uppercase
17
基本はconst letは再代入が想定されるものに利用する。 varは現在の実行コンテキスト(モジュールorグローバル) もしくはレキシカル環境に直ぐロードさせたい場合 または、ブロックスコープの外でもみえるような変数を定義したい場合(非推奨) var で宣言された変数のスコープは、その現在の実行コンテキストとそのクロージャであり、その中で宣言された関数、あるいは関数の外で宣言された変数の場合はグローバルになります
18
Infinity、 -Infinity、 NaN Infinity は数学的な無限大 ∞ を表します。どの値よりも大きい特別な値です 0除算で得ることができる。 alert( 1 / 0 ); ベタ書きもできる。 alert( Infinity ); NaN は計算上のエラーを表します。 alert( "not a number" / 2 );
19
BigInt型 末尾の "n" は BigInt を意味します const bigInt = 1234567890123456789012345678901234567890n;
20
バッククォートを利用した引用符のことで、変数を ${…} の中にラップすることで、変数を埋め込み文字列の中で表現することができる。 let name = "John"; // 変数が埋め込まれた場合 alert( `Hello, ${name}!` ); // Hello, John! // 式が埋め込まれた場合 alert( `the result is ${1 + 2}` ); // 結果は 3
21
null は “無し”、“空” または “不明な値” と言った意味を持つ特別な値です undefined は値が代入されていないことを示す。宣言されているが値がない変数とか 存在しないプロパティはそうなる。 一般的には、 “空” や “不明な値” と言った用途では null を使い、undefined は変数が割り当てられているか、もしくは似たような確認のために使います。 ちなみにnullはリテラルで、undefined は変数 undefined 変数が上書きされてる懸念ありなので、void 0を使う
22
typeofを利用する 。 二つのパターンがある。 演算子として: typeof x. 関数スタイル: typeof(x). 例 typeof undefined // "undefined" typeof 0 // "number" typeof 10n // "bigint" typeof true // "boolean" typeof "foo" // "string" typeof Symbol("id") // "symbol" typeof Math // "object" typeof null // "object" これは 公式に認められたエラーらしい。 typeof alert // "function"
23
alert("Hello");
24
promptを使う 戻り値は入力された値、 入力がキャンセルされた場合には null が返却されます。 例 let age = prompt('How old are you?', 100); 第一引数は出力メッセージで、第二引数は任意で、デフォルト値
25
confirm 関数をつかう。 戻り値はBoolean let isBoss = confirm("Are you the boss?");
26
ある関数、演算子などで、期待される型でないものが入力された場合、暗黙的に型変換が行われること。
27
文字列変換は、文字列形式の値が必要なときに発生します。 たとえば、alert(value) は値を表示するためにそれを行います。
28
String(value) 関数が実行されている。 let value = true; alert(typeof value); // boolean value = String(value); // 今、値は文字列の "true" alert(typeof value); // string
29
数値変換は数学的関数や表現の中で自動的に起こります。例えば除算などの演算子を使った時で "6" / "2" は数値の3が出力される。
30
Number(value) let str = "123"; alert(typeof str); // string let num = Number(str); // 数値の 123 になります alert(typeof num); // number
31
文字列が有効な数値でない場合、このような変換の結果は NaN です。
32
undefined は NaN nullは 0 true と false は 1 and 0 string は トリムされて空なら0 数値の文字ならそのまま変換 変換できない文字ならNaN alert( Number(" 123 ") ); // 123 alert( Number("123z") ); // NaN ("z" の読み込みでエラー) alert( Number(true) ); // 1 alert( Number(false) ); // 0
33
論理演算を行なったときに変換される。
34
Boolean(value)を利用する。 alert( Boolean(1) ); // true alert( Boolean(0) ); // false alert( Boolean("hello") ); // true alert( Boolean("") ); // false
35
0, 空文字, null, undefined や NaN のように直感的に “空” の値は false それ以外はtrue
36
0の文字列はtrue ちなみに 数値ならfalseになる。 スペースはtrue 空文字はfalse
37
文字列の’12’が出力される。 +演算子は足し算か文字列結合が判別できないので、文字列がある場合は、文字列結合として判断が優先されるため、型変換が行われる。 ちなみに+以外は数値に変換されて計算される。 alert( 6 - '2' ); // 4, '2' を数値に変換します alert( '6' / '2' ); // 3, 両方のオペランドを数値に変換します
38
左側から計算されるため、2たす2はそのまま足し算で計算され、1は文字結合される。 41 122になる。
39
+は単項演算子で、かける1するのと全く同じ意味。 つまり、trueは数値変換が行われ1になる。 つまりNumber(...) と同じですが、より短い表現です 以下のような書き方ができる。 // 二項演算子プラスの処理の前に、両方の値が数値に変換されます alert( +apples + +oranges ); // 5 // 長い書き方 // alert( Number(apples) + Number(oranges) ); // 5
40
演算子として扱われている。 JavaScript のすべての演算子は値を返却します。これは + や - では明らかですが、= の場合にも当てはまります。 x = value の呼び出しでは、value を x に書き込み、その値を返却します。
41
代入演算子ということで、 計算の途中で代入することができる。 以下の例では、計算の途中でaに代入している。 let a = 1; let b = 2; let c = 3 - (a = b + 1); b(2)と1を計算した後、aに格納、その後3-a(3)を行う。ということ。 他に代入をチェーンすることができる。 let a, b, c; a = b = c = 2 + 2; 2+2を行なってcに入れてそれをbに入れて。。みたいな感じ、なのでみんな4が入る。 ただ可読性がわるいので非推奨とのこと
42
counterの結果は、前置式と後置式どちらも違いはないが、 前置式を利用してそれを出力する際は、先に計算(プラス1)してから出力 let counter = 0; alert( ++counter ); // 1 alert( counter ); // 1 後置式を利用してそれを出力する際は、出力後に計算する let counter = 0; alert( counter++ ); // 0 alert( counter ); // 1 以下のような例は可読性が悪くなるので禁止 let counter = 1; alert( 2 * ++counter ); // 4 let counter = 1; alert( 2 * counter++ ); // 2, counter++ は "古い" 値を返すからです
43
AND ( & ) OR ( | ) XOR ( ^ ) NOT ( ~ ) LEFT SHIFT ( << ) RIGHT SHIFT ( >> ) ZERO-FILL RIGHT SHIFT ( >>> )
44
カンマ演算子を使うと複数の式を評価できます。それらの式はカンマ ',' で区切られています。それぞれが評価されますが、最後の結果のみが返却されます。 つまり結果は3+4の結果である7となる 1 + 2 の結果はどこかへ捨てられる。
45
1行で複数のアクションを書くことができる。 // 1行に3つの演算子 for (a = 1, b = 3, c = a * b; a < 10; a++) { ... } 補足 z = (x = 4, y = 8, y += x); console.log(z); >> 12 一番右のオペランドをかえす! カンマ演算子は for 文の初期化式や変化式で複数の式を記述する場合に主に使用します。 for (let i = 1, j = 4; i < 5; i++, j--){ console.log("i = " + i + ", j = " + j); } Iもjもインクリメント、デクリメントを実行させている。(複数アクション!
46
" -9 " + 5 = " -9 5" " -9 " - 5 = -14 null + 1 = 1 undefined + 1 = NaN " \t \n" - 2 = -2 ↑について 文字列の先頭/末尾のスペースは、文字列が数値に変換される際に削除されます。ここでは文字列全体が \t や \n、“通常” のスペース文字から構成されています。したがって、空文字列のときと同様、0 になります。
47
数値に変換されて評価される ちなみに、等価演算子の場合は数値優先で変換を行う 型が合わせれない場合はfalseとする
48
2は数値に変換され、true 01は数値に変換され、true ※数値は読めるなら変換可能
49
falseは数値だと0なのでtrue 空文字は数値だと0なのでtrue
50
===で厳密な判断 alert( 0 === false );// false
51
trueである。 nullやundifinedは等価の場合、数値に変換されず、この二つは等価としてシステムが判断している。 等価演算子の説明 両方のオペランドがオブジェクトである場合、同じオブジェクトを指している場合に限り true を返します。 一方のオペランドが null で、もう一方が undefined であった場合は true を返します。 オペランドの型が異なる場合は、比較前に同じ型に変換を試みます。 数値と文字列を比較する場合、文字列を数値に変換しようとします。 一方のオペランドが論理値である場合、その論理値のオペランドが true である場合は 1 に、 false である場合は +0 に変換します。 オペランドのうちの一方がオブジェクトで、もう一方が数値または文字列である場合は、そのオブジェクトの valueOf() および toString() メソッドを使用してプリミティブに変換を試みます。 nullやundefined は変換しません。
52
比較の場合は、nullは数値に変換されるが、等価は変換されないので、 1はfalse 2もfalse 3はtrue nullと0は等価でない!!
53
undefined も比較の場合は数値に変換される→NaNなのでそれが絡むとFalseとされる。 等価は変換されない。 なので全部false
54
厳密な等価 === 以外の比較演算子については、例外的な注意を払って undefined/null の比較を行ってください。 → undefined/null がくることもテストパターンの想定とすること。 本当に正しい場合でない限り、null/undefined かもしれない変数に対して比較 >= > < <= は使ってはいけません。変数がこのような値を持つ可能性がある場合は、それらを別々にチェックしてください →比較パターンで、nullやundefinedが起こりうるなら、条件を増やして別々のチェックを行うこと! 等価はnullやundefined がきたら変換しないのでもう一方のオペランドがちがうものならfalseになる 比較は数値に変換さるので、 nullの場合は0、undefinedの場合はNanになることを意識する if(3>null)なら0扱いなのでtrue if(3>undefined)ならNANになるので強制false←これは考慮すべき
55
どれも文字列同士の比較なので変換等はない。 文字列の比較は辞書順なので false true となる
56
できる。が可読性が悪いため非推奨 if (year == 2015) alert( 'You are right!' );
57
単純にtrueだった場合は右の結果を出力し、falseなら次の分岐へみたいな感じ。 if (age < 3) { message = 'Hi, baby!'; } else if (a < 18) { message = 'Hello!'; } else if (age < 100) { message = 'Greetings!'; } else { message = 'What an unusual age!'; } これの糖衣構文
58
短絡評価を行う。 つまり、最初のtrueを探す処理! 左から右にオペランドを評価します。 それぞれのオペランドで、それを Boolean に変換します。もしも結果が true であれば、停止しオペランドの本来の値を返します。 もしもすべての他のオペランドが評価された場合(i.e. すべて 偽 のとき), 最後のオペランドを返します。
59
1 真の値がかえる 0 全て偽なら最後の値がかえる
60
SuperCoderがかえる
61
trueがかえり、短絡評価なのでアラートは実施されない 条件の左側が false のときにだけコマンドを実行するためにこの特徴を利用する人もいます。 でも非推奨!
62
短絡評価で、最初のfalseを見つける処理 falseの値を返しなければ最後の値をかえす 左から右にオペランドを評価します。 それぞれのオペランドで、それを Boolean に変換します。もしも結果が false の場合、ストップしそのオペランドの本来の値を返します。 もしもすべての他のオペランドが評価された場合(i.e. すべて 真 のとき), 最後のオペランドを返します。
63
let x = 1; (x > 0) && alert( 'Greater than zero!' ); みたいにifの代わりにつかわない ||はないなら次の処理 &&はあるなら次の処理 みたいなかんじ 以下と同様 let x = 1; if (x > 0) alert( 'Greater than zero!' );
64
Booleanに変換され、逆の値がかえる alert( !0 ); // true
65
値を単に真偽値型に変換するために使われることがあります: alert( !!null ); はfalse alert( !!"non-empty string" ); // true
66
組み込みのBoolean関数を利用する alert( Boolean("non-empty string") ); // true alert( Boolean(null) ); // false
67
アラートは何も返さない。つまりundefinedがかえる。 1が表示され、2がtrueなので2が表示されておわり。
68
1とundefined
69
if (!(age >= 14 && age <= 90)) 前にNOTつけるとドモルガンの法則利用しなくてもよい if (age < 14 || age > 90)
70
&&が優先されるので -1 && 1は1 null || 1は1なのでtrue よって表示される
71
NULL合体演算子は2つの疑問符 ?? で記述されます これは null と undefined を同じように扱う 2つのオペランドのうちから、最初の “定義済み” の値を取得することができる。 a ?? b の結果は: a が (null あるいは undefined )でなければ a, それ以外の場合は b aが定義済みで有効な値(null undefined以外)であればa ちがったらb
72
|| は false, 0, 空文字 ""も含まれてしまう。 上記を省いてnullとundefined だけをチェックしたい場合は??がよい falseや0も判定されるのは確かに微妙
73
100 0
74
オペランドはi だけとしている。 0になるとfalseになるため。 ブロックがない。
75
つかえる let i = 0; do { alert( i ); i++; } while (i < 3);
76
begin ループに入ると1度実行されます。 condition すべてのループのイテレーションの前にチェックされます。条件が偽の場合、ループを停止します。 step 各イテレーションで、条件チェックの前に本体の後に実行されます。 つまり、begin を1度実行し、その後、各 condition の評価の後、body と step が実行されるという繰り返しになります
77
let i = 0; for (i = 0; i < 3; i++) { // 既存の変数を使用 alert(i); // 0, 1, 2 } インライン変数宣言 for (let i = 0; i < 3; i++) { alert(i); // 0, 1, 2 } begin 省略する let i = 0; // すでに i を宣言し代入済み for (; i < 3; i++) { // "begin" 不要 stepの省略 let i = 0; for (; i < 3;) { alert( i++ ); }
78
ラベル は、ループの前のコロンがついた識別子です ループ前以外には使用しない!! labelName: for (...) { ... } break labelname;で 一度に複数のネストしたループから抜け出すことが必要となる場合に利用される 例 outer: for (let i = 0; i < 3; i++) { for (let j = 0; j < 3; j++) { let input = prompt(`Value at coords (${i},${j})`, ''); // 文字から文字またはキャンセルされた場合、両方のループから抜ける if (!input) break outer; // (*) // 値に何かをする処理... } } alert('Done!');
79
continue ディレクティブもラベルと一緒に使うことができます。このケースでは、実行はラベル付けされたループの次のイテレーションにジャンプします。 つまり、内側ではなく外側のループの次の実行にいくということ!
80
厳密は等価判断が行われる if (x === 'value1')
81
caseはグルーピングできる let a = 2 + 2; switch (a) { case 4: alert('Right!'); break; case 3: // (*) 2つのケースをグループ化 case 5: alert('Wrong!'); alert("Why don't you take a math class?"); break; default: alert('The result is strange. Really.'); } ケースを “グループ化” する機能は、break がない場合の switch/case の動作の副作用です。ここで case 3 の実行は、break がないので (*) の行から始まり、case 5 を通り抜けます。
82
呼び出し可能 fromには値がコピーされてはいる。 textにはundefinedが入る
83
デフォルト値は以下のように定義する。 関数をデフォルト値として指定もできる! function showMessage(from, text = anotherFunction()) { // anotherFunction() はテキストが与えられなかった場合にのみ実行されます // その結果がtextの値になります } つまり、 片方しか指定して呼ばれない可能性がある場合は、デフォルト値を定義した方が良い
84
パターン1 ifを利用する function showMessage(text) { if (text === undefined) { text = 'empty message'; } alert(text); } showMessage(); // empty message パターン2 ||をつかう // パラメータが省略 or "" の場合, 'empty' を設定 function showMessage(text) { text = text || 'empty'; ... } これは空も判定する! パターン3 ??を使う function showCount(count) { alert(count ?? "unknown"); } これはnullとundefinedを判定する。
85
関数は短く明確に1つのことを行うべきです。もし関数が大きい場合、恐らくそれを幾つかの小さい関数に分けることは価値があるでしょう。 再利用よりも可読性をよくするために関数化できる。 関数はコメントともいえる。 function showPrimes(n) { nextPrime: for (let i = 2; i < n; i++) { // i が素数であるかをチェックする for (let j = 2; j < i; j++) { if (i % j == 0) continue nextPrime; } alert( i ); // a prime } } これは以下のようにわかりやすくできる。 // 2からnまで繰り返し処理する function showPrimes(n) { for (let i = 2; i < n; i++) { if (!isPrime(i)) continue; alert(i); // a prime } } // nが素数かどうか判断する関数 function isPrime(n) { for (let i = 2; i < n; i++) { if ( n % i == 0) return false; } return true; }
86
関数式と関数宣言という違いがある 関数式はセミコロンがいる。 どちらもsayHiに関数オブジェクトが束縛されてる点はおなじ 関数式は、実行がそれに到達した時に作られ、それ以降で利用可能になります。 関数宣言はスクリプト/コードブロック全体で使用できます。 こっちは大丈夫だけど sayHi("John"); function sayHi(name) { alert( `Hello, ${name}` ); } 関数式だとエラー sayHi("John"); // エラー! let sayHi = function(name) { // (*) no magic any more alert( `Hello, ${name}` ); };
87
アロー関数※1行ならreturnキーワードは不要! let sum = (a, b) => a + b; 引数が一つならカッコも省略できる let double = n => n * 2; 引数なしはこう let sayHi = () => alert("Hello!"); 複数行の処理内容をかくには波括弧をつける let sum = (a, b) => { let result = a + b; return result; // 波括弧を使う場合、明示的な return が必要です };
88
関数の文書化のための特別な構文 JSDoc があります。: 使用方法、パラメータ、返却値 例: /** * Returns x raised to the n-th power. * * @param {number} x The number to raise. * @param {number} n The power, must be a natural number. * @return {number} x raised to the n-th power. */ function pow(x, n) { ... }
89
トランスパイラ transpilerは、ソースコードを別のソースコードに変換する特別なソフトウェアです。最新のコードを解析し、古い構文を使って書き換えることで、古いエンジンでも動作するようにすることができます。 Polyfills 新しい言語の機能には、構文構造や演算子だけでなく組み込みの関数も含んでいる可能性があります。 例えば、Math.trunc(n) は数値の小数部分を “切り取る” 関数で、例えば Math.trunc(1.23) = 1 となります。 (非常に古い) JavaScript エンジンでは、Math.trunc は存在しないためこのようなコードは失敗します。 構文変更ではなく、新しい関数について話しているので、ここではトランスパイルは必要ありません。単に不足している関数を定義する必要があります。 新しい機能を更新/追加するスクリプトは “polyfill” と呼ばれます。ギャップを “埋め”、不足している実装を追加します
90
できる。 Function A(){ return ‘a’; } A(); // a A(this); // a
91
argumentsプロパティを利用すると渡された情報を確認できる function MyFunc (){ var num = arguments.length; var i; for(i=0;i < num;i++){ // 引数から渡されたデータを取得する var data = arguments[i]; console.log("id:" + i + " data:" + data); } }
92
変数は宣言されてないとつかえないので、未定義ならエラー。 プロパティは未定義ならundefined