我在许多 JavaScript 介绍中阅读了很多。我就是不明白。我一直认为对象是具有方法和属性的东西。我理解数组,因为它有键值对。“字符串”或“数字”或“函数”怎么样?上面列出的这些东西对我来说似乎是函数。这意味着你输入一些东西,你得到一些东西。您并没有真正获得访问属性或任何东西。在数组或这个“对象”列表中没有使用点符号。
有没有人用点符号对其中的每一个编写一些示例,其中的方法和属性正在被访问?我怀疑对象的定义可能是有限的,因为我确实开始学习 JavaScript ......
我在许多 JavaScript 介绍中阅读了很多。我就是不明白。我一直认为对象是具有方法和属性的东西。我理解数组,因为它有键值对。“字符串”或“数字”或“函数”怎么样?上面列出的这些东西对我来说似乎是函数。这意味着你输入一些东西,你得到一些东西。您并没有真正获得访问属性或任何东西。在数组或这个“对象”列表中没有使用点符号。
有没有人用点符号对其中的每一个编写一些示例,其中的方法和属性正在被访问?我怀疑对象的定义可能是有限的,因为我确实开始学习 JavaScript ......
不,在 JavaScript 中并非所有东西都是对象。您经常与之交互的许多事物(字符串、数字、布尔值)都是基元,而不是对象。与对象不同,原始值是不可变的。由于这些原语确实有对象包装器(String
,Number
和Boolean
),情况变得复杂;这些对象有方法和属性,而原语没有,但原语似乎有方法,因为当代码尝试访问原语的任何属性时,JavaScript 会默默地创建一个包装对象。
例如,考虑以下代码:
var s = "foo";
var sub = s.substring(1, 2); // sub is now the string "o"
在幕后,s.substring(1, 2)
表现得好像在执行以下(近似)步骤:
String
从 中创建一个包装对象s
,相当于使用new String(s)
substring()
的String
对象上调用具有适当参数的方法String
对象这样做的结果是,虽然看起来您可以为基元分配属性,但这是毫无意义的,因为您无法检索它们:
var s = "foo";
s.bar = "cheese";
alert(s.bar); // undefined
发生这种情况是因为该属性有效地定义在String
立即丢弃的对象上。
数字和布尔值也有这种行为。然而,函数是完全成熟的对象,并且继承自Object
(实际上Object.prototype
,但那是另一个话题)。因此,函数可以做任何对象可以做的事情,包括拥有属性:
function foo() {}
foo.bar = "tea";
alert(foo.bar); // tea
没错:在 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']);
}
或者
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 Techniques。
“在 JavaScript 中,几乎所有东西都是对象”这句话是正确的,因为主要代码单元(对象、函数、数组)是 JavaScript 对象。
JavaScript 代码使用 9 个不同的单位加 1(多个):
- 01.array
- 02.boolean
- 03.function
- 04.null
- 05.number
- 06.object
- 07.regexp
- 08.string
- 09.undefined
- 10. 多个
但是JavaScript 对象:
- 与其他面向对象语言中的“对象”不同。
- 它们是名称-值对的集合。
- 都有一个创建函数(它的构造函数)。
- 所有继承其构造函数原型对象的成员,这是它的原型。
- 所有函数都是对象,但并非所有对象都是函数。
- 函数有作用域,对象没有(我认为这是一个设计缺陷)。
- 对象,函数,数组,字符串,......第一个大写的是函数!!!
- JS 对象和函数的不同比其共性更重要。
- JS 中的名称“实例”与知识理论中的名称“实例”具有不同的含义,其中实例继承了其通用概念的属性。在 JS 中只表示它的构造函数。JavaScript 从“基于类的继承”工具 (java) 中获得了名称“实例”,它是一个合适的名称,因为这些对象继承了类的属性。
JS 关键字“instanceof”的更好名称是“objectof”。
JS 函数是 JS 对象,因为:
1)它们可以拥有像 JS 对象这样的成员:
> 函数 f(){} 不明确的 > fs = "一个字符串" “一个字符串” > fs “一个字符串”
2) 他们有一个构造函数,就像所有的 JS 对象一样,Function 函数:
> (function f(){}) instanceof Function 真的
3) 与所有 JS 对象一样,它们的原型对象与其构造函数原型相同:
> (function f(){}).__proto__ === Function.prototype 真的 > ({}).__proto__ === Object.prototype 真的 > (new Object).__proto__ === Object.prototype 真的
4) 当然,作为特定 JS 对象的 JS 函数具有额外的属性,就像编程语言中的所有函数一样,JS 对象没有,就像您可以使用输入和输出信息调用(执行)它们一样。
一切都不是对象,因为,例如,我们不能向文字字符串添加成员:
> var s = "字符串" 不明确的 > s.s2 = "s2string" “s2string” > s.s2 不明确的
并非所有东西都是 JavaScript 中的对象。JavaScript 有原语和对象。有六个原语-null、undefined、string、number、boolean 和symbol。由于可以访问的属性和功能,似乎一切都在充当对象。例如-
var stringvar="this string";
typeof stringvar; // "string"
stringvar.length; //11
现在因为“stringvar”是一个字符串类型,它是一个原始类型,它不应该能够访问属性长度。它可以这样做,因为有一种叫做装箱的东西。装箱是将任何原始类型转换为对象类型的过程反之称为拆箱。创建这些对象类型或对象包装器时,认为有一些可能需要对原始值执行的常见操作。它们包含有用的方法和属性,并且原型链接到原始值。就对象而言,键值对可以添加到每个对象中,甚至可以添加到数组中。
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、number、bigint、boolean、null、undefined、symbol
原语不是对象,没有方法,它也是不可变的。除了 null 和 undefined 之外,所有其他原语都有一个环绕它们的对象,为您提供一些可以使用的函数。例如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 对象和原始字符串值。
var nameP = 'Tom';
var nameO = new String(nameP);
typeof nameP // "string"
typeof nameO // "object"