プラス記号を使わずに文字列を結合する。

結合したい!!

JavaScriptなオハナシ。所与の strA と strB とで、strCを作りたい。ただし、結果としてstrC = strA + strB になってほしい。 条件として、プラス記号を使わない、pushやconcatを使わない、slice系もナシ、joinも使わない、正規表現も使わない、要するに文字列結合に使えそうなメソッドは全部我慢する、さてどうしましょう? というのを本日、病院の待合室で考えていたら面白いものができたので書いてみます。

ノーマライズすれば結合できる

strAとstrBの文字列の値を持ったTextNodeをそれぞれ作って隣接させておき、その親のエレメントをnormalizeしてやれば、その2つのTextNodeが素敵なことに合体するので、出来上がったTextNodeの値をstrCに格納すればよかろう、という思いつきです。基本的な標準のDOM操作を使っているはずなのでクロスブラウザになっているといいかと思います。IE,Opera,Firefoxで確認しました。

var e, strA, strB, strC;
strA = "<aaa\r\n>";
strB = "bbb";

e = document.createDocumentElement("p");
e.appendChild(document.createTextNode(strA));
e.appendChild(document.createTextNode(strB));
e.normalize();
strC = e.firstChild.nodeValue;

alert(encodeURIComponent(strC));

みなさんからいただいたアイデアについて

トラックバックをいただきまして、さまざまなアイデアをいただきました。素敵杉。
hasegawayosukeさんからいただいたアイデアのうち、ひとつは、innerHTMLを使っていますが、strAに『<』とかがはいっているとどうなのでしょうか。ブラウザ毎に振り分けをしておいて、textContentもしくはinnerTextを使えばいいかと思います、たぶん。それと、『pre』要素を作っていますが、これを『xmp』や、『plaintext』にするとIEFirefoxではinnerHTMLのままでも『<』等が文字参照されずにすみます。CDATA扱いなのでしょうかねぇ。ただし、Operaではこの手は使えません、文字参照されちゃいます。そこで。『pre』の代わりに『script』や『style』ではと試みましたが、OperaFirefoxではなんだかイケソウな気がしますがIEではエラーになるっぽいです、残念。hasegawayosukeさんのほかの二つのアイデアは個人的に意表をつかれました。なるほろー。勉強になりますです。
yamagata21さんからいただいた3つのアイデア、記述がどれもこれも…背景が黒すぎますw。(HTMLのスタイルが。)ええと、Functionを使っているやつ、面白かったです。それと、"bbb"の先頭のnullを"aaa"で置き換えるってのは絶対に私には思いつきません。すげぇ。おかげさまで手元の謎サンプルが少々簡略表記できることになり…私のは黒くありません。メモ帳で書いてありますから。