几乎Javascript中的所有内容都是一个对象?

Mat*_*att 54 javascript oop

我在很多JavaScript介绍中都经常阅读这篇文章.我只是不明白.我总是将对象视为具有方法和属性的东西.我理解的数组,因为它具有键值对."字符串"或"数字"或"功能"怎么样?上面列出的这些东西对我来说似乎都很像.这意味着你输入一些东西,你会得到一些东西.你没有真正获得访问属性或任何东西.数组或"对象"列表中没有使用点符号.

是否有人使用点符号编写每个示例的一些示例,其方法和属性正在被访问?我怀疑对象的定义可能有限,因为我开始学习JavaScript ...

Tim*_*own 157

不,不是一切都是JavaScript中的对象.你经常与之交互的很多东西(字符串,数字,布尔)都是原始的,而不是对象.与对象不同,原始值是不可变的.这些原语确实有对象包装器(String,NumberBoolean),这种情况很复杂; 这些对象具有方法和属性,而基元没有,但是基元似乎有方法,因为当代码尝试访问基元的任何属性时,JavaScript会以静默方式创建包装器对象.

例如,请考虑以下代码:

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

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

  1. 创建一个包装器String对象s,相当于使用new String(s)
  2. substring()使用String步骤1返回的对象上的相应参数调用该方法
  3. 处理String对象
  4. 返回步骤2中的字符串(基元).

这样做的结果是,虽然看起来好像你可以为基元分配属性,但它是没有意义的,因为你无法检索它们:

var s = "foo";
s.bar = "cheese";
alert(s.bar); // undefined
Run Code Online (Sandbox Code Playgroud)

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

数字和布尔也表现得这样.但是,函数是完全成熟的对象,并且继承自Object(实际上Object.prototype,但这是另一个主题).因此函数可以执行任何对象,包括具有以下属性:

function foo() {}
foo.bar = "tea";
alert(foo.bar); // tea
Run Code Online (Sandbox Code Playgroud)

  • 这个答案应该是最重要的:虽然选择的答案对于实际目的来说足够好,但这个答案更彻底(而且有趣!)谢谢! (9认同)
  • 这是正确的答案.并非一切都是对象.几乎所有东西都是一个对象.请参阅https://developer.mozilla.org/en-US/docs/JavaScript/A_re-introduction_to_JavaScript以获取javascript中的类型. (8认同)
  • @SteveFenton:是的,因为`new String('foo')`产生一个`String`对象,它的行为与任何其他对象一样,因为它继承自`Object.prototype`. (5认同)
  • 好答案.有趣的是,如果你使用`var s = new String('foo');`,那么`s.bar`将保留值`cheese`. (3认同)
  • 很棒的解释!实际上,除了原始类型之外,一切都是对象. (2认同)

cra*_*man 36

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

var obj = {}; // this is not the only way to create an object in JS
Run Code Online (Sandbox Code Playgroud)

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

obj['message'] = 'Hello'; // you can always attach new properties to an object externally
Run Code Online (Sandbox Code Playgroud)

要么

obj.message = 'Hello';
Run Code Online (Sandbox Code Playgroud)

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

obj['showMessage'] = function(){
    alert(this['message']);
}
Run Code Online (Sandbox Code Playgroud)

要么

obj.showMessage = function() {
    alert(this.message);
}
Run Code Online (Sandbox Code Playgroud)

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

obj.showMessage();
Run Code Online (Sandbox Code Playgroud)

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

var arr = [32, 33, 34, 35]; // one way of creating arrays in JS
Run Code Online (Sandbox Code Playgroud)

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

alert(arr[1]); // this would show 33
Run Code Online (Sandbox Code Playgroud)

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

alert(arr.length); // this would show 4
Run Code Online (Sandbox Code Playgroud)

有关详细信息,我强烈推荐John Resig的Pro Javascript技术.

  • 不,JavaScript中的所有内容都不是对象.字符串,数字,布尔值不是,尽管它们有对象. (16认同)
  • 只是一个附录,与这个主题并不相关,`length`属性不会返回数组中元素的数量.它返回该数组的`lastIndex + 1`.例如,在`var x = []; x [100] = 5; alert(x.length)`将警告`101`. (6认同)
  • 因为“没错,在 javascript 中,一切都是对象。”... (2认同)

syn*_*ism 9

句子"在JavaScript中,几乎所有东西都是一个对象"是正确的,因为MAIN代码单元(对象,函数,数组)是JavaScript对象.
JavaScript代码使用9个不同单位加1(多个):
- 01. array
- 02. boolean
- 03. function
- 04. null
- 05. number
- 06. object
- 07. regexp
- 08. string
- 09. undefined
- 10.倍数

JavaScript对象:
- 与其他面向对象语言中的"对象"不同.
- 它们是名称 - 值对的集合.
- 都具有创建功能(其构造函数).
- 所有INHERIT构造函数的prototype-object的成员,这是它的原型.
- 所有函数都是对象但并非所有对象都是函数.
- 函数有范围,对象不是(在我看来是一个设计缺陷).
- 对象,函数,数组,字符串,......第一个CAPITAL是函数!
- JS对象和函数的差异比它的共性更重要.
- JS中的名称'instance'与知识理论中的名称'instance'具有不同的含义,其中实例继承了其泛型概念的属性.在JS中只表示它的构造函数.JavaScript从"基于类的继承"ool(java)获得了名称"instance",它是一个合适的名称,因为这些对象继承了类的属性.
JS关键字'instanceof'的更好名称是'objectof'.

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

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

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

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

3)作为所有JS对象,它们的prototype-object与它的构造函数原型相同:

    > (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

  • 什么是多重?我没有找到任何关于多种类型的谷歌搜索引用. (3认同)

Sam*_*igh 7

基于developer.mozilla.org和 ECMAScript 规范,答案是否定的。从技术上讲,并非一切都是对象。

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

在 JavaScript 中,原始值(原始值,原始数据类型)是不是对象且没有方法的数据。有 7 种原始数据类型:string、number、bigint、boolean、null、undefined、symbol

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

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

所以在下面的代码中,当你调用toUpperCase()一个原始数据时,nameJavaScript 会自动包装字符串原始数据并调用 String 对象的 toUpperCase 函数

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

name.toUpperCase();
console.log(name); 
Run Code Online (Sandbox Code Playgroud)

在要在原始字符串上调用方法或发生属性查找的上下文中,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"
Run Code Online (Sandbox Code Playgroud)


DEV*_*CNN 5

不是所有的东西都是javaScript中的对象。JavaScript具有原语和对象。有六个原语-空,未定义,字符串,数字,布尔值和符号。由于可以访问的属性和功能,似乎一切都在充当对象。例如,

var stringvar="this string";
typeof stringvar; // "string"
stringvar.length; //11
Run Code Online (Sandbox Code Playgroud)

现在,由于“ stringvar”是一个字符串类型,它是一个原始类型,它不应该访问属性长度。之所以可以这样做,是因为有一个称为Boxing的东西。Boxing是将任何原始类型转换为Object类型的过程。这些对象类型或对象包装器的创建是基于这样的观点,即人们可能需要对原始值执行一些常见的操作。它们包含有用的方法和属性,并且是与原始图元链接的原型。就对象而言,键值对可以添加到每个对象,甚至数组。

var arr=[1,2,3];
arr.name="my array";
arr;  //[1,2,3,name:'my array']
Run Code Online (Sandbox Code Playgroud)

这并不意味着数组的第四个元素是“名称:'my array'“。“名称”是可以用点表示法(arr.name)或方括号表示法(arr [” name“])调用的属性。 。