unarist はてなハイク市民 (銅 59日)

unaristさんのエントリー

id:unaristのミニブログ

33 fans

書き込むには、ログインまたはユーザー登録を行ってください。 初めての方へ

unarist
unarist

JavaScript

t.coの展開をJSでやろうとして、レスポンスのLocationヘッダ見ればいいだろうと思ったら、ブラウザのUAでリクエスト投げると meta[http-equiv] と location.replace のハイブリッドなHTMLが返ってきてうーん。

じゃあUAを変更してリクエストするのはどうかというと、カスタムしたUser-Agentヘッダを送信するにはCORSのプリフライトリクエストが必須で、t.coはプリフライトリクエストを常に蹴ってるっぽいのでだめっぽい。
unarist

JavaScript

コードゴルフっぽいキーワードなさそうなのでここに転がしておきますが。

タグ付きのテンプレート文字列、第一引数を文字列として解釈する関数には括弧+文字列リテラルの代わりとして使えると聞いて色々遊んだ末に、Array.from`a${console.log}b` とかいうひどいコードに辿りついたものの、この例だと配列リテラル+mapの方がやっぱり短いので旨味がないですね。

○ 文字列ひとつ
× 文字列とその他引数(${} は (,) と同じ文字数なので)
○ 4要素以下の文字列配列(${} の中身は空にできないので差が小さくなっていく)
○ 文字列配列とその他いくつか(場合によるが要素数より少なくてもいける)
を引数にとる関数を呼ぶ時に活用できるかなあ。
最後のケースとか4文字以上削れるけど、条件を満たす場面を思いつかない。

# 重複する式をデフォルト引数に抽出しまくってるなら使えそうではある…。
unarist

JavaScript

uglifyに屈することなくやっていこう、という気持ちがまた強くなっている。

# someFunc = Object.values(uglifiedObject).find(x => typeof x === 'function' && x.toString().includes(...))
unarist

Hatena::Let

String()、toStringする以外に適切なものがあればそれを使うけど、結局はtoStringにfallbackするのね。toStringすら用意されないケース、例えばprototypeがnullなオブジェクトではこけると。

あとFirefoxだとこんな結果もあったけど、なぜSymbol……。

>> String(window[0])
<- SecurityError: Permission denied to access property Symbol.toPrimitive on cross-origin object

# のろまんば氏のやつ、devtoolsの組み込みを列挙するのかと最初勘違いしてた
unarist

TC39

throw expressions、実際そんなに例外使うかしらというのと、Promiseならrejectで代用できるのでというのがあるものの、わかります。C# にも7.0で入ったし。
あとはちょくちょく自前実装してたmatchAllとかfromEntriesとか、稀によくほしくなるoptional chainingやpipeline operatorとか。
unarist

Lua

最近はじめてまともに触ったけど、他言語と比べると微妙に縛りプレイっぽさがある(?)
unarist

Hatena::Let

T/U Box、canonical系の取得がSPAと相性悪いので色々やってるけど、そもそもog:urlに関してはog:titleを使わないのか?という気もしてきた。

// まー実用上はcanonical系見なくていいのでは感もそれなりにある
unarist

JavaScript

返信先a-kuma3
同じくプロパティを多用するC#、
public int Foo { get; private set; }
みたいな自動プロパティが前からありますが、最近
public int Foo { get; } // => コンストラクタで初期化だけできる
public double Bar => Math.Random();
みたいな構文が増えてきて、自由度の高い本来の構文
public int Foo { get { return this.x; } set { this.x = value; }
が相対的にヘビーな感じ(個人の感想です)になってるのはいいことなのかもしれない。
// setterにそういう糖衣構文は追加されていない
ref. https://ufcpp.net/study/csharp/ap_ver6.html
unarist

JavaScript

flatMapはよ #寝言
unarist

JavaScript

返信先のろまんば
例えばwindow.innerWidthをフックすることを考えると、どっちみちwindow.innerWidthをdefinePropertyで再定義してしまうことになるので、Reflectでもオリジナルを呼び出しようがないかなーと。
unarist

JavaScript

返信先unarist
よく見たら後者の例はthrowしないと意味がない。
unarist

JavaScript

返信先a-kuma3
async-awaitは少し前のPromiseの結果を持ってきたい時とかに取り回す必要がなくて楽だとは思いますが、そうでなく、またcatchが入り組んだり(先の例のように)try-catchが連続することもないなら、どっちでもいいかなあと今のところ思っています。そんなことを言っているからrejectやcatchを気軽に使ってしまうことはあるのかもしれませんが…。

// エラーと例外は違うというのは私も本当はそっち派なはずなんですけどね
// 些細なことで例外投げられると try/catch "statement" が必要になるのでつらい(JSON.parse、君のことだよ)
unarist

JavaScript

getter/setterも同様に(所有しているオブジェクトを置き換えない前提で)Proxy使えないかしらと考えたものの、definePropertyでgetterの中身をProxyにするぐらいしかないか。オリジナルはどのみちgetOwnPropertyDescriptorで取得しないといけないし、getterの実装はさくっと見れるわけでもないし、ややこしくなるだけであんまり嬉しくなさそう。
unarist

JavaScript

返信先unarist
というわけで
window.open = new Proxy(window.open, { apply: (target, thisArg, [url, ...others]) => Reflect.apply(target, thisArg, [url.replace('example.com', 'sample.com'), ...others])});
的なものにした。ここでもdestructuring使えてよかったよかった。
unarist

JavaScript

返信先a-kuma3
この場合Proxyってwindow差し換えることになるだろうなと思ってやめたんですが、関数のProxy作ってapply書けばいいですね。うーむ、その方が外からでもわかりやすくて行儀よさそう。
unarist

JavaScript

今日も今日とてwindowオブジェクトのメソッドのフック。
const originalWindowOpen = window.open;
window.open = function (url, ...others) { return originalWindowOpen.call(this, url.replace('example.com', 'sample.com'), ...others); };
実際の例 https://gist.github.com/unarist/79068e361c8cf69af4b7a520914e1259
unarist

JavaScript

返信先のろまんば
try{await}が好きってわけではないんですが、代わりの結果を用意して正常系に流せない時の大域脱出が、メソッドチェインでもだるい感じがあって悩んだりします。

async function downloadFile(url, path) {
let resp;
try{ body = await fetchFile(url) } catch(e) { new Error('failed to fetch: ' + e); }
try{ return await saveFile(body, path) } catch(e) { new Error('failed to save: ' + e); }
}

try-catchごとに入れ子にして、外側のPromiseチェインには生例外流さないように統一すればいいか。

function downloadFile(url, path) {
return Promise.resolve(url) // 下二行を揃えたいだけ
.then(url => fetchFile(url).catch(e => new Error('failed to fetch: ' + e)))
.then(body => saveFile(body, path).catch(e => new Error('failed to save: ' + e)))
}
unarist

Hatena::Let

Let保存ガチャ、今日は4回目で成功した。
unarist

Firefox

返信先のろまんば
これもどうぞ
🌐各言語の入力メソッド - みずぴー日記 https://mzp.hatenablog.com/entry/2017/10/22/192324
▼はてなハイクの今月のスポンサー

表示内容を選択