除非我弄错了(总是可能的),否则所有 Python 变量都是完全相同的:对存储在其他地方的数据对象的引用。没有 Python 变量保存数据值,只有一个始终取消引用的指向存储在别处的值的指针。这意味着说 x=3 没有问题;x="foo",因为 x 只保存一个指针(并且所有指针具有相同的大小),它开始指向三个,然后指针(不是 3)被另一个指向字符串“foo”的指针覆盖”。所有函数调用都只是复制传递给它们的参数中的指针,而不管它们指向什么。所有类型信息、不变性规则等都存储在指向的数据对象中,而不是变量中。
不过,我对 Javascript 变量感到困惑。我一直在读到有两种类型的 JS 变量,基础和对象。基本数据类型(数字、字符串等)存储在变量本身中,而对象的引用存储在变量中,如 Python。Java(不是JS)是这样的,但是Java变量有一个声明的类型,所以你不能说,'int x = 3; x = "foo" ' 因为 'int x' 创建了一块内存,定制为只保存一个 int。
但是 JS 让你说,'var x=3; x="foo" ' 没有抱怨。为保存 int 而不是指向 int 的指针而是 int 本身而创建的一块内存如何也保存任意字符串?这个 JS 'x' 实际上是一个引用,只是假装持有 int,或者如果它需要持有不同的类型,重新分配是否会导致它改变内存中的位置,或者什么?他们说字符串是 JS 中的基本数据类型,并且基本类型的值在传递给函数时会被复制,因此对于非常长的字符串,如果将字符串传递给函数而不是指针的两个副本,就像“对象”类型的情况一样。递归会产生大量重复的巨大字符串吗?
据我所知,可观察到的行为最终就像 Python,并且书籍并没有明确区分真正发生的事情和有效后果(在函数中重新分配 var 并不会改变它在调用者等)任何人都可以澄清Javascript变量的真实底层语义吗?