How is almost everything in Javascript an object?

I read this a lot in many JavaScript introductions. I just don't understand it. I always think of objects as something with methods and properties. Arrays I understand, since it has key value pair. How about "Strings" or "Numbers" or "functions" ? These things above listed seem to be like functions to me. This means you input something, you get something out. You don't really get the access properties or anything. There's no dot notation used in arrays or this list of "objects".

Does anyone code some examples of each of these with dot notations which its methods and properties are being accessed? I suspect that definition of object is probably limited since I did start learning about JavaScript...

35230 次浏览

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

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']);
}

or

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 技术

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

例如,考虑以下代码:

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

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

  1. Create a wrapper String object from s, equivalent to using new String(s)
  2. 使用步骤1返回的 String对象上的适当参数调用 substring()方法
  3. 处理 String对象
  4. Return the string (primitive) from step 2.

这样做的一个结果是,尽管看起来似乎可以将属性分配给原语,但这是毫无意义的,因为无法检索它们:

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

这是因为该属性是在立即丢弃的 String对象上有效定义的。

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

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

句子“ In JavaScript,差不多了 everything is an object”是正确的,因为 总部代码单元(对象、函数、数组)是 JavaScript 对象。
JavaScript 代码使用9个不同的单位加1(多个) :
01,数组
-02布尔型
- 03功能
- 04-无效
05号
- 06,反对
-07. regexp
- 08-绳子
- 09-不确定
- 10个-多个

但是 JavaScript 对象:
不同于其他面向对象语言中的“对象”。
它们是名称-值-对的集合。
都有一个创建函数(它的构造函数)。
所有继承其构造函数的原型对象的成员,这是它的原型。
- 所有函数都是对象,但是 并非所有对象都是函数
- 功能有范围,对象没有(我认为这是一个设计缺陷)。
- 对象,函数,数组,字符串,... 与第一个大写是函数! ! !
JS 对象和功能的差异比它的共性更重要。
- the name 'instance' in JS has different meaning with the name 'instance' in knowledge-theory where an instance inherits the attributes of its generic-concept. In JS denotes only its constructor. JavaScript got the name 'instance' from 'class-based-inheritance' ool (java) where it is an appropriate name because those objects inherit the attributes of classes.
JS 关键字‘ instanceof’的更好名称是‘ objectof’。

JS- 函数 ARE JS- 对象 因为:
1)它们可以有像 JS-object 这样的成员:

> function f(){}
undefined
> f.s = "a string"
"a string"
> f.s
"a string"

2)他们有一个构造函数,就像所有的 JS 对象一样,函数函数:

> (function f(){}) instanceof Function
true

3)作为所有的 JS 对象,它们的原型对象和它的构造函数原型是一样的:

> (function f(){}).__proto__ === Function.prototype
true
> ({}).__proto__ === Object.prototype
true
> (new Object).__proto__ === Object.prototype
true

4)当然,作为 SPECIFIC JS 对象的 JS 函数有额外的属性,就像所有编程语言中的函数一样,JS 对象没有这些属性,你可以用输入和输出信息来调用(执行)它们。

EVERYTHING 不是一个对象,因为,例如,我们不能将成员添加到文本字符串:

> var s = "string"
undefined
> s.s2 = "s2string"
"s2string"
> s.s2
undefined

并非所有东西都是 javaScript 中的对象。 There are six primitives-null,undefined,string,number,boolean and symbol. 由于可以访问的属性和函数,所以看起来好像所有东西都是作为一个对象

var stringvar="this string";
typeof stringvar; // "string"
stringvar.length; //11

现在,由于“ stringvar”是一个字符串类型,这是一个基元类型,它不应该能够访问属性长度。装箱是将任何基元类型转换为 Object 类型的过程,反过来称为“取消装箱”。创建这些对象类型或对象包装器时所使用的视图是,可能需要使用基元值执行一些常见操作。它们包含有用的方法和属性,并且是链接到原语的原型。 As far as the Objects are concerned,key value pairs can be added to every object,even to the arrays.

var arr=[1,2,3];
arr.name="my array";
arr;  //[1,2,3,name:'my array']

这并不意味着数组的第四个元素是“ name: ‘ my array’”。“ name”是一个可以用点符号(arr.name)或括号符号(arr [“ name”])调用的属性。

基于 developer.mozilla.org和 ECMAScript 规范,答案是否定的。从技术上来说,并非所有东西都是对象。

https://developer.mozilla.org/en-US/docs/Glossary/Primitive

在 JavaScript 中,基元(基元值、基元数据类型)是非对象且没有方法的数据。有7种基本数据类型: 字符串、数字、双精度数、布尔值、空、未定义、符号

原语不是对象,没有方法,也是不可变的。除了空和未定义之外,所有其他原语都有一个包装对象,以便为您提供一些可以使用的函数。例如字符串原语的 String

Https://developer.mozilla.org/en-us/docs/glossary/primitive#primitive_wrapper_objects_in_javascript

因此,在下面的代码中,当您对基元数据调用 toUpperCase()时,name JavaScript 将自动包装字符串基元并调用 String 对象的 toUpperCase 函数

var name = 'Tom';
console.log(name);


name.toUpperCase();
console.log(name);

在对原语字符串调用方法或进行属性查找的上下文中,JavaScript 将自动包装字符串原语并调用方法或执行属性查找。

还要注意 JavaScript 区分了 String 对象和基本字符串值。

Https://developer.mozilla.org/en-us/docs/web/javascript/reference/global_objects/string#distinction_between_string_primitives_and_string_objects

var nameP = 'Tom';
var nameO = new String(nameP);


typeof nameP // "string"
typeof nameO // "object"

我会说“ Javascript 中的一切都不是一个对象(因为原语) ,但是 Javascript 中的一切都回到一个对象(因为包装器和对象构造函数)”