トップページ > プログラム > 2016年07月20日 > eZynd/Sj

書き込み順位&時間帯一覧

5 位/150 ID中時間01234567891011121314151617181920212223Total
書き込み数0041000000000000000000005



使用した名前一覧書き込んだスレッド一覧
デフォルトの名無しさん
JavaScript情報交換所(プログラミング既習者専用) [無断転載禁止]©2ch.net

書き込みレス一覧

JavaScript情報交換所(プログラミング既習者専用) [無断転載禁止]©2ch.net
346 :デフォルトの名無しさん[sage]:2016/07/20(水) 02:05:37.37 ID:eZynd/Sj
>>342
> 処理の流れの中で例外というわけでもない
俺が言っているのは、ToPrimitiveを呼ぶことではなくて、
ToPrimitiveのデフォルト値がTypeによって異なっていることだ。
ただしこれについては俺も>>336内では間違っていた。正確には以下。

var Object = {
ToPrimitive: funciton(hint) { // 9.1
if (typeof(this)==='Date') // 11.6.1 NOTE1 // ES5.1仕様書
}};

つまり、15.9 に書くべき内容が、次点の 9.1 にも書いてなくて、 11.6.1 に書いてある。
二重に落とし穴になっている。
そして、当たり前だがNOTE1が例外だと言っている。
というか例外じゃなければNOTEの意味無いだろ。

仕様書のおかしな構造は、おそらく仕様書それ自体を書いたわけではなくて、実装から起こしたからだ。
だから仕様書として妥当な場所ではなく、それが実装してある場所に記述があるのだろう。
とはいえその場合でもこのNOTE1の内容なら 9.1 にあるべきであって、
いずれにしても 11.6.1 にあるのはかなり謎なのだが。
そして、実装から起こすにしても、まともな実装ならそのまま仕様書に焼き直しても上手く行く。
いずれにしてもアレなんだろうさ。

NOTE1(仮): Dateの場合はhintにStringを与えて呼び出す // 11.6.1 にあっても不思議ではない、
 // 336の俺の勘違いはこれ、11.6.1にある点と整合させる為に脳内変換してしまった
NOTE1(ES5.1仕様書): ToPrimitiveはhint無しの場合、
 Date以外はNumberが、
 DateはStringがhintに与えられたものと見なす
 // ToPrimitiveの動作説明を(+)の説明内に配置?意味不明
 // しかもToPrimitiveの場所(9.1)にはこの説明は無しかよ!マジで頭おかしい
JavaScript情報交換所(プログラミング既習者専用) [無断転載禁止]©2ch.net
347 :デフォルトの名無しさん[sage]:2016/07/20(水) 02:06:29.35 ID:eZynd/Sj
さてES7仕様書を確認してみた。確かに大幅改訂されている。
7.1.1のToPrimitiveの所にNOTEがある。(改善あり)
12.8.3の + の所にはこれまでどおりのNOTE記述、まあこれはあった方がいい。
20.3.4.45にはDate.prototype[@@toPrimitive](hint)が追加されている。(改善あり)
結果、俺が問題だと思った点は全て改善され、妥当な配置になっている。

> そういう意味でも最新の仕様書を読んだほうが良い
ああその通りだ。今後俺はそうするよ。少なくともES5.1仕様書はゴミだ。

> 別にこれは外したり自由に付けたりもできるし、処理の流れの中で例外というわけでもない
それは完全に後付だよ。とはいえ妥当な解決策ではあるが。
最初からNumberならこの部分自体が丸々要らない。
無駄仕様で無駄に膨らむ駄目パターンの典型だ。

とはいえ、ES7には今のところ問題点はないね。
俺もこの解決策を採るだろうし、仕様書としても今現在俺が検出した問題点は全て解決済みだ。
徐々に改善されているのは事実だね。

ただまあ、20年も経とうとしているのにこのレベルの改善を未だにやっていること自体が問題だが。
他言語の仕様/仕様書なら、最初からこんな問題は存在しない。
というか、ブレンダン・アイクは何で仕様書を書かなかったんだろう?
彼が第1版を書けばこんな事にはならなかったはずなんだよ。

>>344
ググったらヒットした。で、試してみた。
が、効果あるか?特に何も変わらない気がするが。
ES6フラグとか指定必要?
JavaScript情報交換所(プログラミング既習者専用) [無断転載禁止]©2ch.net
348 :デフォルトの名無しさん[sage]:2016/07/20(水) 02:09:56.99 ID:eZynd/Sj
あ、ちなみに試したのは後者、間違いないようにもう一度書いておくと、以下ね。

> delete Object.prototype.__proto__

とりあえず期待した効果がない(気がする)
JavaScript情報交換所(プログラミング既習者専用) [無断転載禁止]©2ch.net
350 :デフォルトの名無しさん[sage]:2016/07/20(水) 02:31:38.89 ID:eZynd/Sj
>>344
いじってみると、動作の差異を検出出来た。
delete以降は__proto__指定でのプロトタイプ切り替えは出来なくなる。
ただし、リテラルとしてオブジェクト全体を生成する場合は指定が効くという、
極めて中途半端?な状態になっている。

果たしてこれが仕様なのか、もちろん動作自体ももっと確認しないと怖くて使えないが、
これが仕様であれば、意図は分かるし、最初からこうならこっちの方がいい。
ただ、今現在の動作しているコードの中でこれをやるのは無理だね。副作用が怖すぎる。
(つまり、結論としては、仕様だと確認出来ても使わない)
JavaScript情報交換所(プログラミング既習者専用) [無断転載禁止]©2ch.net
352 :デフォルトの名無しさん[sage]:2016/07/20(水) 03:30:00.35 ID:eZynd/Sj
B.2.2だろ?
他を見てもアクセサとして実装するところまでは仕様のようだから、
deleteに関しても仕様通りの実装になっていれば同じ動作だろう。
しかしObject.definePropertyを使えば同じ事が副作用無しで出来るのに
わざわざdeleteする意味は何?


※このページは、『2ちゃんねる』の書き込みを基に自動生成したものです。オリジナルはリンク先の2ちゃんねるの書き込みです。
※このサイトでオリジナルの書き込みについては対応できません。
※何か問題のある場合はメールをしてください。対応します。