神奇的 Javascript,谁能告诉我为什么

2021-05-05 14:08:42 +08:00
 zero3412
let data = [
{x:0, y:1},
{x:2, y:3},
];

let A = data[0];
let B = data[1];

A.x = B.x;
A.y = B.y;

console.log(data, A, B)

为什么 data[0].x == 2 ???
明明申请了变量 A,我只想改变变量 A,怎么连 data 的值都变了
这是什么原理,搞 PHP 的搞不明白啊
7054 次点击
所在节点    JavaScript
53 条回复
across
2021-05-05 14:11:05 +08:00
不懂 php 。
{}是 object 类型,A 是做了 data[0]引用,改 A 就是改 data[0]
zero3412
2021-05-05 14:12:28 +08:00
@across 至少在 PHP 里,A 变量就是个完全独立的值了,只是复制了一份 data[0],直接蒙逼了哇,这操作太神奇了。
across
2021-05-05 14:13:59 +08:00
@zero3412 php 不知道,但我接触的大语言,都是自定义类型按引用传递,基础类型按值传递的····
dzdh
2021-05-05 14:14:24 +08:00
PHP 的话是这样的:

```
php > $a = new StdClass();
php > $a->a = new StdClass();
php > $b = $a->a;
php > $b->ee = 3;
php > var_dump($a);
object(stdClass)#1 (1) {
["a"]=>
object(stdClass)#2 (1) {
["ee"]=>
int(3)
}
}
```
aijam
2021-05-05 14:15:37 +08:00
搞清楚“对象”和“引用”的关系。列表和变量存的都是引用,而通过引用改变的都是同一个对象。
ashong
2021-05-05 14:15:45 +08:00
let A = Object.assign({}, data[0]);
zero3412
2021-05-05 14:23:02 +08:00
@across @dzdh @aijam @ashong

谢谢各位,找了一篇文章学习了一下 https://segmentfault.com/a/1190000014724227
特别是 “列表和变量存的都是引用,而通过引用改变的都是同一个对象。” 精辟
ericgui
2021-05-05 14:23:23 +08:00
JavaScript 是 pass by reference
Jirajine
2021-05-05 14:39:50 +08:00
@across 全部都是按引用传递,所谓“按值传递”是一种 inline 优化,对程序员是透明的,这些语言没有 deref 操作。
JerryCha
2021-05-05 14:48:48 +08:00
data[0]传递的实际是指针,小伙子 C 没学好吧
Rocketer
2021-05-05 14:57:25 +08:00
实际上传指针才是主流,PHP 那种默认传值,加了&才传指针的,属于少数派
HashV2
2021-05-05 15:08:24 +08:00
很多语言都这样吧,引用
godbasin
2021-05-05 15:09:09 +08:00
因为 A 拿到的是 data[0] 的引用
ipwx
2021-05-05 15:16:15 +08:00
大部分语言,C#, Java, Javascript, Scala, Python 都是这个逻辑。PHP 是少数。

C++ 程序员不会有这个疑问,因为他们天天和 T* T& T 打交道
InternetExplorer
2021-05-05 15:19:47 +08:00
php 的数组是值类型,而且是写是复制,大数组赋值起来很快,改到的时候才会真正复制值。
js 的对象 { }(包括数组 [ ] ) 是引用类型,赋值就是传一下引用,都是指向同一个对象的。
hejingyuan199
2021-05-05 15:29:05 +08:00
我平时基本只用 php,但我感觉 JavaScript 这个才更符合编程本质吧。

没深入研究过 php 这个问题。
Justfakemoz
2021-05-05 15:31:32 +08:00
。。。除了基础类型,赋值都是引用
zjsxwc
2021-05-05 15:38:08 +08:00
感觉楼主在抹黑 php 。

php 里你用对象照样也和 js 得到一样的结果。

无非是 js 里面 {} 表示对象,php 里面 [] 表示数组不是对象。
jeffwcx
2021-05-05 16:04:17 +08:00
看得我一脸懵逼,我还以为有啥问题呢
jonsun30
2021-05-05 16:07:44 +08:00
Everthing using a dot in JS is an object.

When you store a non-primitive value some where or you pass it to a function, it is passed by reference, you are passing a pointer to it.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/774968

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX