2

在一个受欢迎的博客上,作者问他的听众他们的“啊哈!”是什么?JavaScript 的时刻,大多数人说它意识到 JavaScript 中的一切都是对象。但是对于 JS 和一般编程来说,我不太明白这意味着什么。它不像与实际的 JS 对象相关 - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object

或者确实如此?

如果不能,请解释“JavaScript 中的一切都是对象”是什么意思。

还是一般来说都是关于 OO 编程的,阅读有关该主题的内容将有助于理解它?你能推荐关于这个主题的阅读内容吗?

4

5 回答 5

7

回到第一原则。

什么是对象?它是一个软件组件,将状态和行为一起封装到内存中的单个实体中。

根据该定义,您可以看到可以将所有事物视为对象的地方。函数式程序员使函数成为第一类对象。数据人会说数据,即使没有行为,也可以被认为是一个对象(尽管不是一个非常聪明的对象)。

我看不出这会发生什么变化。

JavaScript 将函数视为对象。

我不确定这种见解会对您的编程产生什么影响。

于 2013-10-03T17:05:46.353 回答
7

他们的意思很可能是,任何可以分配给变量的数据都具有可以以类似方式访问的属性(以及因此方法)。

// strings
"asdf".length;              // 4
"asdf".replace('f', 'zxc'); // "azxc"

// numbers
(10).toFixed(2);            // "10.00"

// booleans
true.someProp;              // undefined (point is it doesn't crash)

他们甚至有继承自的原型。

"omg".constructor;          // function String() { [native code] }
String.prototype.snazzify = function() {
  return "*!*!*" + this + "*!*!*";
};

"omg".snazzify();           // "*!*!*omg*!*!*"

然而,这些都是原语,虽然它们在很多方面表现得像对象,但它们在一些方面与其他“真实”JS 对象不同。其中最大的一点是它们是不可变的。

var s = "qwerty";
s.foo;              // undefined, but does not crash
s.foo = 'some val'; // try to add a property to the string
s.foo;              // still undefined, you cannot modify a primitive

请注意,函数是真正的可变对象。

var fn = function(){};
fn.foo;              // undefined
fn.foo = 'some val'; // try to add a property to the function
fn.foo;              // "some val"

因此,虽然“JS 中的一切都是对象”在技术上并不正确,但在大多数情况下,您可以将它们视为对象,因为它们具有属性和方法,并且可以潜在地扩展。请确保您了解警告。

于 2013-10-03T17:55:24.040 回答
1

在 JavaScript 中,并非一切都是对象。例如,数字不是对象。

不同的语言对“对象”有不同的定义。对于 JavaScript,可以在ECMAScript 语言规范中找到官方定义,其中指出:

在 ECMAScript 中,对象是零个或多个属性的集合,每个属性都具有确定如何使用每个属性的属性(...)属性是保存其他对象、原始值或函数的容器。原始值是以下内置类型之一的成员:Undefined、Null、Boolean、Number、BigInt、String 和 Symbol;对象是内置类型 Object 的成员;一个函数是一个可调用的对象。

所以根据这个定义,很明显原始值(如数字)不是对象。甚至字符串也不是对象,这与大多数其他 OO 语言不同。

那么为什么有人说“一切都是对象”呢?你得问他们!但我怀疑这是因为它们被内置对象Number,等弄糊涂了Boolean,这些对象String可以用作相应原始值的包装器。这种包装有时会自动发生,这会使原始值看起来像对象,例如允许您(看似)访问原始值的属性。但实际上,属性位于包装器对象上。

于 2020-08-07T16:21:33.430 回答
1

并非JavaScript 中的所有内容都是对象。

JavaScript 中的所有数据都必须属于六种原始类型之一,即对象类型。原始类型包括布尔、、、null字符串undefined、数字和符号;一切不是原始的都是对象

这意味着函数是对象,数组是对象,ES6 类将糖化为对象的函数。

之所以会产生混淆,是因为原始值具有对象包装器。当您尝试访问length字符串文字上的属性时,JavaScript 会围绕原语创建一个临时对象包装器并访问该对象包装器的长度属性。检索到属性后,对象包装器将被丢弃。这称为自动装箱。

本质上,它的实现类似于以下内容:

const foo = "bar";

// When you run `foo.length`, it's similar to
tmp = String(foo);
tmp.length;
delete tmp;

或者

const foo = "bar";
(new String(foo)).length;

字符串、数字和布尔原语具有对象包装器,但nullundefined没有。因此,尝试从这些原语访问属性或方法会引发错误。

null.length; // Uncaught TypeError: Cannot read property 'length' of null
undefined.length; // Uncaught TypeError: Cannot read property 'length' of undefined
于 2017-05-18T08:47:07.367 回答
0

'几乎所有东西都是一个对象',因为主要的代码单元是 JS 对象。在原语上,您不能像在所有对象上一样添加成员。我在这里回答为什么 JS 函数是 JS 对象:https ://stackoverflow.com/a/24811539

于 2014-07-23T09:26:29.420 回答