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