回答編集履歴

3

markdown修正

2017/12/23 02:53

投稿

think49
think49

スコア18162

test CHANGED
@@ -168,7 +168,7 @@
168
168
 
169
169
 
170
170
 
171
- 正しくは「関数宣言(FunctionDeclaration)」であり、「スプレッド要素(SpreadElement)」です。
171
+ 正しくは「**関数宣言(FunctionDeclaration)**」であり、「**スプレッド要素(SpreadElement)**」です。
172
172
 
173
173
 
174
174
 

2

表現の微修正

2017/12/23 02:53

投稿

think49
think49

スコア18162

test CHANGED
@@ -168,13 +168,13 @@
168
168
 
169
169
 
170
170
 
171
- 正しくは「function文」は「関数宣言(FunctionDeclaration)」であり、「スプレッド要素(SpreadElement)」です。
171
+ 正しくは「関数宣言(FunctionDeclaration)」であり、「スプレッド要素(SpreadElement)」です。
172
172
 
173
173
 
174
174
 
175
175
  - [14.1 Function Definitions - ECMAScript® 2017 Language Specification](http://www.ecma-international.org/ecma-262/8.0/#sec-function-definitions)
176
176
 
177
- - [12.2.5 Array Initializer](http://www.ecma-international.org/ecma-262/8.0/#sec-array-initializer)
177
+ - [12.2.5 Array Initializer - ECMAScript® 2017 Language Specification](http://www.ecma-international.org/ecma-262/8.0/#sec-array-initializer)
178
178
 
179
179
 
180
180
 

1

MSDNは閉鎖され、MDNへ統合、等、諸々を追記

2017/12/23 02:50

投稿

think49
think49

スコア18162

test CHANGED
@@ -1,3 +1,7 @@
1
+ ### MDN の用途
2
+
3
+
4
+
1
5
  MDNはJavaScriptでも仕様としてはやや間違っていることがあるので、心から信頼してはいません。
2
6
 
3
7
 
@@ -20,4 +24,174 @@
20
24
 
21
25
 
22
26
 
27
+ **(2017/12/23 10:40追記)**
28
+
29
+ x_x さんよりMSDNに行くとMDNにリダイレクトされるという情報を頂きましたので、後述します。
30
+
31
+
32
+
33
+ ### MSDNは閉鎖され、MDNへ統合
34
+
35
+
36
+
37
+ ドキュメントを一元管理する為にWebブラウザのドキュメントをMSDNに一本化する流れなのだそうです。
38
+
39
+
40
+
41
+ - [マイクロソフト、Google、W3C、Mozillaらが協力。それぞれのWebブラウザのドキュメントをMozillaサイトに一本化。あちこちのWebサイトを見て回らなくても済むように - Publickey](http://www.publickey1.jp/blog/17/googlew3cmozillawebmozillaweb.html)
42
+
43
+ - [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/)
44
+
45
+
46
+
47
+ そこで `innerHTML` のドキュメント参照を試みたところ、確かにリダイレクトされました。
48
+
49
+
50
+
51
+ - [http://msdn.microsoft.com/en-us/library/ms533897.aspx](http://msdn.microsoft.com/en-us/library/ms533897.aspx)
52
+
53
+
54
+
55
+  ↓
56
+
57
+
58
+
59
+ - [https://developer.mozilla.org/en-US/docs/Web/API/Element/innerHTML](https://developer.mozilla.org/en-US/docs/Web/API/Element/innerHTML)
60
+
61
+
62
+
63
+ しかし、MDNはブラウザベンダーの情報としては足りてないですね。
64
+
65
+ 旧来のIE(IE8-?もう忘れました)でtable関連要素がinnerHTMLで書き換えられない、という仕様が書かれていません。
66
+
67
+
68
+
69
+ これは「古きIEは捨ててMicrosoft Edgeを使ってください」というMSからのメッセージなのでしょうか。
70
+
71
+ しかし、それなら「Edge独自の仕様orバグ」がMDNに記載されていなければならないのですが、私は見たことがありません。
72
+
73
+ MDNにどこまで「**IE/Edgeの仕様**」が書かれているのかが不明なので、私としては歓迎できない流れですね…。
74
+
75
+
76
+
77
+ ### 「Web標準仕様」と「Webブラウザの仕様」
78
+
79
+
80
+
81
+ HTML/CSS/JavaScriptの仕様には二種類あります。
82
+
83
+
84
+
85
+ - Web標準仕様 (W3C, WHATWG, Ecma International 等の標準化団体が定めた実装が遵守しなければならない標準仕様)
86
+
87
+ - Webブラウザの仕様 (Google Chrome, Firefox, IE, Edge 等の各Webブラウザが持つ独自の仕様)
88
+
89
+
90
+
91
+ 私が「仕様」と書いたときには大体前者ですが、後者の仕様を知りたい時に私は MDN, MSDN, caniuse, その他Compatible Tableサイトを利用してきました。
92
+
93
+
94
+
95
+ ### ブラウザベンダーとしてのMDN
96
+
97
+
98
+
99
+ MDNは「Webブラウザの仕様書」の位置づけで「Firefoxベンダーが作成したリファレンス」です。
100
+
101
+ つまり、Firefox独自の仕様にも触れられています。
102
+
103
+
104
+
105
+ 例えば、過去に「`typeof` 演算子で RegExp オブジェクトを判定した時の返り値がWebブラウザによって異なる」という事象がありました。
106
+
107
+
108
+
109
+ - [Google Chrome 6 は (typeof /foo/ === 'function') となる - Togetter](https://togetter.com/li/54845)
110
+
111
+
112
+
113
+ ```JavaScript
114
+
115
+ console.log(typeof /test/); // "object" or "function"
116
+
117
+ ```
118
+
119
+
120
+
121
+ 当時のFirefoxでは "object" を返し、Google Chrome では "function" を返しました。
122
+
123
+ なぜ、そうなるかといえば、Google Chrome 及び Firefox は `/test/` に暗黙の内に `RegExp.prototype.exec` の機能を持たせていたからです(この機能は ECMAScript には存在しない独自拡張です)。
124
+
125
+ RegExp.prototype.exec は関数(`[[Call]]` を持つ)の為、typeof 演算子は "function" を返さなければなりません(MUST)。
126
+
127
+ ところが、Firefox は暗黙の内に RegExp.prototype.exec を持っていながら、typeof 演算子が "object" を返す動作でした。
128
+
129
+ おそらく、ECMAScript では本来、RegExp.prototype.exec を持っていない為、本来のECMAScriptと同じ振る舞いをするように typeof 演算子の返り値をコントロールしていたものと考えられます。
130
+
131
+ しかし、[[Call]] を持ちながら、typeof 演算子が "object" を返す動作は**意図的にECMAScriptに違反**しています。
132
+
133
+
134
+
135
+ 現在では Google Chrome, Firefox から「暗黙のRegExp.prototype.exec」の機能が取り除かれ、Firefox, Google Chrome の typeof 演算子は "object" を返すようになりました。
136
+
137
+ 現在はありませんが、機能が取り除かれるまではMDNの「RegExp.prototype.exec()」のページに暗黙のexecについて説明がありました。
138
+
139
+
140
+
141
+ - [RegExp.prototype.exec() - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/RegExp/exec)
142
+
143
+
144
+
145
+ このようにMDNは「Firefox独自の仕様」を知る時は役立ちます。
146
+
147
+ これはMDNに書かれた情報が「Firefox独自の仕様」と「Web標準仕様」のどちらなのか、を区別しなければならない、という事でもあります。
148
+
149
+ MDNはある程度、Firefox独自の仕様と区別できるように配慮されているようですが、十分な注意が必要です。
150
+
151
+
152
+
153
+ ### MDN上の間違った用語
154
+
155
+
156
+
157
+ MDNでは「function文」や「スプレッド演算子」など、間違った用語が散見される為、私個人としては表現方法においてMDNの印象が良くありません。
158
+
159
+ (「function - JavaScript | MDN」ですが、以前のタイトルは「function文」でした。
160
+
161
+ 現在ではタイトルだけ修正されていますが、本文上では「function 宣言」と「function 文」が存在し、表現上の揺らぎが見られます。)
162
+
163
+
164
+
165
+ - [function - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/function)
166
+
167
+ - [スプレッド演算子 - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Spread_operator)
168
+
169
+
170
+
171
+ 正しくは「function文」は「関数宣言(FunctionDeclaration)」であり、「スプレッド要素(SpreadElement)」です。
172
+
173
+
174
+
175
+ - [14.1 Function Definitions - ECMAScript® 2017 Language Specification](http://www.ecma-international.org/ecma-262/8.0/#sec-function-definitions)
176
+
177
+ - [12.2.5 Array Initializer](http://www.ecma-international.org/ecma-262/8.0/#sec-array-initializer)
178
+
179
+
180
+
181
+ 実際、日本人でMDNを参考にする人は多く、間違った用語を使う人を何度も見てきました。
182
+
183
+ 特に「スプレッド演算子」についてはそれが正しい用語だと思っている人が大半であり、ブログやリファレンス、Q&Aサイトの多くが「スプレッド演算子」と表現しています。
184
+
185
+ 私の知る限りでは正しく使っていたサイトは JS.next だけでした。
186
+
187
+
188
+
189
+ - [Spread要素が実装された - JS.next](http://js-next.hatenablog.com/entry/2015/06/24/100705)
190
+
191
+
192
+
193
+ 細かいことかもしれませんが、間違った用語から誤解が進むこともあるので、用語は正しく使ってほしいと思っています。
194
+
195
+
196
+
23
197
  Re: anndonut さん