from electron 2 web

インターネットのリソースを無駄遣いして検索におけるUXを下げてごめんなさい

圧倒的文章力のNASAでゴミみたいなチラ裏のようなメモを量産してしまい全ての"Web開発者"にごめんなさい

ES6のdefault引数と破壊的代入の規定値のprecedenceについて

いまから衝撃の事実を話します・・・・

俺はjserだ!NWエンジニアでもセキュ屋でもプログラマ・・・ではあるけどc言語とか低レイヤーの人間では全くない!高レイヤー側の人間だ!javascript単体が専門だ!

今まで70個以上ブログを書いてきたけど俺の記憶してる限りjavascirpt系の話をしたのは1回だけだ

しかもjavascirpt単体ではない。mvcフレームワークとかライブラリの感想について書いただけだ。

俺の専門分野javascriptの仕様については一切触れてない。

...

何回も書こうとはしたんだよ?実際下書き状態になってるものも多い。

でもね。。。深く掘りすぎる余り範囲が膨大になったりecma仕様書にぶちあったって英語で撃沈したりということが結構あった。ecma201の英語ってw3cの英語と違って読みにくい。図とかないし。いろいろ専門用語あってググっても出てこないとかザラだし

あと結構新鮮な話題を扱ってるのに時間がたってて腐らせてしまうなんてことも多い。

まあいろいろあっていろいろ書こうとはしてたんだけど専門過ぎて逆にできなかった感じ。

別に初心者向けのことならその辺のブログに腐るほど書いてあるからね。それじゃ意味ないんだよ。

まあ前置きが長くなってしまったけどそれでは行きます。


default引数

(a=100)=>{
a;
}

というやつ。こ↑こ↓

developer.mozilla.org

破壊的代入

分割代入のことです。

developer.mozilla.org

ちなみに上の記事にも下の記事にもcontributorの欄に妹紅がいますが俺です。

で分割代入には規定値があります。

const [hoge=114,fuga=514]=[810,"聴牌"];

ミスった話とミスった文法について

//失敗
(([a="pogemongo",b="is",c="get"]=[114514,810,42])=>{{
return [a,b,c]
}})("go","isnt","god");

/*
g,o,get
*/
//ok
(([a="pogemongo",b="is",c="get"]=[114514,810,42])=>{{
return [a,b,c]
}})(["go","isnt","god"]);

/*
g,o,get
*/

もうお分かりですね?即時関数の引数に渡すときに分割代入を適用させていないんです。

分割代入の基本

ちょっと上を見てください

const [hoge=114,fuga=514]=[810,"聴牌"];

とありますね?分割代入は代入する側(hoge,fuga)、される側(ヤジュウ,テンパイ)どちらともtypeofはarrayになります。

default引数の基本

そしてdefault引数は何も与えられていない場合じゃない場合(==なにか値が与えられている場合)その与えられた値が代入されます

つまりdefault引数が

[a,b]=[c,d]

でも引数(114,514)が与えられた場合

[a,b]=114,514

となります。

これらを組み合わせるとdefault引数とarray形式の分割代入を行う場合全て引数はarrayで渡さなきゃダメということです。

んでdefault引数の場合iteratorを渡す感じです。

qiita.com

こんな感じで。

結局バグった原因

stringはiteratorなので"go"を一文字ごとにiteratorに回されてそれぞれiterator resultが代入された。最後の引数はundefになるが分割代入の規定値が代入された。

というのが原因です。

つまり分割代入の規定値のほうがdefault引数よりも優先順位が高いまあそうじゃないかと予想はしてたけどね。

ついでに

バグ報告した。シンタックスハイライトが逝ってる。でもちゃんと動く。

1288776 – wrong scratch pad syntax highlight

ゴミ

default引数のテスト · GitHub

object調の分割代入について

キモ杉。マジで吐き気がするレベルでこのsyntax嫌いなんだが。もうプロポーザル出したいレベルで嫌い。

var obj={
  f:810,
  r:42
}

// var yaju=obj.f
// var sec=obj.r

var {f:yaju,r:sec}=obj;

r
/*
42
*/

var {f:yaju,r:sec}=obj; お前普通逆だろ。オブジェクトなんだからkeyが変数名だろ!!!って114514回言ってるしこの記法使うたびにエラー出してリファレンス見に行ってる。この辺もたぶんなんか理由があってこういう順番になってるはずだし誰か俺の代わりにこの辺のesdisscussの議論見に行ってほしい。。。

もういい加減に覚えたいっすね・・・

ということで覚え方を考えてみた。

  1. 元のobjを作る。

  2. いまからオブジェクトの値を借ります!ということを意識する。

プログラミングにおいて=は代入です。

var {f:yaju,r:sec}=objの{f:yaju,r:sec}の部分に注目します。objのプロパティを借りに行ってます。つまりkeyはobjのプロパティですね?

つまりオブジェクトを意識してあくまで変数は入れ物ということ。貸す側のobjectに注目です。(結局意味不明