2 つの配列・連想配列を比較する JavaScript のライブラリです。 GitHub で配布しています。
「何を言ってやがる、違わねぇよ!
おまえは NodeList で、オレは HTMLCollection だ!
そこになんの違いもありゃしねぇだろうが!」
というわけでどう違うのかって話なんですが、僕はよく分かっていません。分かっていることといえば .childNodes はタグの内側の文字列も扱うという点でしょうか。下のようにすると分かります。
<body>
<p id="p">abcde</p>
</body>
<script>
let p = document.querySelector("#p")
console.log(p.childNodes) // 戻り値 : NodeList [text]
console.log(p.children) // 戻り値 : HTMLCollection []
</script>
.childNodes が length = 1 の配列でまだ何か含んでいるのに対して、 .children は length = 0 の配列でこれ以上奥に HTML 要素がないことを示しています。ここでさらに下のようにしてみます。
<body>
<p id="p">abcde</p>
</body>
<script>
let p = document.querySelector("#p")
console.log(p.childNodes[0].textContent) // 戻り値 : abcd
</script>
なんか難しい話になると、きっと処理速度が .children のほうが 1ns 速いとかそんなことになるんじゃないかと想像しているんですが、どうなんでしょうね。
タイトルのとおりのライブラリを書きました。
処理パターンは 3 つあります。
また、括弧とその周辺部のみをピックアップして返すモードがあります。
https://cdn.jsdelivr.net/gh/satsuki-thyme/brackettool.js@main/brackettool.min.js
正規表現ではエスケープが必要な文字があります。通常は事前にエスケープしておくわけですが、下のような場合には随時のエスケープが必要になります。
function fn(src, keyword) {
let rx = new RegExp(`foo${keyword}baa`, "g")
return src.replace(rx, "hoge")
}
エスケープする関数が必要になる前に準備してストックしておけば安心ですね。僕は下のように書いています。
function esc(r) {
if (typeof r === "string" || r instanceof String) return p(r)
else if (Array.isArray(r)) return r.map(r => r = p(r))
else return r
function p(r) {
return r.replace(/(/|\|^|$|*|+|?|.|(|)|[|]|{|})/g, "\$1")
}
}
文字列が入力されればエスケープした文字列で返し、配列が入力されればエスケープした配列で返します。その他はそのまま返します。
冒頭の例に適用すると下のようになります。
function fn(src, keyword) {
let rx = new RegExp(`foo${esc(keyword)}baa`, "g") // <= ここ
return src.replace(rx, "hoge")
}
この関数は GitHub で公開しています。コードの中にはアンエスケープする関数が含まれているのですが、必要になることがあるのか不明です。一応作りました。使ったことないけど。
下のような話です。非同期関数の戻り値は then() で受けるでしょ、それで then() の戻り値は then() で受けるでしょ。あれ、そうすると値は一生 then() の中から出られないの? という困りごとがありました。
function fn() {
asyncFunction()
.then(() => {
return value // value を fn() の返す戻り値にしたいんだけど?
})
}
方法を知らなかったんですね。 JavaScript の本など読んだことがないので基本的なことが分かっていないのです。気付いたときにはあっけに取られ、乾いた笑いが漏れました。さて、下のようにするといいようです。
function fn() {
return asyncFunction() // ここで return するだけ
.then(() => {
return value
})
}