JavaScript에서 연관 배열 a가 b에 할당된 후 a의 내용이 변경되면 왜 b도 변경됩니까?

WBOY
풀어 주다: 2016-08-23 09:17:45
원래의
1906명이 탐색했습니다.

<code>JS:
var a = {"Client":"jQuery","Server":"PHP"};
var b = a;
a["New"] = "Element";
console.log(b);
// 输出 Object { Client="jQuery",  Server="PHP",  New="Element"}

PHP例程1:
$a = array('Client'=>'jQuery','Server'=>'PHP');
$b = $a;
$a['New'] = 'Element';
var_export($b);
//输出 array('Client'=>'jQuery','Server'=>'PHP')

PHP例程2:
$a = array('Client'=>'jQuery','Server'=>'PHP');
$b = &$a; //引用赋值
$a['New'] = 'Element';
var_export($b);
//输出 array('Client'=>'jQuery','Server'=>'PHP','New'=>'Element')</code>
로그인 후 복사
로그인 후 복사

JavaScript에서 연관배열 a를 b에 할당한 후 a의 내용을 변경하면 왜 b도 변경되나요?

답글 내용:

<code>JS:
var a = {"Client":"jQuery","Server":"PHP"};
var b = a;
a["New"] = "Element";
console.log(b);
// 输出 Object { Client="jQuery",  Server="PHP",  New="Element"}

PHP例程1:
$a = array('Client'=>'jQuery','Server'=>'PHP');
$b = $a;
$a['New'] = 'Element';
var_export($b);
//输出 array('Client'=>'jQuery','Server'=>'PHP')

PHP例程2:
$a = array('Client'=>'jQuery','Server'=>'PHP');
$b = &$a; //引用赋值
$a['New'] = 'Element';
var_export($b);
//输出 array('Client'=>'jQuery','Server'=>'PHP','New'=>'Element')</code>
로그인 후 복사
로그인 후 복사

JavaScript에서 연관배열 a를 b에 할당한 후 a의 내용을 변경하면 왜 b도 변경되나요?

배열(문자열, 정수, 부울)과 같은 일반적이지 않은 유형의 경우 할당은 주소 복사와 동일합니다. 즉, a와 b는 동일한 주소를 차지합니다. 따라서 b가 변경되면 a도 변경됩니다. 본질적으로 a와 b는 동일합니다.

여기에 있는 이 답변이 더 자세히 설명되어 있습니다. 배열은 참조 유형 값이며 힙에 저장됩니다. https://www.zhihu.com/questio...

JS에서 값을 할당할 때 원본 유형(예: 문자열)은 복사된 값이고 참조 유형(예: 연관 배열)은 복사된 참조라고 인터넷에서 말하는 것을 봤습니다.

<code>var a = {"Client":"jQuery","Server":"PHP"};
var b = JSON.stringify(a); //转成字符串后赋值
a["New"] = "Element";
console.log(JSON.parse(b)); //使用时转回关联数组(对象)
//输出 Object { Client="jQuery",  Server="PHP"}

IE8不支持JSON.parse和JSON.stringify,需要引入json2.js:
http://www.json.org/js.html
https://github.com/douglascrockford/JSON-js/blob/master/json2.js
IE9以下版本:
<!--[if lt IE 9]><script src="json2.js"></script><![endif]--></code>
로그인 후 복사

JS 배열은 PHP만큼 유연하지 않다고 생각합니다. PHP는 & 선언을 사용한 참조 할당을 지원합니다. PHP 배열은 "쓰기 시 복사"입니다.

<code>echo round(memory_get_usage()/(1024*1024))."MB\n"; //0MB
$a = file('/home/eechen/note.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
echo round(memory_get_usage()/(1024*1024))."MB\n"; //9MB
$b = $a;
echo round(memory_get_usage()/(1024*1024))."MB\n"; //9MB(赋值后内存没有变化)
$b['new'] = 'element';
echo round(memory_get_usage()/(1024*1024))."MB\n"; //14MB(修改后内存发生变化,即写时复制)</code>
로그인 후 복사

a와 b가 모두 동일한 배열을 가리키기 때문입니다.

변경하지 않고 유지하려면 먼저 개체를 문자열로 변환한 다음 다시 개체로 변환하세요. 두 개의 다른 개체가 됩니다. 직접 사용하면 실제로는 하나입니다. 정답은 위에 주어졌습니다.

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!