문자열 값을 비교할 때 항상 === (삼중 같음, 엄격한 비교) 사용을 시작하려고했지만 이제는
"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'