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

unaristさんのエントリー

id:unaristのミニブログ

21 fans

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

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
unarist

Firefox

返信先のろまんば
まあ他実装で動くように実装していたなら差異が減ってありがたいわねーという感じも。
ちょうど最近こんなことを調べていたし https://twitter.com/unarist/status/986977026836840449
unarist

Hatena::Let

↓なにか埋め込みコンテンツを無限にロードしようとしてるみたいで落ち着かない
unarist

Hatena::Let

ecmascript 6 - What does the Reflect object do in JavaScript? - Stack Overflow
https://stackoverflow.com/a/25585988/2818869

# Reflect.get(target, name, receiver) って receiver[name] じゃいかんのかしらと思ってしまったけど
# target[name] 自体は Proxy を迂回しないと無限ループになるわ。そりゃそうだ。
▼はてなハイクの今月のスポンサー

表示内容を選択