16

私はJavaScriptに少し慣れていないので、質問があります。

変数と「サブ変数」を設定できることは知っています。好き:

var msg = "Hello World";
alert(msg);

そしてまた

var msg = {
    lipsum: "Lorem Ipsum Dolor Sit Amet"
}
alert(msg.lipsum);

しかし、私はあなたが両方を行うことができるかどうか疑問に思っていました

var msg = "Hello World" || {
    lipsum: "Lorem Ipsum"
}
alert(msg + msg.lipsum);

このようにして、変数を宣言し、同じ変数をオブジェクトにすることもできます。明らかに、私がやったことではできませんでしたが、あなたは写真を手に入れました。

どんな助けでも大歓迎です!

4

6 に答える 6

20

実際、できます。

var msg = {
    lipsum: "Lorem Ipsum",
    toString: function() {return "Hello World!"}
};
于 2013-01-15T02:07:54.107 に答える
12

JavaScript変数には、オブジェクトまたはプリミティブのいずれかを含めることができます。オブジェクトがある場合は、そのオブジェクト(サブ変数)にプロパティを設定できますが、プリミティブがある場合は設定できません。

例に戻ると、JavaScript文字列は、定義方法に応じてプリミティブまたはオブジェクトのいずれかになります。さらに混乱させるために、プリミティブは、そのプロパティにアクセスしようとすると一時的にオブジェクトに変換されます。

new次のコードは「bar」を表示します。これは、文字列がキーワードを使用してStringオブジェクトとして明確に宣言されているためです。

a = new String("Hello World");
a.foo = "bar";
alert(a.foo);

パーツを削除すると、new String代わりにプリミティブが取得されます。JavaScriptは、設定しようとすると変換しますがfoo、実際には下にあるプリミティブであるため、何も保存されません。呼び出したときに「未定義」の結果が返されますalert(b.foo)

b = "Hello World";
b.foo = "bar";
alert(b.foo);

これは、組み込みのJavaScriptタイプについて混乱している多くのことの1つにすぎません。詳細については、MozillaJavascriptリファレンスのグローバルオブジェクトのセクションを読むことをお勧めします。

于 2013-01-15T02:24:44.527 に答える
6

Kolinkは、値が文字列であると期待している限り、オブジェクト内の値を「ボックス化」してからtoStringメソッドをオーバーライドできるという点で絶対的に正しいです。ただし、JavaScript(オブジェクトを文字列として出力する必要がある場合)が変数を出力できるようにするだけです(ネイティブに呼び出すtoStringことにより)。元の値を返すのではなく、別のオブジェクトでボックス化された値を返します。

2つがどのように変化するかを知らせるために、いくつかの点を指摘したいと思います(いくつかの例を示します)。それでは、次の部分を取り上げましょう。

var BoxedString = {
  value: 'Hello, world!',
  toString: function(){ return this.value; }
};
var BoxedNumber = {
  value: 3.14,
  toString: function(){ return this.value; }
};
var BoxedDate = {
  value: new Date(), // today
  toString: function(){ return this.value; }
};

簡単です。必要に応じて、これらをそれぞれ文字列として出力できます(またはできますか?)

// Each of these implicitly calls `.toString()` because we're concatenating
// them within another string. Metho calls (like `alert()` that look for a 
// string result have the same effect.
console.log('BoxedString: '+BoxedString); // BoxedString: Hello, world!
console.log('BoxedNumber: '+BoxedNumber); // BoxedNumber: 3.14
console.log('BoxedDate:   '+BoxedDate);   // fail!

待って、BoxedDate失敗しました。何故ですか?toStringオブジェクトを返しているので、Dateそのままでは出力できません。ただし、BoxedDate.toStringを返すように変更すると、this.value.toString()より良い結果が得られます(先に進んで試してみてください、お待ちください)。

BoxedDateトレンドに固執し、日付の方法を試してみましょう:

console.log(BoxedDate.getFullYear()); // BoxedDate.getFullYear is not a function

繰り返しになりますが、実際にはではなくDateDate光沢のあるボックスに包まれています。奇妙なことに、Javascriptは暗黙的にキャストするのに十分な知識を持っていBoxedNumberます:

var sum = 38.86 + BoxedNumber; // 42 (works)

Numberただし、などのオブジェクトメソッドは使用しないでくださいtoFixed()。、BoxedStringなどの文字列メソッドでも同じことが言えます。.replace()toUpperCase()

ただし、@ Kolinkの回答に何かを追加する場合valueOfは、オブジェクト宣言の一部として含めることにもなります。何かのようなもの:

var BoxedValue = {
  value: 2013,
  toString: function(){ return this.value.toString(); }
  valueOf: function(){ return this.value; }
};
于 2013-01-15T03:11:52.050 に答える
2

これを行うには、新しいオブジェクトを作成し、プロトタイプtoString()メソッドを拡張します。そのようなものが機能するはずです:

function Msg() {
    this.message = 'some message';
    this.lipsum = 'lipsum';
}

Msg.prototype.toString = function() {
    return this.message;
}

var msg = new Msg();

alert(msg + msg.lipsum);
于 2013-01-15T02:09:43.187 に答える
1

実際"Hello World"には文字列リテラルtypeof "Hello World" === "string")であり、インスタンスではありません。

あなたは作成することができます

var s = new String("Hello World");

そしてそれは今typeof s === "object"instanceof StringそしてObject

文字列オブジェクトには、次のような追加のプロパティを含めることもできます。

s.hint = "!";
// console.log(s + s.hint) prints "Hello World!" into console

あなたが実際に必要としているのは、おそらく他の人が答えたものです;)

于 2013-01-15T02:17:13.237 に答える
1

変数がプリミティブでない限り、プロパティを追加できます。

あなたの場合

var msg = "Hello World";

msgはプリミティブ変数であるため、目的を達成することはできません。ただし、実数String objectを作成してプロパティを追加することはできます。

var msg = new String("Hello World");
msg.lipsum = "lipsum";
alert(msg + msg.lipsum);
于 2013-01-15T02:18:10.980 に答える