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'
'Programing' 카테고리의 다른 글
런타임에 TextView의 스타일을 변경하는 방법 (0) | 2020.08.23 |
---|---|
MySQL '스키마 만들기'와 '데이터베이스 만들기'-차이점이 있습니까? (0) | 2020.08.22 |
웹 사이트를위한 자동 Retina 이미지 (0) | 2020.08.22 |
휴리스틱과 알고리즘의 차이점은 무엇입니까? (0) | 2020.08.22 |
ASP.Net : 리터럴 대 레이블 (0) | 2020.08.22 |