[javascript] 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'


답변