배열의 요소를 다른 요소에 추가하고 싶었으므로 다음과 같이 시도했습니다.
[1,2] + [3,4]
다음과 같이 응답했습니다.
"1,23,4"
무슨 일이야?
[5,6,7][1,2]
것입니다 7
그것은 두 번째 배열의 마지막 항목을 사용하기 때문에. Oo
배열의 요소를 다른 요소에 추가하고 싶었으므로 다음과 같이 시도했습니다.
[1,2] + [3,4]
다음과 같이 응답했습니다.
"1,23,4"
무슨 일이야?
[5,6,7][1,2]
것입니다 7
그것은 두 번째 배열의 마지막 항목을 사용하기 때문에. Oo
답변:
+
연산자는 배열에 정의되지 않는다 .
Javascript 는 배열을 문자열로 변환하고 배열로 연결합니다.
이 질문과 결과적으로 제 답변이 많은 관심을 받고 있기 때문에 운영자가 일반적으로 어떻게 행동하는지에 대한 개요 를 갖는 것이 유용하고 적절하다고 생각했습니다 +
.
그래서, 여기에 간다.
E4X 및 구현 별 항목을 제외하고 Javascript (ES5 기준)에는 6 가지 기본 제공 데이터 유형이 있습니다 .
Null과 호출 가능한 Object에 대해 typeof
다소 혼란스럽게 반환 하지만 Null은 실제로 Object가 아니며 엄격하게 말하면 사양을 준수하는 Javascript 구현에서 모든 함수는 Object로 간주됩니다.object
function
맞습니다. 자바 스크립트에는 기본 배열 이 없습니다 . Array
통증을 완화하기 위해 구문 설탕으로 불리는 개체의 인스턴스 만 .
같은 기관 래퍼 혼란을 더 추가 new Number(5)
, new Boolean(true)
및 new String("abc")
의 모두 object
유형, 하나는 예상대로되지 숫자, 부울 또는 문자열. 그럼에도 불구하고 산술 연산자에 대한 Number
및 Boolean
번호와 같은 동작합니다.
쉬운가요? 그 모든 것을 벗어나면 개요 자체로 넘어갈 수 있습니다.
+
피연산자 유형별로 다른 결과 유형
|| undefined | null | boolean | number | string | object |
=========================================================================
undefined || number | number | number | number | string | string |
null || number | number | number | number | string | string |
boolean || number | number | number | number | string | string |
number || number | number | number | number | string | string |
string || string | string | string | string | string | string |
object || string | string | string | string | string | string |
* Chrome13, FF6, Opera11 및 IE9에 적용됩니다. 다른 브라우저와 버전을 확인하는 것은 독자의 연습으로 남아 있습니다.
참고 : CMS 에서 지적한 것처럼 Number
, Boolean
사용자 지정 개체와 같은 특정 개체의 경우 +
운영자가 반드시 문자열 결과를 생성하지는 않습니다. 객체 대 원시 변환의 구현에 따라 달라질 수 있습니다. 예를 들어 var o = { valueOf:function () { return 4; } };
평가는 o + 2;
생산 6
, a는 number
, 평가는 o + '2'
생산 '42'
a는 string
.
개요 테이블이 생성 된 방법을 보려면 http://jsfiddle.net/1obxuc7m/을 방문하십시오.
JavaScript +
연산자는 두 가지 숫자를 추가하거나 두 문자열을 결합하는 두 가지 목적이 있습니다. 배열에 대한 특정 동작이 없으므로 배열을 문자열로 변환 한 다음 결합합니다.
두 개의 배열을 결합하여 새 배열을 생성하려면 대신 메소드 를 사용 하십시오.concat
.
[1, 2].concat([3, 4]) // [1, 2, 3, 4]
한 배열에서 다른 배열로 모든 요소를 효율적으로 추가 하려면 .push 메소드 를 사용해야 합니다 .
var data = [1, 2];
// ES6+:
data.push(...[3, 4]);
// or legacy:
Array.prototype.push.apply(data, [3, 4]);
// data is now [1, 2, 3, 4]
+
운영자 의 동작은 ECMA-262 5e 섹션 11.6.1에 정의되어 있습니다 .
11.6.1 덧셈 연산자 (+)
더하기 연산자는 문자열 연결 또는 숫자 추가를 수행합니다. 생산
AdditiveExpression : AdditiveExpression + MultiplicativeExpression
은 다음과 같이 평가됩니다.
lref
평가 결과를 보자AdditiveExpression
.- 하자
lval
수GetValue(lref)
.rref
평가 결과를 보자MultiplicativeExpression
.- 하자
rval
수GetValue(rref)
.- 하자
lprim
수ToPrimitive(lval)
.- 하자
rprim
수ToPrimitive(rval)
.- 경우
Type(lprim)
입니다String
또는Type(rprim)
이다String
후,
- 연결 한
ToString(lprim)
뒤에 나오는 문자열을 반환합니다.ToString(rprim)
- 더하기 연산을 적용한 결과를
ToNumber(lprim)
및에 반환합니다ToNumber(rprim)
. 아래의 참고 사항을 참조하십시오 11.6.3.
각 피연산자가 변환 된 것을 볼 수 있습니다 ToPrimitive
. 더 자세히 읽으면 ToPrimitive
항상 배열을 문자열로 변환 하여이 결과를 생성 한다는 것을 알 수 있습니다.
Array.prototype.push.apply(data, [3, 4])
대신 더 자세한 정보를 사용 data.concat([3,4])
하시겠습니까?
concat
생성하면 호출 시간이 길어 기존 배열을 효율적으로 확장합니다 .
[].push.apply(data, [3,4])
약간 덜 장황하게 사용할 수 있습니다 . 또한 이는의 가치를 바꾸는 다른 사람들에게 저항력이 있습니다 Array
.
JavaScript로 연산자를 오버로드 할 수 있다면 좋을 수는 없지만 Javascript에서 사용자 정의 연산자 오버로드를 정의 할 수 있습니까? 비교하기 전에 문자열로 변환하는 "=="연산자 만 해킹 할 수 있습니다. http://blogger.xs4all.nl/peterned/archive/2009/04/01/462517.aspx
여기의 일부 답변은 예기치 않은 원하지 않는 출력 ( '1,23,4'
)이 발생하는 방법을 설명하고 일부는 예상되는 원하는 출력 ( [1,2,3,4]
), 즉 배열 연결 이라고 생각하는 것을 얻는 방법을 설명했습니다 . 그러나 원래의 질문에 단순히 "배열의 요소를 다른 배열에 추가하고 싶었습니다 ..."라고 말했기 때문에 예상되는 원하는 출력의 특성은 실제로 다소 모호합니다. 즉, 수 어레이 연결을 의미하지만, 수 도 (예를 들면 평균 튜플 첨가 여기 및 여기에 , 즉, 예를 들면, 초에 대응하는 요소의 스칼라 값으로 하나 개의 어레이에서 소자의 스칼라 값을 추가 조합) [1,2]
및 [3,4]
얻었다 [4,6]
.
두 어레이 모두 동일한 arity / length를 가정하면 다음과 같은 간단한 솔루션이 있습니다.
const arr1 = [1, 2];
const arr2 = [3, 4];
const add = (a1, a2) => a1.map((e, i) => e + a2[i]);
console.log(add(arr1, arr2)); // ==> [4, 6]