私が間違っていない限り (常に可能です)、すべての Python 変数はまったく同じです: 別の場所に格納されたデータ オブジェクトへの参照です。Python 変数はデータ値を保持しません。別の場所に格納されている値への常に逆参照されるポインターのみです。これは、x=3; と言って問題がないことを意味します。x="foo" です。x はポインターを保持するだけなので (そしてすべてのポインターは同じサイズです)、ポインターは 3 を指すことから始まり、ポインター (3 ではない) は文字列 "foo を指す別のポインターで上書きされます。 "。すべての関数呼び出しは、渡された引数のポインタが何を指しているかに関係なく、単にコピーされます。すべての型情報、不変性のルールなどは、変数ではなく、ポイントされているデータ オブジェクトに格納されます。
ただし、Javascript 変数については混乱しています。私は、基本とオブジェクトの 2 種類の JS 変数があることを読み続けています。Python のように、基本的なデータ型 (数値、文字列など) は変数自体に格納されますが、オブジェクトには参照が変数に格納されます。Java (JS ではない) はこの方法ですが、Java 変数には型が宣言されているため、「int x = 3;」とは言えません。x = "foo" ' 'int x' は、int のみを保持するようにカスタマイズされたメモリの一部を作成するためです。
しかし、JS では「var x=3;」と言うことができます。x="foo" ' 文句なし。int へのポインターではなく、int 自体を保持するために作成されたメモリの一部が、任意の文字列を保持するにはどうすればよいでしょうか? このJS 'x'は実際にはintを保持するふりをしているだけの参照ですか、それとも別の型を保持する必要がある場合、再割り当てによりメモリ内の場所が変更されますか? そして、文字列は JS の基本データ型であり、基本型の値は関数に渡されるときにコピーされると彼らは言っています。 「オブジェクト」タイプの場合のように、ポインターの 2 つのコピーの代わりに機能します。再帰は、巨大な文字列の膨大な数の複製を作成しますか?
私が知る限り、観測可能な動作は最終的に Python のようになり、本は実際に起こっていることと効果的な結果を明確に区別していません (関数で var を再割り当てしても変化しません)。呼び出し元などで) Javascript 変数の実際の基礎となるセマンティクスを明確にできる人はいますか?