回答編集履歴
3
markdown修正
answer
CHANGED
@@ -83,7 +83,7 @@
|
|
83
83
|
- [function - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/function)
|
84
84
|
- [スプレッド演算子 - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Spread_operator)
|
85
85
|
|
86
|
-
正しくは「関数宣言(FunctionDeclaration)」であり、「スプレッド要素(SpreadElement)」です。
|
86
|
+
正しくは「**関数宣言(FunctionDeclaration)**」であり、「**スプレッド要素(SpreadElement)**」です。
|
87
87
|
|
88
88
|
- [14.1 Function Definitions - ECMAScript® 2017 Language Specification](http://www.ecma-international.org/ecma-262/8.0/#sec-function-definitions)
|
89
89
|
- [12.2.5 Array Initializer - ECMAScript® 2017 Language Specification](http://www.ecma-international.org/ecma-262/8.0/#sec-array-initializer)
|
2
表現の微修正
answer
CHANGED
@@ -83,10 +83,10 @@
|
|
83
83
|
- [function - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/function)
|
84
84
|
- [スプレッド演算子 - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Spread_operator)
|
85
85
|
|
86
|
-
正しくは「
|
86
|
+
正しくは「関数宣言(FunctionDeclaration)」であり、「スプレッド要素(SpreadElement)」です。
|
87
87
|
|
88
88
|
- [14.1 Function Definitions - ECMAScript® 2017 Language Specification](http://www.ecma-international.org/ecma-262/8.0/#sec-function-definitions)
|
89
|
-
- [12.2.5 Array Initializer](http://www.ecma-international.org/ecma-262/8.0/#sec-array-initializer)
|
89
|
+
- [12.2.5 Array Initializer - ECMAScript® 2017 Language Specification](http://www.ecma-international.org/ecma-262/8.0/#sec-array-initializer)
|
90
90
|
|
91
91
|
実際、日本人でMDNを参考にする人は多く、間違った用語を使う人を何度も見てきました。
|
92
92
|
特に「スプレッド演算子」についてはそれが正しい用語だと思っている人が大半であり、ブログやリファレンス、Q&Aサイトの多くが「スプレッド演算子」と表現しています。
|
1
MSDNは閉鎖され、MDNへ統合、等、諸々を追記
answer
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
### MDN の用途
|
2
|
+
|
1
3
|
MDNはJavaScriptでも仕様としてはやや間違っていることがあるので、心から信頼してはいません。
|
2
4
|
|
3
5
|
- Firefoxの仕様を知りたい時に有用
|
@@ -9,4 +11,89 @@
|
|
9
11
|
所詮はブラウザベンダーのサイトなので、「Firefoxの仕様を知りたい時に利用」が本来の用途なのだと認識しています。
|
10
12
|
IEの仕様を知りたくて、MSDNから情報を追うようなものです。
|
11
13
|
|
14
|
+
**(2017/12/23 10:40追記)**
|
15
|
+
x_x さんよりMSDNに行くとMDNにリダイレクトされるという情報を頂きましたので、後述します。
|
16
|
+
|
17
|
+
### MSDNは閉鎖され、MDNへ統合
|
18
|
+
|
19
|
+
ドキュメントを一元管理する為にWebブラウザのドキュメントをMSDNに一本化する流れなのだそうです。
|
20
|
+
|
21
|
+
- [マイクロソフト、Google、W3C、Mozillaらが協力。それぞれのWebブラウザのドキュメントをMozillaサイトに一本化。あちこちのWebサイトを見て回らなくても済むように - Publickey](http://www.publickey1.jp/blog/17/googlew3cmozillawebmozillaweb.html)
|
22
|
+
- [Documenting the Web together - Microsoft Edge Dev BlogMicrosoft Edge Dev Blog](https://blogs.windows.com/msedgedev/2017/10/18/documenting-web-together-mdn-web-docs/)
|
23
|
+
|
24
|
+
そこで `innerHTML` のドキュメント参照を試みたところ、確かにリダイレクトされました。
|
25
|
+
|
26
|
+
- [http://msdn.microsoft.com/en-us/library/ms533897.aspx](http://msdn.microsoft.com/en-us/library/ms533897.aspx)
|
27
|
+
|
28
|
+
↓
|
29
|
+
|
30
|
+
- [https://developer.mozilla.org/en-US/docs/Web/API/Element/innerHTML](https://developer.mozilla.org/en-US/docs/Web/API/Element/innerHTML)
|
31
|
+
|
32
|
+
しかし、MDNはブラウザベンダーの情報としては足りてないですね。
|
33
|
+
旧来のIE(IE8-?もう忘れました)でtable関連要素がinnerHTMLで書き換えられない、という仕様が書かれていません。
|
34
|
+
|
35
|
+
これは「古きIEは捨ててMicrosoft Edgeを使ってください」というMSからのメッセージなのでしょうか。
|
36
|
+
しかし、それなら「Edge独自の仕様orバグ」がMDNに記載されていなければならないのですが、私は見たことがありません。
|
37
|
+
MDNにどこまで「**IE/Edgeの仕様**」が書かれているのかが不明なので、私としては歓迎できない流れですね…。
|
38
|
+
|
39
|
+
### 「Web標準仕様」と「Webブラウザの仕様」
|
40
|
+
|
41
|
+
HTML/CSS/JavaScriptの仕様には二種類あります。
|
42
|
+
|
43
|
+
- Web標準仕様 (W3C, WHATWG, Ecma International 等の標準化団体が定めた実装が遵守しなければならない標準仕様)
|
44
|
+
- Webブラウザの仕様 (Google Chrome, Firefox, IE, Edge 等の各Webブラウザが持つ独自の仕様)
|
45
|
+
|
46
|
+
私が「仕様」と書いたときには大体前者ですが、後者の仕様を知りたい時に私は MDN, MSDN, caniuse, その他Compatible Tableサイトを利用してきました。
|
47
|
+
|
48
|
+
### ブラウザベンダーとしてのMDN
|
49
|
+
|
50
|
+
MDNは「Webブラウザの仕様書」の位置づけで「Firefoxベンダーが作成したリファレンス」です。
|
51
|
+
つまり、Firefox独自の仕様にも触れられています。
|
52
|
+
|
53
|
+
例えば、過去に「`typeof` 演算子で RegExp オブジェクトを判定した時の返り値がWebブラウザによって異なる」という事象がありました。
|
54
|
+
|
55
|
+
- [Google Chrome 6 は (typeof /foo/ === 'function') となる - Togetter](https://togetter.com/li/54845)
|
56
|
+
|
57
|
+
```JavaScript
|
58
|
+
console.log(typeof /test/); // "object" or "function"
|
59
|
+
```
|
60
|
+
|
61
|
+
当時のFirefoxでは "object" を返し、Google Chrome では "function" を返しました。
|
62
|
+
なぜ、そうなるかといえば、Google Chrome 及び Firefox は `/test/` に暗黙の内に `RegExp.prototype.exec` の機能を持たせていたからです(この機能は ECMAScript には存在しない独自拡張です)。
|
63
|
+
RegExp.prototype.exec は関数(`[[Call]]` を持つ)の為、typeof 演算子は "function" を返さなければなりません(MUST)。
|
64
|
+
ところが、Firefox は暗黙の内に RegExp.prototype.exec を持っていながら、typeof 演算子が "object" を返す動作でした。
|
65
|
+
おそらく、ECMAScript では本来、RegExp.prototype.exec を持っていない為、本来のECMAScriptと同じ振る舞いをするように typeof 演算子の返り値をコントロールしていたものと考えられます。
|
66
|
+
しかし、[[Call]] を持ちながら、typeof 演算子が "object" を返す動作は**意図的にECMAScriptに違反**しています。
|
67
|
+
|
68
|
+
現在では Google Chrome, Firefox から「暗黙のRegExp.prototype.exec」の機能が取り除かれ、Firefox, Google Chrome の typeof 演算子は "object" を返すようになりました。
|
69
|
+
現在はありませんが、機能が取り除かれるまではMDNの「RegExp.prototype.exec()」のページに暗黙のexecについて説明がありました。
|
70
|
+
|
71
|
+
- [RegExp.prototype.exec() - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/RegExp/exec)
|
72
|
+
|
73
|
+
このようにMDNは「Firefox独自の仕様」を知る時は役立ちます。
|
74
|
+
これはMDNに書かれた情報が「Firefox独自の仕様」と「Web標準仕様」のどちらなのか、を区別しなければならない、という事でもあります。
|
75
|
+
MDNはある程度、Firefox独自の仕様と区別できるように配慮されているようですが、十分な注意が必要です。
|
76
|
+
|
77
|
+
### MDN上の間違った用語
|
78
|
+
|
79
|
+
MDNでは「function文」や「スプレッド演算子」など、間違った用語が散見される為、私個人としては表現方法においてMDNの印象が良くありません。
|
80
|
+
(「function - JavaScript | MDN」ですが、以前のタイトルは「function文」でした。
|
81
|
+
現在ではタイトルだけ修正されていますが、本文上では「function 宣言」と「function 文」が存在し、表現上の揺らぎが見られます。)
|
82
|
+
|
83
|
+
- [function - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/function)
|
84
|
+
- [スプレッド演算子 - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Spread_operator)
|
85
|
+
|
86
|
+
正しくは「function文」は「関数宣言(FunctionDeclaration)」であり、「スプレッド要素(SpreadElement)」です。
|
87
|
+
|
88
|
+
- [14.1 Function Definitions - ECMAScript® 2017 Language Specification](http://www.ecma-international.org/ecma-262/8.0/#sec-function-definitions)
|
89
|
+
- [12.2.5 Array Initializer](http://www.ecma-international.org/ecma-262/8.0/#sec-array-initializer)
|
90
|
+
|
91
|
+
実際、日本人でMDNを参考にする人は多く、間違った用語を使う人を何度も見てきました。
|
92
|
+
特に「スプレッド演算子」についてはそれが正しい用語だと思っている人が大半であり、ブログやリファレンス、Q&Aサイトの多くが「スプレッド演算子」と表現しています。
|
93
|
+
私の知る限りでは正しく使っていたサイトは JS.next だけでした。
|
94
|
+
|
95
|
+
- [Spread要素が実装された - JS.next](http://js-next.hatenablog.com/entry/2015/06/24/100705)
|
96
|
+
|
97
|
+
細かいことかもしれませんが、間違った用語から誤解が進むこともあるので、用語は正しく使ってほしいと思っています。
|
98
|
+
|
12
99
|
Re: anndonut さん
|