【发布时间】:2016-10-12 16:37:20
【问题描述】:
我听说 JavaScript 实际上并不像其他语言那样“指向”内存中的值(或对象,因为在 JS 中一切都是对象)。相反,JS 变量引用内存中的其他值/对象。这是真的?指向和引用之间的语义区别是什么?
【问题讨论】:
-
您不能对引用变量进行指针运算。 “与其他语言一样” - 各种其他语言都有“引用”而不是“指针”。
标签: javascript variables reference
我听说 JavaScript 实际上并不像其他语言那样“指向”内存中的值(或对象,因为在 JS 中一切都是对象)。相反,JS 变量引用内存中的其他值/对象。这是真的?指向和引用之间的语义区别是什么?
【问题讨论】:
标签: javascript variables reference
JavaScript 变量名称用作保存变量值的对象的属性名称键,例如代码范围内函数的environment record 对象或全局对象本身。所以变量名访问变量值和数据类型的对象属性实现。
在这个模型下,是的,JavaScript 值不会“指向”任何东西,它们是保存变量值的对象的属性名称。
Javscript 中的一切都是对象?没有。Javascript 包含原始数据类型,例如“数字”、“布尔”、“空”等,可以用内存中有限数量的八位字节表示,原始数据类型“字符串”可以使用可变数量的内存,以及一个复杂的数据类型“对象”,它也可以使用可变数量的内存。 每种数据类型如何保存在对象属性中并被调用以供访问取决于实现,并且超出了此答案的范围。
根据 cmets 中链接的问题,指针是使用内存地址的特定类型的引用。更一般地说,“引用”涵盖了用于访问另一个值的任何值,并且可能包括内存地址、表索引或用于访问某些内容的键。
为了完整性
对象数据类型实际上是一种引用数据类型,它包含一个引用某种,Javascript 引擎使用该引用来访问为对象保存的数据。相同对象引用的每个等值副本都访问相同的底层对象数据结构。
因此,对作为参数传递给函数的对象属性所做的更改在返回时会持续存在,并且在多个变量设置为相同对象值的情况下,每个变量都访问同一组对象属性。
【讨论】:
Number 和 String 这样的原始类型也是对象。它们的内部表示方式可能与其他类型的对象不同,但它们仍然是对象。 (它们有属性、原型等等。)
Number 和 String 对象是原始数据类型的包装器。但是,如果将这样的原始值用作对象,则原始类型将在操作期间转换为其包装对象的实例,并且不再转换。例如,将var n=1; n.x="x" 之后的n.x 的值与var n = new Number(1); n.x="x" 进行比较(两者都不会引发错误)。 @RaymondChen
"JavaScript variable names are used as property name keys of an object",谁能澄清1)这个对象是什么? 2) 它有什么属性?我希望能够将其可视化。我知道有两种值类型(基元和对象),并且我知道基元具有相应的对象包装器,因此可以在它们上调用方法。但我还不能理解的是标识符(即变量的“名称”)如何成为对象的属性,如果是,那么该对象是什么以及它是什么样的?谢谢。
console.log() 显示这种对象信息。