1 across 2021-05-05 14:11:05 +08:00 不懂 php 。 {}是 object 类型,A 是做了 data[0]引用,改 A 就是改 data[0] |
![]() | 2 zero3412 OP @across 至少在 PHP 里,A 变量就是个完全独立的值了,只是复制了一份 data[0],直接蒙逼了哇,这操作太神奇了。 |
![]() | 4 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) } } ``` |
![]() | 5 aijam 2021-05-05 14:15:37 +08:00 搞清楚“对象”和“引用”的关系。列表和变量存的都是引用,而通过引用改变的都是同一个对象。 |
![]() | 6 ashong 2021-05-05 14:15:45 +08:00 let A = Object.assign({}, data[0]); |
![]() | 7 zero3412 OP ![]() @across @dzdh @aijam @ashong 谢谢各位,找了一篇文章学习了一下 https://segmentfault.com/a/1190000014724227 特别是 “列表和变量存的都是引用,而通过引用改变的都是同一个对象。” 精辟 |
![]() | 8 ericgui 2021-05-05 14:23:23 +08:00 Javascript 是 pass by reference |
9 Jirajine 2021-05-05 14:39:50 +08:00 via Android @across 全部都是按引用传递,所谓“按值传递”是一种 inline 优化,对程序员是透明的,这些语言没有 deref 操作。 |
![]() | 10 JerryCha 2021-05-05 14:48:48 +08:00 ![]() data[0]传递的实际是指针,小伙子 C 没学好吧 |
![]() | 11 Rocketer 2021-05-05 14:57:25 +08:00 via iPhone 实际上传指针才是主流,PHP 那种默认传值,加了&才传指针的,属于少数派 |
![]() | 12 HashV2 2021-05-05 15:08:24 +08:00 很多语言都这样吧,引用 |
![]() | 13 godbasin 2021-05-05 15:09:09 +08:00 因为 A 拿到的是 data[0] 的引用 |
![]() | 14 ipwx 2021-05-05 15:16:15 +08:00 ![]() 大部分语言,C#, Java, Javascript, Scala, Python 都是这个逻辑。PHP 是少数。 C++ 程序员不会有这个疑问,因为他们天天和 T* T& T 打交道 |
![]() | 15 InternetExplorer 2021-05-05 15:19:47 +08:00 ![]() php 的数组是值类型,而且是写是复制,大数组赋值起来很快,改到的时候才会真正复制值。 js 的对象 { }(包括数组 [ ] ) 是引用类型,赋值就是传一下引用,都是指向同一个对象的。 |
![]() | 16 hejingyuan199 2021-05-05 15:29:05 +08:00 我平时基本只用 php,但我感觉 Javascript 这个才更符合编程本质吧。 没深入研究过 php 这个问题。 |
![]() | 17 Justfakemoz 2021-05-05 15:31:32 +08:00 。。。除了基础类型,赋值都是引用 |
![]() | 18 zjsxwc 2021-05-05 15:38:08 +08:00 感觉楼主在抹黑 php 。 php 里你用对象照样也和 js 得到一样的结果。 无非是 js 里面 {} 表示对象,php 里面 [] 表示数组不是对象。 |
19 jeffwcx 2021-05-05 16:04:17 +08:00 看得我一脸懵逼,我还以为有啥问题呢 |
20 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. |
21 ShuoHui 2021-05-05 16:12:27 +08:00 via iPhone 不懂 php,pythoner 感觉没毛病啊…… |
22 Rache1 2021-05-05 16:42:04 +08:00 PHP 里面对象也是引用的,数组不是 |
23 darknoll 2021-05-05 16:47:45 +08:00 这不是最基础的东西? |
24 charlie21 2021-05-05 16:55:39 +08:00 1 Javascript let arr1 = [1,2,3,4]; let arr2 = arr1; arr2[0] = 99; console.log(arr2); // [99,2,3,4] console.log(arr1); // [99,2,3,4] Javascript let arr1 = [1,2,3,4]; let arr2 = [...arr1]; arr2[0] = 99; console.log(arr2); // [99,2,3,4] console.log(arr1); // [1,2,3,4] Javascript let d1 = { x: 1, y:2 }; let d2 = d1; d2.x = 80; console.log(d2); // { x: 80, y: 2 } console.log(d1); // { x: 80, y: 2 } Javascript let d1 = { x: 1, y:2 }; let d2 = {...d1}; d2.x = 80; console.log(d2); // { x: 80, y: 2 } console.log(d1); // { x: 1, y: 2 } 关键词 js spread operator 2 PHP $arr1 = [1,2,3,4]; $arr2 = $arr1; $arr2[0] = 99; var_export($arr2); // [99,2,3,4] var_export($arr1); // [1,2,3,4] PHP $arr1 = [1,2,3,4]; $arr2 = &$arr1; $arr2[0] = 99; var_export($arr2); // [99,2,3,4] var_export($arr1); // [99,2,3,4] 3 C# int[] arr1 = new int[]{1,2,3,4}; int[] arr2 = arr1; arr2[0] = 99; Console.WriteLine(String.Join(" ", arr2)); // 99 2 3 4 Console.WriteLine(String.Join(" ", arr1)); // 99 2 3 4 C# using System.Collections.Generic; List<int> list1 = new List<int>{1,2,3,4}; List<int> list2 = new List<int>(list1); list2[0] = 99; list2.ForEach(Console.WriteLine); // 99 2 3 4 list1.ForEach(Console.WriteLine); // 1 2 3 4 C# using System.Collections.Generic; List<int> list1 = new List<int>{1,2,3,4}; List<int> list2 = list1; list2[0] = 99; list2.ForEach(Console.WriteLine); // 99 2 3 4 list1.ForEach(Console.WriteLine); // 99 2 3 4 |
![]() | 25 icanfork 2021-05-05 17:15:21 +08:00 via iPhone 面试面基础还是很有必要的,即使是八股文 很多人即使自己不知道为什么,也不尝试去弄清楚为什么 |
![]() | 26 OHyn 2021-05-05 17:23:15 +08:00 这个在 java 、c 里头也是一样的呀。。。传值和传引用嘛 |
![]() | 27 iyaozhen 2021-05-05 19:39:41 +08:00 PHP 虽然说是传值,但实际也是引用。然后有个写死复制的机制,就是当发现要修改 A 时,是复制了一份。 省去了需要自己 copy 的问题,比较符合人的思维 |
28 WillBC 2021-05-05 22:03:59 +08:00 via iPhone 等你感受一下 deep clone |
![]() | 29 Nitroethane 2021-05-05 22:14:38 +08:00 @JerryCha data[0] 不一定传引用啊,得看 data 的数据类型,如果是 char* data[],那 data[0] 就传的是指针,如果是 char data[],data[0] 照样传值 |
![]() | 30 anguiao 2021-05-05 22:38:50 +08:00 via Android 虽然 JS 确实很神奇,但是这个是常规操作。 |
![]() | 31 Yvette 2021-05-06 04:51:24 +08:00 JS 里除了 primitive types 是 pass by value 之外,其余所有的都是 reference |
![]() | 32 xuanbg 2021-05-06 06:39:25 +08:00 因为 let A = data[0]; let B = data[1]; 所以 data 的值变成 [ {x:2, y:3}, {x:2, y:3}, ]; |
![]() | 33 xuanbg 2021-05-06 06:40:16 +08:00 因为 let A = data[0]; let B = data[1]; A.x = B.x; A.y = B.y; 所以 data 的值变成 [ {x:2, y:3}, {x:2, y:3}, ]; |
![]() | 34 Marszm 2021-05-06 08:46:20 +08:00 这种需要深拷贝.....PHP 这波属于非主流操作 |
![]() | 35 itechify PRO JAVA 的路过,要不是这样的结果才奇怪 |
![]() | 36 luckyboy6 2021-05-06 09:00:52 +08:00 js 按值传递和 按引用传递的区别 let A = data[0] 时,A 只是一个指针 指向堆区的 data[0] : {x:0,y:1},所以改变 A.x 时改变的是 data[0]。 |
![]() | 37 meloncc 2021-05-06 09:12:50 +08:00 这个问题与 Javascript 没有关系 |
38 gtanyin 2021-05-06 10:17:02 +08:00 果然学编程应该从 C 学起,不然连指针的概念都要惊讶半天 |
39 liuky 2021-05-06 10:57:20 +08:00 ![]() 楼主高级黑 |
![]() | 40 misaka19000 2021-05-06 10:59:55 +08:00 这是来黑 PHP 的吧 |
41 Leiothrix 2021-05-06 11:19:20 +08:00 Javascript 浅拷贝和深拷贝的区别,浅拷贝两个对象指向同一个地址,深拷贝是新开栈,两个对象指向不同的地址。可使用 JSON.parse(JSON.stringify(obj))进行深拷贝,修改后不会影响到原对象数据。 |
![]() | 42 ganbuliao 2021-05-06 11:34:34 +08:00 object 对象默认是引用 知道这个就清楚了 |
![]() | 43 kamal 2021-05-06 11:54:06 +08:00 |
![]() | 44 est 2021-05-06 12:05:24 +08:00 楼主低级黑 |
45 zhuweiyou 2021-05-06 14:06:48 +08:00 我感觉你在黑 PHP |
46 zhengfan2016 2021-05-06 15:13:59 +08:00 为什么我看着觉得很正常,我第一门语言是 python,有没有老哥给我讲讲哪儿不正常 233 |
![]() | 47 IvanLi127 2021-05-06 16:47:43 +08:00 我记得 php 里也有引用传参啊,楼主用的啥版本的 php,代码放出来我们品品? |
![]() | 48 MonkeyD1 2021-05-06 17:26:45 +08:00 指针啊 |
49 AoEiuV020 2021-05-06 17:29:13 +08:00 深拷贝,浅拷贝,js 无关,一般都有这些区别, |
50 vueli 2021-05-06 17:40:12 +08:00 前面的 = 是指向 |
![]() | 51 ruike007 2021-05-06 17:42:53 +08:00 这不是深浅拷贝的问题吗?基础啊,大哥 |
![]() | 52 karott7 2021-05-06 17:45:16 +08:00 这不前端正常操作?赋值对象都是引用 |
53 fescover 2021-05-06 17:54:43 +08:00 正常操作,还有更 bt 的,猜猜下面输出什么 NaN===NaN null===null null==NaN {}==={} []===[] ""==="" |