一切都是对象?

时间:2013-10-03 17:02:16

标签: javascript

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

相关

或者确实如此?

如果不能,请解释“JavaScript中的所有内容都是对象”的含义。

或者一般都是OO编程,阅读有关此主题的内容将有助于理解它?你能推荐一下这个主题吗?

5 个答案:

答案 0 :(得分: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中的所有内容都是对象”在技术上并非如此,但在大多数情况下,您可以将它们视为对象,因为它们具有属性和方法,并且可以进行扩展。请确保你理解这些警告。

答案 1 :(得分:6)

回到第一原则。

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

根据该定义,您可以看到所有内容都可以被视为对象。函数式程序员将函数作为第一类对象。数据人员会说数据,即使是没有行为的数据,也可以被视为一个对象(虽然不是很聪明)。

我看不出这种变化。

JavaScript将函数视为对象。

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

答案 2 :(得分:1)

并非所有内容都是JavaScript中的对象。例如,数字不是对象。

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

在ECMAScript中,对象是零个或多个属性的集合 每个属性都有确定如何使用每个属性的属性(...)属性是保存其他对象的容器, 基本值或函数。原始值是其中一个的成员 以下内置类型之一:未定义,空,布尔值,数字, BigInt,String和Symbol;对象是内置类型的成员 目的;函数是可调用的对象。

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

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

答案 3 :(得分:0)

' ALMOST 一切都是对象'因为MAIN代码单元是JS对象。在原语上,您不能像在所有对象上一样添加成员。我的答案为什么JS函数是JS对象:https://stackoverflow.com/a/24811539

答案 4 :(得分:0)

NOT everything in JavaScript is an object.

JavaScript中的所有数据必须属于六种基本类型之一或对象类型。基元类型包括布尔值,nullundefined,字符串,数字和符号; 非原始的一切都是一个对象

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

由于原始值具有对象包装,因此产生了混淆。当您尝试访问字符串文字的length属性时,JavaScript会在基元周围创建一个临时对象包装器,并访问该对象包装器的length属性。检索到属性后,将丢弃对象包装器。这称为自动装箱。

基本上,它实现了类似以下内容:

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