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)
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的全局对象部分,了解所有血腥细节.
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失败了; 这是为什么?因为我们toString将Date对象返回并且无法按原样输出.但是,如果我们改变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)
| 归档时间: |
|
| 查看次数: |
376 次 |
| 最近记录: |