Number 객체가 속성을 보유하여 숫자를 증가시키면 이 코드에서 어떤 일이 발생합니까?
최근 트윗에는 이 JavaScript 조각이 포함되어 있습니다.
그 안에서 무슨 일이 일어나고 있는지 누가 차근차근 설명해 주시겠어요?
> function dis() { return this }
undefined
> five = dis.call(5)
Number {[[PrimitiveValue]]: 5}
> five.wtf = 'potato'
"potato"
> five.wtf
"potato"
> five * 5
25
> five.wtf
"potato"
> five++
5
> five.wtf
undefined
> five.wtf = 'potato?'
"potato?"
> five.wtf
undefined
> five
6
특히, 내게는 명확하지 않다.
- 왜왜
dis.call(5)
는 입니다.Number
꿍꿍이속셈을[[PrimitiveValue]]
의 결과입니다.five++
★★★★★★★★★★★★★★★★★」five * 5
한 인 것5
★★★★★★★★★★★★★★★★★」25
)Number
- ??
five.wtf
이five++
- ??
five.wtf
은 더 할 수 없게five++
five.wtf = 'potato?'
이치
OP는 이쪽입니다.Stack Overflow에서 이것을 볼 수 있는 것은 이상합니다. : )
동작을 설명하기 전에 몇 가지 사항을 명확히 하는 것이 중요합니다.
Number 값과 Number 객체(
a = 3
»a = new Number(3)
는 매우 다릅니다.하나는 원시적인 것이고 다른 하나는 물체입니다.기본 요소에는 속성을 할당할 수 없지만 개체에는 할당할 수 있습니다.그 둘 사이의 강요는 암묵적이다.
예를 들어 다음과 같습니다.
(new Number(3) === 3) // returns false (new Number(3) == 3) // returns true, as the '==' operator coerces (+new Number(3) === 3) // returns true, as the '+' operator coerces
모든 식에는 반환값이 있습니다.REP가 식을 읽고 실행하면 다음과 같이 표시됩니다.리턴 값은 종종 당신이 생각하는 것을 의미하지 않고 사실이 아닌 것을 암시합니다.
네, 갑시다.
공약.
> function dis() { return this }
undefined
> five = dis.call(5)
[Number: 5]
의 dis
그리고 그것을 로 부른다.5
.이 기능을 할 수 있습니다.5
this
여기서 Number 값은 Number 개체로 강제됩니다.우리가 엄격한 방식을 취했다면 일어나지 않았을 것이라는 것을 유념하는 것이 매우 중요하다.
> five.wtf = 'potato'
'potato'
> five.wtf
'potato'
, 그럼 에는 속성을 해 보겠습니다.five.wtf
로로 합니다.'potato'
5를 오브젝트로 하면 Simple Assignment가 허용됩니다.
> five * 5
25
> five.wtf
'potato'
★★★★★★★★★★★★★★★★ five
오브젝트로서 간단한 산술 연산을 실행할 수 있습니다.아, 아, 아, 아, 아, 아, 아, 아, 아.그성특 직직 ?? ???? ??? ★★★.
차례.
> five++
5
> five.wtf
undefined
이번에는 .five++
포스트픽스 인크리먼트의 트릭은 식 전체가 원래 값과 비교하여 평가되고 그 값이 증가한다는 것입니다.이 모양은five
5로 '5'를 '5'로 합니다.five
로로 합니다.6
.
five
로 설정하다6
, Atribut을 할 수 때문에, 「」는 「」를 참조해 .five.wtf
정의되어 있지 않습니다.
> five.wtf = 'potato?'
'potato?'
> five.wtf
undefined
한 번 속성 합니다.wtf
로로 합니다.five
은 붙는 않습니다.five
는 Number 값이지 Number 객체가 아닙니다.은 ''로 평가됩니다.'potato?'
그러나 확인해보니 할당되어 있지 않습니다.
위신이요.
> five
6
증가하고 , 「」는 계속 증가하고 .five
까지 계속되다6
.
숫자를 나타내는 방법에는 다음 두 가지가 있습니다.
var a = 5;
var b = new Number(5);
첫 번째는 원시적인 것이고, 두 번째는 물체입니다.콘솔로 인쇄했을 때의 외관이 다르다는 것을 제외하고, 모든 점에서 양쪽의 동작은 동일합니다. 가지 중요한 로서 '오브젝트'라는 new Number(5)
평소와 마찬가지로 새로운 속성을 받아들인다.{}
원시적인 것은5
지지않않않않다다
a.foo = 'bar'; // doesn't stick
b.foo = 'bar'; // sticks
번째 첫첫 as as as as asdis.call(5)
"this" 키워드의 구조를 참조하십시오.첫 번째 논쟁은...call
됩니다.this
이 으로 인해 가 더 을 알 수 있습니다Number
★★★★★★★★★나중에++
는, 조작을 실시하기 에, 원래의 . 왜냐하면 덧셈 연산은+
이치노
> five = dis.call(5) // for all intents and purposes same as new Number(5)
Number {[[PrimitiveValue]]: 5}
> five.wtf = 'potato'
"potato"
> five.wtf
"potato"
A Number
오브젝트는 새로운 속성을 받아들입니다.
> five++
++
원초적인 를 낳다6
표시...
> five.wtf
undefined
> five.wtf = 'potato?'
"potato?"
> five.wtf
undefined
...커스텀 Atribute가 없고, 그 Atribute를 받아들일 수 없습니다.
* strict 모드에서는,this
인수는 다르게 취급되며 로 변환되지 않습니다.Number
실장의 상세한 것에 대하여는, http://es5.github.io/#x10.4.3 를 참조해 주세요.
JavaScript 세계에는 강압이 있다 - 탐정 이야기
네이쓴, 네가 뭘 알아냈는지 넌 전혀 몰라
은 작년10월의 치는 밤에 되었다.이 모든 것은 작년 10월의 폭풍우 치는 밤에 시작되었다.요.Number
- 왜 에 "-"-"-"-"-"-"-"-"-"-"-"-"-"-"-"-"-"-"-""-"""-"""Number
수업? 수업?
나는 다음에 알게 될 것에 대해 준비가 되어 있지 않았다.
JavaScript는 아무 말 없이 숫자를 개체로, 객체를 코앞의 숫자로 바꾸고 있는 것으로 나타났습니다.
JavaScript는 아무도 알아채지 못하기를 바랐지만, 사람들은 이상한 돌발 행동을 보고해왔고, 이제 나는 당신과 당신의 질문 덕분에 이 일을 완전히 덮어버릴 수 있는 증거를 확보했다.
이게 우리가 지금까지 알아낸 거야.이 말을 해야 할지 모르겠네요.JavaScript를 꺼야 할지도 모르겠네요.
> function dis() { return this }
undefined
이 기능을 만들었을 때는 아마 다음에 무슨 일이 일어날지 전혀 몰랐을 겁니다.모든 것이 괜찮아 보였고, 지금은 모든 것이 괜찮았다.
오류 메시지는 없으며 콘솔 출력에 "정의되지 않음"이라는 단어만 표시됩니다.결국, 이것은 함수 선언이었습니다.아무것도 반환하지 않도록 되어 있습니다.
하지만 이것은 시작에 불과했다.다음에 무슨 일이 일어날지 아무도 예측할 수 없었다.
> five = dis.call(5)
Number {[[PrimitiveValue]]: 5}
,요. 요.5
하지만 그건 당신이 가진 게 아니에요, 그렇죠? - 당신은 다른 걸 얻었어요 - 뭔가 다른 걸 얻었어요.
나에게도 같은 일이 일어났다.
나는 그것을 어떻게 이해해야 할지 몰랐다.그게 날 미치게 했어.잠도 못 자고, 먹을 수도 없고, 마시려고도 했지만, 마운틴듀를 마셔도 잊을 수가 없었어요.말도 안 돼!
그때 나는 무슨 일이 일어나고 있는지 알게 되었다. 그것은 강요였다. 그리고 바로 눈앞에서 일어나고 있었다. 하지만 나는 너무 눈이 멀어서 그것을 볼 수 없었다.
Mozilla는 아무도 볼 수 없다는 것을 알고 있던 곳에 문서를 놓아두면서 그것을 묻으려고 했습니다.
몇 시간 동안 반복해서 읽고, 다시 읽고, 다시 읽고, 다시 읽은 결과 다음과 같은 사실을 알게 되었습니다.
"...기본값이 객체로 변환됩니다."
Sans를 엽니다....call()
능 - - 가어어!! !! !!?!
내 번호는 더 이상 숫자가 아니었다. the it it it it it it it it it it it it it 에 넘긴 순간call()
가른른하다 물건.물체
처음에는 믿을 수가 없었어요.어떻게 그럴 수가 있지?하지만 나는 내 주변에 쌓여가는 증거를 무시할 수 없었다.바로 저기 있습니다.
> five.wtf = 'potato'
"potato"
> five.wtf
"potato"
wtf
다.이 있을 수 , 알고있다!을 사용하다두두알! !!!!!!!!학교에서 제일 먼저 가르쳐주는 거야
콘솔 출력을 본 순간 알 수 있었습니다.이 번호는 우리가 생각했던 번호가 아닙니다.이것은 가짜였다. 우리의 순진한 숫자인 척하는 물건이다.
★★★★★★★★★★★★。new Number(5)
.
하 말이 되네. call()
할 , 그러기 는 '기능 '기능', '기능', '기능', '기능', '기능', '기능', '기능', '기능', '기능', '기능', '기능'이 필요합니다.this
그는 번호로는 할 수 없다는 것을 알고 있었다. 그는 어떤 물건이 필요했고, 그것이 우리의 번호를 강요하는 것을 의미할지라도 그것을 얻기 위해 무엇이든 할 용의가 있었다.call()
를 보다5
그것은 완벽한 계획이었다: 아무도 보지 않을 때까지 기다렸다가 우리의 번호를 그것과 똑같이 생긴 물체와 교환했다.번호를 얻으면, 그 기능이 발동되고 아무도 모를거야.
정말 완벽한 계획이었지만, 모든 계획처럼, 심지어 완벽한 계획처럼, 구멍이 뚫려 있었고, 우리는 바로 빠져들려고 했습니다.
무슨 ,, ??call()
어디에나 있었다.이것은 결국 자바스크립트였다 - 강요는 어디에나 있었다.
call()
내 번호를 가져갔고, 그의 작은 사기꾼의 가면을 벗기고 스택 오버플로우 커뮤니티 전체에 노출될 때까지 멈추지 않을 생각이었어.
하지만 어떻게요?난 계획이 필요했어숫자처럼 보이지만 아닌 건 알아 증명할 방법이 있을 거야바로 그거야!숫자처럼 보이는데, 숫자처럼 행동할 수 있을까요?
는 i i i i i i i i ifive
나는 그가 5배 더 커야 한다 - 그는 이유를 묻지 않았고 나는 설명하지 않았다.그 후, 저는 훌륭한 프로그래머라면 할 수 있는 일을 했습니다: 저는 곱셈을 했습니다.확실히 그가 속여서 빠져나갈 방법은 없었다.
> five * 5
25
> five.wtf
'potato'
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★five
을 하다wtf
, 감자야!「 」, 「 」
체체 무슨 ?이 ?? ???가가 이이 ?에 ?? ??? 이는?five
아니 뭔가 것 , 것 너무 인 것 하고 있는 거야니 、 가 、 뭔 、 고 、 게림어어어 。 잊어버리고 있는 게 틀림없어. 너무 단순하고 기본적인 걸 완전히 간과하고 있어.
이 답변은 보기 좋지 않았습니다.몇 시간 동안 이 답변을 쓰고 있었지만, 아직 요점을 말할 수 없었습니다.나는 이것을 계속할 수 없었다.결국 사람들은 읽기를 멈추었다.나는 뭔가를 생각해내야 했고, 나는 그것을 빨리 생각해야 했다.
,,,, !!five
25번, 25번, 25번, 25번 어떻게 잊을 수 ?연하 、 ,내 、 내떻 、 가??자는불불 불불불다다을 5 * 5
에만 할당되지 않습니다.25
.
그게 여기서 일어나고 있는 일임에 틀림없어.어떻게든 내가 곱하면five * 5
,five
반드시 어떤 숫자에 강제로 입력되어야 하며, 그 숫자는 곱셈에 사용되는 숫자여야 합니다.되는 것은 그 그 값이 .five
그 자체입니다. five
이치노물론 변경되지 않습니다.
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★five
★★★★★★★전five
'+'는 '+'는 '+'는 '+'입니다.
> five++
5
아하! 잡았다!누구나 다 알아요.5 + 1
6
that that that ii , , , , , 、 , , 、 , , 、 , , , , , , 。five
자숫가아아!건그사사사! 수 있어요동작합니다.실수는 다음과 같이 동작합니다.
> num = 5
5
> num++
5
잠깐? 여기 무슨 일이야? 한숨, 너무 정신없이 뛰어서five
사용 시++
five
ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ,five
. 조작이 발생하기 전에 콘솔에 출력되는 값입니다. num
6
그걸 증명할 수 있었어요
>num
6
「」의 내용을 합니다.five
★★★★★★★★★★★★★★★★★★:
>five
6
할 이었어...★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ five
면면면면면 면면 면면 면면 면면면five
그 할 수 물건이었다.wtf
안하하 건건다 다다다다했했
> five.wtf
undefined
★★★★★★★★★★★★★★★★!five
지금은 숫자입니다. 더 이상 대상이 아닙니다.이번에는 곱셈으로 구하지 못할 줄 알았어. 것은, 을 참조하십시오.five++
'아주변이야.five = five + 1
는.++
five
구체적으로 이 는 이 해 줍니다five + 1
곱셈의 경우와 마찬가지로 새로운 불변의 숫자를 반환합니다.
내가 그를 잡았다는 걸 알았고, 그가 거기서 빠져나오지 못하도록 확실히 하려고.이데올로기 때문에 내가, 가면면면 면면면 면면 면면 if if if if if iffive
지금은 정말 숫자지만 이건 통하지 않을 거야
> five.wtf = 'potato?'
'potato?'
이번엔 날 속이려 하지 않았어알고 있었어potato?
콘솔로 출력될 예정이었습니다.진짜 질문은 윌이wtf
아직 거기 있어?
> five.wtf
undefined
내가 의심했던 대로, 아무것도 아니야. 왜냐하면 번호는 속성을 할당할 수 없기 때문이야.우리는 학원에서 첫해라는 것을 배웠다;)
고마워요, 네이쓴당신의 용기 덕분에 저는 마침내 이 모든 것을 잊고 새로운 사건으로 넘어갈 수 있었습니다.
이 기능처럼toValue()
.오, 이런 하나님.안 돼!
01 > function dis() { return this }
02 undefined
03 > five = dis.call(5)
04 Number {[[PrimitiveValue]]: 5}
05 > five.wtf = 'potato'
06 "potato"
07 > five.wtf
08 "potato"
09 > five * 5
10 25
11 > five.wtf
12 "potato"
13 > five++
14 5
15 > five.wtf
16 undefined
17 > five.wtf = 'potato?'
18 "potato?"
19 > five.wtf
20 undefined
21 > five
22 6
01
함수를 선언합니다.dis
컨텍스트 오브젝트를 반환합니다.뭐?this
는 strict 모드 사용 여부에 따른 변경을 나타냅니다.함수가 다음과 같이 선언된 경우 예제 전체가 다른 결과를 가집니다.
> function dis() { "use strict"; return this }
이는 ES5 사양 섹션 10.4.3에 자세히 설명되어 있습니다.
- 함수 코드가 엄밀한 코드인 경우 ThisBinding을 thisArg로 설정합니다.
- 그렇지 않으면 thisArg가 null이거나 정의되지 않은 경우 ThisBinding을 글로벌개체로 설정합니다.
- 또는 Type(thisArg)이 Object가 아닌 경우 ThisBinding을 ToObject(thisArg)로 설정합니다.
02
는 함수 선언의 반환값입니다. undefined
여기서 설명해야 합니다.
03
변수five
의 반환값으로 초기화됩니다.dis
원시적 가치의 맥락에서 호출되었을 때5
.왜냐면dis
엄밀한 모드가 아닙니다.이 회선은, 발신측과 같습니다.five = Object(5)
.
04
홀수Number {[[PrimitiveValue]]: 5}
return value는 기본 값을 랩하는 개체의 표현입니다.5
05
그five
오브젝트wtf
속성에는 문자열 값이 할당됩니다.'potato'
06
는 할당의 반환값이며, 스스로 설명해야 합니다.
07
그five
오브젝트wtf
속성을 검사 중입니다.
08
~하듯이five.wtf
이전에 로 설정되었습니다.'potato'
그것은 되돌아온다'potato'
여기서
09
그five
오브젝트에 프리미티브 값을 곱하고 있습니다.5
이는 곱셈되는 다른 객체와 다르지 않으며 ES5 사양 섹션 11.5에 설명되어 있습니다.특히 오브젝트가 수치로 캐스팅되는 방법에 대해서는 몇 가지 섹션에서 설명합니다.
- primValue를 ToPrimitive(입력 인수, 힌트 번호)로 합니다.
- Return To Number(prim Value).
9.1 프라이미티브:
개체의 기본값을 반환합니다.객체의 기본값은 객체의 [DefaultValue] 내부 메서드를 호출하여 옵션의 힌트 PreferredType을 전달함으로써 가져옵니다.[DefaultValue] 내부 메서드의 동작은 8.12.8의 모든 네이티브 ECMAScript 개체에 대해 이 사양에 의해 정의됩니다.
valueOf는 인수 "valueOf"를 사용하여 개체 O의 [Get] 내부 메서드를 호출한 결과라고 가정합니다.
IsCallable(valueOf)이 true이면
- val은 valueOf의 [Call] 내부 메서드를 호출한 결과이며, 이 값은 O이고 인수 목록은 비어 있습니다.
- val이 원시 값이면 val을 반환합니다.
이 모든 것은 그 물체의 위치를valueOf
함수가 호출되고 해당 함수의 반환값이 방정식에 사용됩니다.를 변경했을 경우,valueOf
조작 결과를 변경할 수 있습니다.
> five.valueOf = function () { return 10 }
undefined
> five * 5
50
10
~하듯이five
s valueOf
함수가 변경되지 않았습니다. 랩된 기본 값을 반환합니다.5
하도록five * 5
까지 평가하다.5 * 5
결과적으로25
11
그five
오브젝트wtf
속성이 할당되었을 때와 변경되지 않았음에도 불구하고 다시 평가됩니다.05
.
12
'potato'
13
Postfix Increment 연산자는five
숫자 값을 가져옵니다( ).5
(얼마 전인지 설명했습니다)는 반환할 수 있도록 값을 저장합니다.1
(의 가치까지)6
)는 값을 에 할당합니다.five
저장된 값을 반환합니다( ).5
)
14
이전과 같이 반환되는 값은 증가하기 전의 값입니다.
15
wtf
의 특성6
됩니다.five
액세스 됩니다.ES5 사양 섹션 15.7.5에서 이 동작을 정의합니다.숫자는 다음에서 속성을 가져옵니다.Number.prototype
.
16
Number.prototype
이 없다wtf
, 즉 「」, 「」undefined
17
five.wtf
인 is is 할 is is is is 。'potato?'
할당은 ES5 사양의 11.13.1에 정의되어 있습니다.기본적으로 할당된 값은 반환되지만 저장되지는 않습니다.
18
'potato?'
반환되었습니다.
19
한 번복하다five
이 값은 다음과 같습니다.6
접속합니다.Number.prototype
이 없다wtf
20
undefined
와 같이
21
five
22
6
됩니다.13
꽤 간단해.
function dis () { return this; }
하면 됩니다.this
하면, 이렇게 하면.call(5)
번호를 물건으로 넘기는 거죠
call
인수를 첫 는 인수의 입니다.this
'어느 정도'를 붙입니다{}
dis.call({})
즉,this
.this
★에 ★★★★★★5
오브젝트로 변환될 것 같습니다.「.call」을 참조해 주세요.
반환은 ★★★★★★★★★★★★★★★★★★★★★★」object
때 ★★★★five * 5
JavaScript를 five
5 * 5
도, 하다'5' * 5
똑같아요.25
그래서 JavaScript는 확실히 숨겨져 있다.이 라인에서는 기본 유형을 변경하지 않습니다.
할 ++
인 것으로 합니다.number
치면 뺄 수 있다..wtf
소유물.기본 유형에 영향을 미치기 때문에
원시 값은 속성을 가질 수 없습니다.그러나 기본 값으로 속성에 액세스하려고 하면 임시 Number 개체로 투명하게 변환됩니다.
그래서:
> function dis() { return this }
undefined
// Like five.dis(), so dis return the temporaty Number object and
// reference it in five
> five = dis.call(5)
Number {[[PrimitiveValue]]: 5}
// Write the wtf attribut on the Number object referenced by five
> five.wtf = 'potato'
"potato"
// Read the wtf attribut on the Number object referenced by five
> five.wtf
"potato"
// Return 5*5 but dont change the reference of five
> five * 5
25
// Read the same wtf attribut on the Number object referenced by five
> five.wtf
"potato"
// Change the five reference to a new primitive value (5+1). Five
// reference a primitive now.
> five++
5
// Read the wtf attribut on a new temporary Number object construct from
// the primitive referenced by five. So wtf does not exist.
> five.wtf
undefined
// Write the wtf attribut on a new temporary Number object construct from
// the primitive referenced by five. But this object not referenced by
// five. It will be lost.
> five.wtf = 'potato?'
"potato?"
// Read the wtf attribut on a new temporary Number object construct from
// the primitive referenced by five. So wtf does not exist.
> five.wtf
undefined
> five
6
「」를 선언합니다.dis
는 컨텍스트를
function dis() { return this }
undefined
★★dis
5
. 기본 값은 엄밀한 모드(MDN)에서 컨텍스트로 전달될 때 상자에 표시됩니다.그렇게five
지금은 목적어입니다.
five = dis.call(5)
Number {[[PrimitiveValue]]: 5}
wtf
property の 。five
five.wtf = 'potato'
"potato"
의 값five.wtf
five.wtf
"potato"
five
5
변하지않다five
.
five * 5
25
의 값five.wtf
five.wtf
"potato"
★★★five
five
number
인쇄가 됩니다.5
하고, 「」를 추가합니다1
로로 합니다.five
.
five++
5
five
번호입니다.6
이제 그 안에 속성이 없습니다.
five.wtf
undefined
프리미티브는 속성을 가질 수 없습니다. 설정할 수 없습니다.
five.wtf = 'potato?'
"potato?"
설정이 되어 있지 않기 때문에 읽을 수 없습니다.
five.wtf
undefined
five
6
incrementing above because because because because because
five
6
우선, 이것은 nodejs 콘솔을 통해 실행되고 있는 것처럼 보입니다.
1.
function dis() { return this }
「disclosing」으로 않기 에, 「disclosing」은 「disclosing」으로 설정되어 있지 않습니다.var
때문에 반환할 수 없습니다.undefined
그 결과물이었습니다.dis()
정의되었습니다.이이 on on on on on on onthis
함수가 실행되지 않았기 때문에 반환되지 않았습니다.
2.
five = dis.call(5)
★★ javascript를 합니다.Number
"이것"을 설정했을 입니다.dis()
의 »this
5월 5분
3.
five.wtf = 'potato'
번째가 반환됩니다."potato"
을 만 하면 됩니다.wtf
five
로로 합니다.'potato'
하여 여러 를 쉽게 할 수 . . Javascript는 다음과 같이 합니다.a = b = c = 2
.
4.
five * 5
값은 반환됩니다.25
인 숫자의 뿐이기 때문입니다.5
로로 합니다.five
의 の of 。five
의 값에 의해 결정되었다.Number
★★★★★★ 。
5.
five.wtf
아까는 여기서 반복할 거라서 건너뛰었어요.은 단지 부동산의 뿐이다.wtf
설정해 주세요.
6.
five++
@@Callum은++
합니다.number
로부터의 으로부터.Number {[[PrimitiveValue]]: 5}}
.
, 때문에five
는 입니다.number
수
five = dis.call(five)
five.wtf = "potato?"
또는
five = { value: 6, wtf: "potato?" }
두 은 첫 과는 동작이 점에 은, 「두 번째 방법」이 , 하고 있기 때문입니다.이것은 첫 번째 메서드는 일반적인 오브젝트를 정의하고 있기 때문입니다.Number
이전에 생성된 객체입니다.
합니다.javascript는 때문에, jav는 jav jav.javascript에서 때 스러울 수 .Number
인 것에 number
하려면 , 「유형」을 typeof
후 반환됩니다.'object'
후에, 「」를 참조해 주세요.five++
'number'
.
@deceze는 Number 객체와 원시 숫자의 차이를 매우 잘 설명합니다.
JavaScript 스코프는 실행 컨텍스트로 구성됩니다.각 실행 컨텍스트에는 Lexical Environment(외부/글로벌 범위 값), Variable Environment(로컬 범위 값) 및 이 바인딩이 있습니다.
이 바인딩은 실행 컨텍스트에서 매우 중요한 부분입니다.사용.call
는 이 바인딩을 변경하는 방법 중 하나이며, 이렇게 하면 바인딩을 채울 개체가 자동으로 생성됩니다.
function.protype.call() (MDN에서)
구문
fun.call(thisArg[, arg1[, arg2[, ...]]])
어어 this
이 값은 콜 투 펀(call to fun)에 제공되었습니다.메서드에서 실제로 볼 수 있는 값이 아닐 수 있습니다.메서드가 엄격하지 않은 모드코드의 함수일 경우 null 및 defined는 글로벌오브젝트로 대체되고 프리미티브 값은 오브젝트로 변환됩니다.(내 것을 제외)
5로 new Number(5)
에 유의하십시오.을 사용하다
function primitiveToObject(prim){
return dis.call(prim);
}
function dis(){ return this; }
//existing example
console.log(primitiveToObject(5));
//Infinity
console.log(primitiveToObject(1/0));
//bool
console.log(primitiveToObject(1>0));
//string
console.log(primitiveToObject("hello world"));
<img src="http://i.stack.imgur.com/MUyRV.png" />
몇 가지 개념으로 어떤 일이 일어나는지 설명할 수 있습니다.
5
, 즉 수, 즉, primate value)입니다.
Number {[[PrimitiveValue]]: 5}
는 Number의입니다.
원시값의 속성(JS/메서드)를 만듭니다.Number
★★★★★★에5
,String
★★★★★★에'str'
★★★★★★★★★★★★★★★★★」Boolean
★★★★★★에true
및 래퍼 상의 및 오브젝트 래퍼 상의 속성 액세스/패키지 콜을 해결합니다. 됩니다.true.toString()
예를들면.
개체에 대한 작업을 수행할 때 개체는 기본 값으로 변환됩니다(사용:toString
또는valueOf
이러한 조작을 해결하려면 , 예를 들면,
var obj = { a : 1 };
var string = 'mystr' + obj;
var number = 3 + obj;
string
연결 스트링을 유지합니다.mystr
그리고.obj.toString()
그리고.number
추가가 유지되다3
그리고.obj.valueOf()
.
정리하면
five = dis.call(5)
dis.call(5)
와 똑같이 행동하다(5).dis()
한다면5
실제로 방법이 있었다dis
메서드 호출을 해결하기 위해 오브젝트 래퍼가 생성되어 메서드 호출이 해결됩니다.이 시점에서 오브젝트 래퍼에 대해 원시값 5를 둘러싼 5개의 포인트를 가진다.
five.wtf = 'potato'
물건에 재산을 세팅하는 것, 여기에 화려한 것은 없습니다.
five * 5
이거는 사실five.valueOf() * 5
개체 래퍼에서 원시 값을 가져옵니다. five
는 여전히 초기 객체를 가리킵니다.
five++
이거는 사실five = five.valueOf() + 1
. 이 행이 오브젝트랩퍼를 값 5에 붙이기 전에 이 포인트 이후는 원시값을 붙입니다.
five.wtf
five.wtf = 'potato?'
five.wtf
five
더 이상 객체가 아닙니다.이러한 각 행은 Number의 새로운 인스턴스를 생성하여.wtf
속성 액세스인스턴스는 독립적이므로 하나의 인스턴스에 속성을 설정하면 다른 인스턴스에 표시되지 않습니다.코드는 다음과 같습니다.
(new Number(6)).wtf;
(new Number(6)).wtf = 'potato?';
(new Number(6)).wtf;
언급URL : https://stackoverflow.com/questions/38637003/what-s-happening-in-this-code-with-number-objects-holding-properties-and-increme
'itsource' 카테고리의 다른 글
열 값을 기준으로 Panda에서 DataFrame 행 삭제 (0) | 2022.11.15 |
---|---|
데이터베이스 설계에서 "n:m"과 "1:n"의 의미 (0) | 2022.11.15 |
사용자 이름 없이 Mariadb 연결이 중단되었습니다. (0) | 2022.11.15 |
Laravel 블레이드 템플릿에서 문자열 잘라내기 (0) | 2022.11.15 |
WhatsApp API(java/python) (0) | 2022.11.15 |