在一个受欢迎的博客中,作者向他的听众询问他们对JavaScript的“啊哈!”时刻是什么,大多数人都说他们意识到JavaScript中的所有内容都是一个对象。 但对于JS和编程新手来说,我并不完全明白这意味着什么。它不像它与实际JS对象 - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object
相关或者确实如此?
如果不能,请解释“JavaScript中的所有内容都是对象”的含义。
或者一般都是OO编程,阅读有关此主题的内容将有助于理解它?你能推荐一下这个主题吗?
答案 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语言不同。
那么为什么有人说“一切都是对象”?你必须问他们!但是我怀疑这是因为它们被内置对象Number
,Boolean
,String
等弄糊涂了,它们可以用作相应原始值的包装。这种包装有时会自动发生,这可以使原始值看起来像对象,并且例如使您(似乎)可以访问原始值的属性。但实际上,这些属性位于包装对象上。
答案 3 :(得分:0)
' ALMOST 一切都是对象'因为MAIN代码单元是JS对象。在原语上,您不能像在所有对象上一样添加成员。我的答案为什么JS函数是JS对象:https://stackoverflow.com/a/24811539
答案 4 :(得分:0)
NOT everything in JavaScript is an object.
JavaScript中的所有数据必须属于六种基本类型之一或对象类型。基元类型包括布尔值,null
,undefined
,字符串,数字和符号; 非原始的一切都是一个对象。
这意味着函数是对象,数组是对象,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;
字符串,数字和布尔基元具有对象包装器,但null
和undefined
没有。因此,尝试从这些原语访问属性或方法会引发错误。
null.length; // Uncaught TypeError: Cannot read property 'length' of null
undefined.length; // Uncaught TypeError: Cannot read property 'length' of undefined