Programing

JavaScript에서 ( "foo"=== new String ( "foo"))가 false로 평가되는 이유는 무엇입니까?

crosscheck 2020. 8. 22. 08:00
반응형

JavaScript에서 ( "foo"=== new String ( "foo"))가 false로 평가되는 이유는 무엇입니까?


문자열 값을 비교할 때 항상 === (삼중 같음, 엄격한 비교) 사용을 시작하려고했지만 이제는

"foo" === new String("foo")

거짓이며 다음과 동일합니다.

var f = "foo", g = new String("foo");
f === g; // false

물론이야:

f == g; // true

따라서 문자열 비교를 위해 항상 ==를 사용하거나 비교하기 전에 항상 변수를 문자열로 변환하는 것이 좋습니다.


"foo"문자열 프리미티브 입니다. (이 개념은 C # 또는 Java에 존재하지 않습니다)

new String("foo") 박스형 문자열 객체입니다.

===연산자는 프리미티브와 개체에 다르게 작동합니다 .
(동일한 유형의) 프리미티브를 비교할 때 ===둘 다 동일한 값을 가지고 있으면 true를 반환합니다.

객체를 비교할 때 ===동일한 객체를 참조하는 경우에만 true를 반환합니다 (참조로 비교). 따라서 new String("a") !== new String("a").

귀하의 경우 ===피연산자가 다른 유형이기 때문에 false를 반환합니다 (하나는 원시이고 다른 하나는 객체입니다).


프리미티브는 전혀 객체가 아닙니다. 운영자는 반환하지 않습니다 기본 요소.
typeof"object"

(객체로 사용하는) 원시의 속성에 액세스하려고하면 Javascript 언어가 객체에 상자를 넣어 매번 새 객체를 만듭니다. 이것은 사양에 설명되어 있습니다.

이것이 프리미티브에 속성을 넣을 수없는 이유입니다.

var x = "a";
x.property = 2;
alert(x.property) //undefined

당신이 쓸 때마다 x.property하는 다른 박스 String객체가 만들어집니다.


사용하여 ===,

  • Object는 자신에 대한 다른 참조를 제외하고는 절대로 동일하지 않습니다.

  • 프리미티브는 유형과 값이 같으면 다른 프리미티브와 비교할 때 동일합니다.


여기서 그 new단어는 범죄자입니다 ( 평소처럼 말하겠습니까) ...

를 사용할 때 객체new 작업에 대한 욕구를 명시 적으로 표현합니다 . 당신에게는 놀라 울 수도 있지만 이것은 :

var x = new String('foo');
var y = new String('foo');
x === y; 

... 당신에게 강력한 것을 줄 것 false입니다. 간단합니다. 비교는 객체의 내부가 아니라 객체의 참조입니다. 그리고 물론 두 개의 다른 객체가 만들어 졌기 때문에 동일하지 않습니다.

아마도 사용하고 싶은 것은 변환입니다 .

var x = String('foo');
var y = String('foo');
x === y;

... 그리고 예상 true대로 결과적으로 당신은 foos영원히 평등하게 기뻐하고 번영 할 수 있습니다. )


foo순수한 문자열이고 new String("foo")객체 문자열입니다.


node.js REPL (설치된 경우 명령 줄의 "node")에서 :

> "foo" === (new String("foo")).valueOf()
true
> "foo" === new String("foo")
false
> typeof("foo")
'string'
> typeof(new String("foo"))
'object'
> typeof((new String("foo")).valueOf())
'string'

참고URL : https://stackoverflow.com/questions/10951906/why-does-foo-new-stringfoo-evaluate-to-false-in-javascript

반응형