document.location
に格納されているLocation
オブジェクトには、toString
メソッドが実装されています。
Object.prototype.toString() - JavaScript | MDN
このメソッドは全てのオブジェクトに存在し、オブジェクトが文字列変換される場合に呼び出されます。そして、toString
メソッドの返り値が対象のオブジェクトを変換した文字列となります。
Location
オブジェクトのtoString
メソッドは、オブジェクトが示すURL(href
プロパティと同じ値)を返すようになっています。
window.location - Web API インターフェイス | MDN
このため、以下のように、Location
オブジェクトが文字列変換されるようなコードでは、変換結果がURLとなります。
JavaScript
1document.location + "" // "https://teratail.com/"
2String(document.location) // "https://teratail.com/"
さて、new String
した場合に返された値ですが、これはString
オブジェクトです。
通常の文字列("abc"
など)とほぼ同じものであり、実際、ただの文字列として扱う分には違いはありません。
ただし、前者がプリミティブ型の文字列であるのに対し、後者はString
オブジェクトです。typeof
演算子の判定結果は異なりますし、後者はオブジェクトのように、任意のプロパティやメソッドを追加できます。
以下が、分かりやすい解説ページです:
[[PrimitiveValue]]
は、String
オブジェクトの文字列としての値情報が格納されているプロパティです。なので、「Stringオブジェクトの値が"https://teratail.com/"」ということになります。
一方で、一文字ずつ分解されて格納されているプロパティは、文字列に対して以下の様な処理を行えるようにするために存在します。
JavaScriptプログラミング講座【文字列について(String)】 #配列アクセス演算子について
JavaScript
1"example"[1] // "x"
2"hogehoge"[6] // "g"
まとめます。
Locationオブジェクトのhrefプロパティを分割してオブジェクトへ格納するという決まりがあるのでしょうか?
Location
オブジェクトは、文字列化したときにhref
プロパティの値になるよう動作します。
String
オブジェクトは配列アクセス演算子([0]
など)による操作を可能にするため、文字列を分割して格納するようにできています。
それぞれ、別のオブジェクトの「決まり」であり、この2つが組み合わさった時にそのような動作をします。
Stringオブジェクトの値(?)が"https://teratail.com/"ってこと?
と解釈しても問題ありません。
今後どうやって使用するのでしょうか?
文字列としてしか使用しないなら、new String
によるString
オブジェクトの取得ではなく、最初に例示したコードのような形でプリミティブ型の文字列を取得したほうが良いと思います。
文字列として利用するだけなら動作に変わりは無いので、ややこしくないプリミティブ型の文字列の方が適切です。
一方、Mithrilのm.trust関数のように、文字列値に独自のプロパティやメソッドを加えたいなら、String
オブジェクトを利用した方が良いでしょう。
m.trust
の場合、「$trusted
というプロパティを加えたString
オブジェクト」を生成する事で、普通の文字列と区別しています。
mithril.js/mithril.js at next · lhorie/mithril.js
JavaScript
1m.trust = function (value) {
2 value = new String(value) // eslint-disable-line no-new-wrappers
3 value.$trusted = true
4 return value
5}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/05/16 11:10
2016/05/16 11:14
2016/05/17 01:40 編集