Javascript 中几乎所有的东西都是对象吗?

新手上路,请多包涵

我在许多 JavaScript 介绍中读了很多。我只是不明白。我一直认为对象是具有方法和属性的东西。我理解的数组,因为它有键值对。 “字符串”或“数字”或“函数”怎么样?上面列出的这些东西对我来说似乎是功能。这意味着你输入了一些东西,你得到了一些东西。您并没有真正获得访问属性或任何东西。数组或“对象”列表中没有使用点符号。

有没有人用点符号编写其中每个示例的一些示例,以访问其方法和属性?我怀疑对象的定义可能是有限的,因为我确实开始学习 JavaScript …

原文由 Matt 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 299
2 个回答

没错:在 JavaScript 中,几乎一切都是对象。但这些对象与我们在 Java、C++ 或其他常规语言中看到的有点不同。 JS 中的对象只是一个带有键值对的 hashmap。一个键总是一个字符串或一个符号,一个值可以是任何东西,包括字符串、整数、布尔值、函数、其他对象等。所以我可以像这样创建一个新对象:

 var obj = {}; // This is not the only way to create an object in JS

并向其中添加新的键值对:

 obj['message'] = 'Hello'; // You can always attach new properties to an object externally

或者

obj.message = 'Hello';

同样,如果我想给这个对象添加一个新函数:

 obj['showMessage'] = function(){
  alert(this['message']);
}

或者

obj.showMessage = function() {
  alert(this.message);
}

现在,每当我调用此函数时,它都会显示一个带有消息的弹出窗口:

 obj.showMessage();

数组只是那些能够包含值列表的对象:

 var arr = [32, 33, 34, 35]; // One way of creating arrays in JS

尽管您始终可以使用任何对象来存储值,但数组允许您存储它们而无需将每个对象关联一个键。所以你可以使用它的索引访问一个项目:

 alert(arr[1]); // This would show 33

数组对象,就像 JS 中的任何其他对象一样,具有其属性,例如:

 alert(arr.length); // This would show 4

对于更深入的细节,我强烈推荐 John Resig 的 Pro JavaScript Techniques

原文由 craftsman 发布,翻译遵循 CC BY-SA 4.0 许可协议

不,在 JavaScript 中并非一切都是对象。您经常与之交互的许多东西(字符串、数字、布尔值)都是基元,而不是对象。与对象不同,原始值是不可变的。由于这些原语确实具有对象包装器( StringNumberBoolean ),情况变得复杂了。这些对象有方法和属性,而原语没有,但原语似乎有方法,因为当代码试图访问原语的任何属性时,JavaScript 会默默地创建一个包装对象。

例如,考虑以下代码:

 var s = "foo";
var sub = s.substring(1, 2); // sub is now the string "o"

在幕后, s.substring(1, 2) 表现得好像它正在执行以下(近似)步骤:

  1. s 创建一个包装器 String 对象,相当于使用 new String(s)
  2. 在步骤 1 返回的 String 对象上使用适当的参数调用 substring() 方法
  3. 处理 String 对象
  4. 从步骤 2 返回字符串(原始)。

这样做的结果是,虽然看起来您可以将属性分配给基元,但这毫无意义,因为您无法检索它们:

 var s = "foo";
s.bar = "cheese";
alert(s.bar); // undefined

发生这种情况是因为该属性是在 String 对象上有效定义的,该对象立即被丢弃。

数字和布尔值也是如此。然而,函数是完全成熟的对象,并继承自 Object (实际上是 Object.prototype ,但这是另一个话题)。因此,函数可以做任何对象可以做的事情,包括拥有属性:

 function foo() {}
foo.bar = "tea";
alert(foo.bar); // tea

原文由 Tim Down 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题