Skip to content

Commit

Permalink
[ko] JavaScript: Symbol 메서드 2개 추가 (mdn#13060)
Browse files Browse the repository at this point in the history
* [ko] JavaScript: Symbol 메서드 2개 추가

- Symbol.hasInstance 추가
- Symbol.isConcatSpreadable 추가

* [ko] 리뷰 반영

부울 -> 불리언
  • Loading branch information
wisedog authored Jun 8, 2023
1 parent eab41cc commit 7eb5294
Show file tree
Hide file tree
Showing 2 changed files with 177 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
---
title: Symbol.hasInstance
slug: Web/JavaScript/Reference/Global_Objects/Symbol/hasInstance
l10n:
sourceCommit: d27cac7971d2797448b8d037dfbcb460e512fdcd
---

{{JSRef}}

**`Symbol.hasInstance`** 정적 데이터 속성은 [잘 알려진 심볼](/ko/docs/Web/JavaScript/Reference/Global_Objects/Symbol#잘_알려진_심볼) `@@hasInstance`를 나타냅니다.
{{jsxref("Operators/instanceof", "instanceof")}} 연산자는 생성자 객체가 객체를 인스턴스로 인식하는지 여부를 확인하기 위해
사용하는 메서드의 오른쪽 피연산자에서 이 심볼을 찾습니다.

{{EmbedInteractiveExample("pages/js/symbol-hasinstance.html")}}

##

잘 알려진 심볼 `@@hasInstance`.

{{js_property_attributes(0, 0, 0)}}

## 설명

`instanceof` 연산자는 다음 알고리즘을 사용하여 `object instanceof constructor`의 반환 값을 계산합니다.

1. `constructor``@@hasInstance` 메서드가 있는 경우, 첫 번째 인수로 `object`를 사용하여 호출하고 [불리언으로 강제 변환](/ko/docs/Web/JavaScript/Reference/Global_Objects/Boolean#boolean_coercion)된 결과를 반환합니다.
`constructor`가 객체가 아니거나 `constructor[@@hasInstance]``null`, `undefined`, 함수 중 하나가 아닌 경우 {{jsxref("TypeError")}}가 발생합니다.

2. 그렇지 않으면, `constructor``@@hasInstance` 메서드가 없는 경우(`constructor[@@hasInstance]``null` 또는 `undefined`),
[`Function.prototype[@@hasInstance]`](/ko/docs/Web/JavaScript/Reference/Global_Objects/Function/@@hasInstance)와 동일한 알고리즘을 사용하여 결과를 결정합니다.
`constructor`가 함수가 아닌 경우 {{jsxref("TypeError")}}가 발생합니다.

모든 함수는 기본적으로 `Function.prototype`을 상속하기 때문에, 대부분의 경우 [`Function.prototype[@@hasInstance]`](/ko/docs/Web/JavaScript/Reference/Global_Objects/Function/@@hasInstance) 메서드는 오른쪽이 함수인 경우 `instanceof`의 동작을 지정합니다.

## 예제

### 사용자 지정 instanceof 동작

예를 들어 다음과 같이 사용자 정의 `instanceof` 동작을 구현할 수 있습니다.

```js
class MyArray {
static [Symbol.hasInstance](instance) {
return Array.isArray(instance);
}
}
console.log([] instanceof MyArray); // true
```

```js
function MyArray() {}
Object.defineProperty(MyArray, Symbol.hasInstance, {
value(instance) {
return Array.isArray(instance);
},
});
console.log([] instanceof MyArray); // true
```

### 객체의 인스턴스 검사하기

`instanceof` 키워드를 사용하여 객체가 클래스의 인스턴스 여부를 확인할 수 있는 것과 같은 방법으로
`Symbol.hasInstance`를 사용하여 동일한 검사를 수행할 수 있습니다.

```js
class Animal {
constructor() {}
}

const cat = new Animal();

console.log(Animal[Symbol.hasInstance](cat)); // true
```

## 명세서

{{Specifications}}

## 브라우저 호환성

{{Compat}}

## 같이 보기

- {{jsxref("Operators/instanceof", "instanceof")}}
- [`Function.prototype[@@hasInstance]()`](/ko/docs/Web/JavaScript/Reference/Global_Objects/Function/@@hasInstance)
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
---
title: Symbol.isConcatSpreadable
slug: Web/JavaScript/Reference/Global_Objects/Symbol/isConcatSpreadable
l10n:
sourceCommit: 427e8d03276b4915c08c5f0541452fb1c830c295
---

{{JSRef}}

**`Symbol.isConcatSpreadable`** 정적 데이터 속성은 [잘 알려진 심볼](/ko/docs/Web/JavaScript/Reference/Global_Objects/Symbol#잘_알려진_심볼) `@@isConcatSpreadable`을 나타냅니다.
{{jsxref("Array.prototype.concat()")}} 메서드는 연결된 각 객체에서 이 심볼을 찾아 유사 배열과 객체로 취급하고
해당 배열 요소로 평탄화해야 하는지 여부를 결정합니다.

{{EmbedInteractiveExample("pages/js/symbol-isconcatspreadable.html")}}

##

잘 알려진 심볼 `@@isConcatSpreadable`.

{{js_property_attributes(0, 0, 0)}}

## 설명

`@@isConcatSpreadable` 심볼(`Symbol.isConcatSpreadable`)은 자체 또는 상속된 속성으로
정의할 수 있으며, 그 값은 불리언입니다. 아래와 같이 배열 및 배열 유사 객체에 대한 동작을 제어할 수 있습니다.

- 배열 객체의 경우 기본 동작은 요소를 펼치는(평평하게 하는) 것입니다.
`Symbol.isConcatSpreadable`은 이러한 경우 평탄화를 피할 수 있습니다.
- 배열과 유사한 객체의 경우 기본 동작은 펼치거나 평평하게 하지 않는 것입니다.
`Symbol.isConcatSpreadable`은 이러한 경우 평탄화를 강제할 수 있습니다.

## 예제

### 배열

기본적으로 {{jsxref("Array.prototype.concat()")}}는 여러 배열을 하나의 결과로 펼칩니다(평평하게 만듭니다).

```js
const alpha = ["a", "b", "c"];
const numeric = [1, 2, 3];

const alphaNumeric = alpha.concat(numeric);

console.log(alphaNumeric); // 결과: ['a', 'b', 'c', 1, 2, 3]
```

`Symbol.isConcatSpreadable``false`로 설정하면 기본 동작을 비활성화할 수 있습니다.

```js
const alpha = ["a", "b", "c"];
const numeric = [1, 2, 3];

numeric[Symbol.isConcatSpreadable] = false;
const alphaNumeric = alpha.concat(numeric);

console.log(alphaNumeric); // Result: ['a', 'b', 'c', [1, 2, 3] ]
```

### 유사 배열 객체

유사 배열 객체에서는 기본 동작이 평탄화시키지 않는 것입니다.
배열을 평탄화시키고 싶다면 `Symbol.isConcatSpreadable``true`로 설정할 필요가 있습니다.

```js
const x = [1, 2, 3];

const fakeArray = {
[Symbol.isConcatSpreadable]: true,
length: 2,
0: "hello",
1: "world",
};

x.concat(fakeArray); // [1, 2, 3, "hello", "world"]
```

> **참고:** `length` 속성은 추가할 객체 속성의 수를 제어하는 데 사용됩니다.
> 위의 예제에서 `length:2`는 2개의 속성이 추가되었다는 것을 가리킵니다.
## 명세서

{{Specifications}}

## 브라우저 호환성

{{Compat}}

## 같이 보기

- [Polyfill of `Symbol.isConcatSpreadable` in `core-js`](https://github.com/zloirock/core-js#ecmascript-symbol)
- {{jsxref("Array.prototype.concat()")}}

0 comments on commit 7eb5294

Please sign in to comment.