JavaScript变量和相同的变量也是一个对象

Mod*_*ner 16 javascript arrays variables object

我对JavaScript有点新,我有一个问题.

我知道你可以设置变量和"子变量".喜欢:

var msg = "Hello World";
alert(msg);
Run Code Online (Sandbox Code Playgroud)

并且

var msg = {
    lipsum: "Lorem Ipsum Dolor Sit Amet"
}
alert(msg.lipsum);
Run Code Online (Sandbox Code Playgroud)

但我想知道你是否可以做到这两点,比如

var msg = "Hello World" || {
    lipsum: "Lorem Ipsum"
}
alert(msg + msg.lipsum);
Run Code Online (Sandbox Code Playgroud)

这样,您可以声明一个变量,并将同一个变量作为一个对象.显然,我无法完成所做的事情,但你得到了图片.

任何帮助将非常感激!

Nie*_*sol 20

实际上,你可以.

var msg = {
    lipsum: "Lorem Ipsum",
    toString: function() {return "Hello World!"}
};
Run Code Online (Sandbox Code Playgroud)

  • 我会注意到,当你这样做时,你真的没有保持同样的心态.你只是创建一个对象(仍然)并覆盖它如何被转换为字符串.它有用吗?绝对.只是它不再是一个简单的字符串.如果你试图使用`var foo = msg + 10;`你将很难将`msg`作为一个数字. (10认同)

Tob*_*hen 12

JavaScript变量可以包含对象或基元.如果你有一个对象,你可以设置它的属性(子变量),如果你有一个原语,你不能.

回到您的示例,JavaScript字符串可以是基元或对象,具体取决于您如何定义它,并使事情更加混乱,当您尝试访问其属性时,基元将临时转换为对象.

以下代码将显示"bar",因为我们的字符串被特别声明为具有new关键字的String对象:

a = new String("Hello World");
a.foo = "bar";
alert(a.foo);
Run Code Online (Sandbox Code Playgroud)

如果我们删除该new String部分,我们会得到一个原语.当我们尝试设置时foo,JavaScript会为我们转换它,但没有任何东西得到保存,因为它实际上只是一个原始的下层,当我们调用时,我们得到结果"undefined" alert(b.foo):

b = "Hello World";
b.foo = "bar";
alert(b.foo);
Run Code Online (Sandbox Code Playgroud)

这只是许多令人困惑的内置JavaScript类型之一,我建议您阅读Mozilla Javascript Reference的全局对象部分,了解所有血腥细节.

  • +1这是正确的答案.@Kolink的回答是黑客攻击. (3认同)

Bra*_*tie 6

Kolink是完全正确的,只要你期望值是一个字符串然后你可以"装箱"对象中的值然后覆盖toString方法.但是,所有这一切都是允许javascript(当它需要输出对象作为字符串时)输出变量(通过本机调用toString你).它不会返回原始值,而是返回另一个对象中的值.

我想指出一些事情,让它知道两者如何变化(举几个例子).那么,让我们采取以下一点:

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; }
};
Run Code Online (Sandbox Code Playgroud)

很简单,我们可以在必要时将每个输出为字符串(或者我们可以吗?)

// 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!
Run Code Online (Sandbox Code Playgroud)

等等,BoxedDate失败了; 这是为什么?因为我们toStringDate对象返回并且无法按原样输出.但是,如果我们改变BoxedDate.toString返回,this.value.toString()我们会看到更好的结果(继续尝试,我会等.)

让我们坚持BoxedDate趋势并尝试日期方法:

console.log(BoxedDate.getFullYear()); // BoxedDate.getFullYear is not a function
Run Code Online (Sandbox Code Playgroud)

再一次,它实际上不是一个Date,它是一个Date包裹在闪亮的盒子里.奇怪的是,Javascript足够隐含地强制转换BoxedNumber:

var sum = 38.86 + BoxedNumber; // 42 (works)
Run Code Online (Sandbox Code Playgroud)

但是,不要尝试任何Number对象方法,如toFixed().同样的事情BoxedString和字符串的方法一样.replace(),toUpperCase()和其他人.

但是,如果我要在@ Kolink的答案中添加一些内容,那么它也将valueOf作为对象声明的一部分包含在内.就像是:

var BoxedValue = {
  value: 2013,
  toString: function(){ return this.value.toString(); }
  valueOf: function(){ return this.value; }
};
Run Code Online (Sandbox Code Playgroud)