왜 일부 리터럴의 경우 반환이 거짓입니까?
"foo" instanceof String //=> false
"foo" instanceof Object //=> false
true instanceof Boolean //=> false
true instanceof Object //=> false
false instanceof Boolean //=> false
false instanceof Object //=> false
12.21 instanceof Number //=> false
/foo/ instanceof RegExp //=> true
// the tests against Object really don't make sense
배열 리터럴과 개체 리터럴이 일치합니다...
[0,1] instanceof Array //=> true
{0:1} instanceof Object //=> true
왜 다 안 해?아니면 왜 다들 안 되는 거죠?
럼,, 그그그? ????
FF3, IE7, Opera, Chrome도 마찬가지입니다.그래서 적어도 일관성이 있다.
프리미티브는 Javascript 내에서 생성된 개체와는 다른 유형입니다.Mozilla API 문서:
var color1 = new String("green");
color1 instanceof String; // returns true
var color2 = "coral";
color2 instanceof String; // returns false (color2 is not a String object)
코드로는 원시형을 만들 수 있는 방법을 찾을 수 없습니다. 말을 쓰는 것 같아요.typeof "foo" === "string"
instanceof
.
이런 것들을 기억하기 위한 쉬운 방법은 스스로에게 "무엇이 제정신이고 배우기 쉬울까?"라고 묻는 것이다.정답이 무엇이든 Javascript는 다른 일을 합니다.
사용방법:
function isString(s) {
return typeof(s) === 'string' || s instanceof String;
}
JavaScript 문자열은 리터럴 또는 오브젝트일 수 있습니다.
JavaScript에서는 기본 요소(부울, null, 숫자, 문자열 및 값)를 제외하고 모든 것이 객체(또는 적어도 객체로 취급될 수 있음)입니다.undefined
): ES6의 기호):
console.log(typeof true); // boolean
console.log(typeof 0); // number
console.log(typeof ""); // string
console.log(typeof undefined); // undefined
console.log(typeof null); // object
console.log(typeof []); // object
console.log(typeof {}); // object
console.log(typeof function () {}); // function
바와 같이 , 값 시시 、 레시 、 레 as 、 레 as 、 레 as 。null
로 간주되다null
존재하지 않는 오브젝트에 대한 참조입니다).함수는 호출 가능한 객체의 특수한 유형이기 때문에 구별됩니다.그러나 그것들은 여전히 객체입니다.
true
,0
,""
★★★★★★★★★★★★★★★★★」undefined
체가아아 아아아다다자바스크립트, 러, 자, 자, also have also also also however also have however also also however also also however also have however also however however however however however however however have have have have have have have도 있습니다.Boolean
,Number
★★★★★★★★★★★★★★★★★」String
합니다.
console.log(typeof new Boolean(true)); // object
console.log(typeof new Number(0)); // object
console.log(typeof new String("")); // object
있는 을 알 수.Boolean
,Number
★★★★★★★★★★★★★★★★★」String
컨스트럭터는 각각 오브젝트가 됩니다.instanceof
객체에 됩니다).false
다음 중 하나:
console.log(true instanceof Boolean); // false
console.log(0 instanceof Number); // false
console.log("" instanceof String); // false
console.log(new Boolean(true) instanceof Boolean); // true
console.log(new Number(0) instanceof Number); // true
console.log(new String("") instanceof String); // true
둘 다typeof
★★★★★★★★★★★★★★★★★」instanceof
, 중 에는 불충분합니다.typeof
인 불란, 및 문자열에만 할 수 있습니다.또, 「수 「수」, 「현」에도 할 수 있습니다.instanceof
원시적인 불이나 숫자, 문자열에는 효과가 없습니다.
다행히도 이 문제에 대한 간단한 해결책이 있다. 「」toString
(되어 있는 와 같이)Object.prototype.toString
()를 합니다.[[Class]]
" " " 시시과시과체 。
function classOf(value) {
return Object.prototype.toString.call(value);
}
console.log(classOf(true)); // [object Boolean]
console.log(classOf(0)); // [object Number]
console.log(classOf("")); // [object String]
console.log(classOf(new Boolean(true))); // [object Boolean]
console.log(classOf(new Number(0))); // [object Number]
console.log(classOf(new String(""))); // [object String]
내부[[Class]]
가치의 속성은 보다 훨씬 더 유용하다.typeof
가치.사용할 수 있습니다.Object.prototype.toString
델만의 (더 유용한)버전의typeof
연산자는 다음과 같습니다.
function typeOf(value) {
return Object.prototype.toString.call(value).slice(8, -1);
}
console.log(typeOf(true)); // Boolean
console.log(typeOf(0)); // Number
console.log(typeOf("")); // String
console.log(typeOf(new Boolean(true))); // Boolean
console.log(typeOf(new Number(0))); // Number
console.log(typeOf(new String(""))); // String
이 기사가 도움이 되었기를 바랍니다.원시 개체와 래핑된 개체의 차이에 대한 자세한 내용은 다음 블로그 게시물을 참조하십시오.JavaScript Primitivesecret Life
생성자 속성을 사용할 수 있습니다.
'foo'.constructor == String // returns true
true.constructor == Boolean // returns true
typeof(text) === 'string' || text instanceof String;
이 기능을 사용할 수 있습니다.두 가지 경우 모두 사용할 수 있습니다.
var text="foo";
// 동작하는 타입String text= new String("foo");
// instance of는 동작합니다.
이는 ECMAScript 사양 섹션 7.3.19 스텝3에 정의되어 있습니다.If Type(O) is not Object, return false.
바꿔 말하면, 만약Obj
에Obj instanceof Callable
오브젝트가 아닙니다.instanceof
에 단락되다false
직접적으로.
저는 실행 가능한 해결책을 생각해 냈다고 생각합니다.
Object.getPrototypeOf('test') === String.prototype //true
Object.getPrototypeOf(1) === String.prototype //false
원시 래퍼 유형은 문자열, 숫자 또는 부울란을 읽을 때마다 백그라운드에서 자동으로 생성되는 참조 유형입니다.예를 들어 다음과 같습니다.
var name = "foo";
var firstChar = name.charAt(0);
console.log(firstChar);
무대 뒤에서 일어나는 일은 다음과 같습니다.
// what the JavaScript engine does
var name = "foo";
var temp = new String(name);
var firstChar = temp.charAt(0);
temp = null;
console.log(firstChar);
두 번째 줄은 개체와 같은 문자열(원시)을 사용하기 때문에 JavaScript 엔진은 charAt(0)가 동작하도록 문자열 인스턴스를 만듭니다.String 객체는 파기되기 전에 하나의 문에만 존재합니다.이것을 체크해 주세요.
값을 읽을 때만 임시 개체가 생성되므로 instanceof 연산자가 false를 반환합니다.instanceof는 실제로 아무것도 읽지 않기 때문에 임시 객체는 생성되지 않으며, 값은 원시 래퍼 유형의 인스턴스가 아님을 알 수 있습니다.기본 래퍼 유형을 수동으로 생성할 수 있습니다.
저에 대한 혼란은
"str".__proto__ // #1
=> String
그렇게"str" istanceof String
돌아와야 한다true
왜냐하면 isistance는 다음과 같이 동작하기 때문입니다.
"str".__proto__ == String.prototype // #2
=> true
식 #1과 식 #2의 결과가 서로 충돌하기 때문에 둘 중 하나가 잘못되어 있을 것입니다.
#1은 틀렸다
난 그게 그 사건 때문에 일어난 일이라는 걸 알아냈어__proto__
는 표준이 아니므로 표준 속성을 사용합니다.Object.getPrototypeOf
Object.getPrototypeOf("str") // #3
=> TypeError: Object.getPrototypeOf called on non-object
이제 2번과 3번 식 사이에 혼동이 없다.
또는 다음과 같이 자신만의 기능을 만들 수도 있습니다.
function isInstanceOf(obj, clazz){
return (obj instanceof eval("("+clazz+")")) || (typeof obj == clazz.toLowerCase());
};
사용방법:
isInstanceOf('','String');
isInstanceOf(new String(), 'String');
둘 다 사실로 반환되어야 합니다.
언급URL : https://stackoverflow.com/questions/203739/why-does-instanceof-return-false-for-some-literals
'programing' 카테고리의 다른 글
AssertEquals 2 리스트는 순서를 무시합니다. (0) | 2022.09.22 |
---|---|
쿼리 문자열 매개 변수의 Java URL 인코딩 (0) | 2022.09.22 |
Java에 Mutex가 있나요? (0) | 2022.09.18 |
시스템에 설치되어 있는 TensorFlow 버전을 확인하려면 어떻게 해야 합니까? (0) | 2022.09.18 |
요청 및 응답을 모의하려면 어떻게 해야 합니까? (0) | 2022.09.18 |