programing

왜 일부 리터럴의 경우 반환이 거짓입니까?

shortcode 2022. 9. 18. 20:41
반응형

왜 일부 리터럴의 경우 반환이 거짓입니까?

"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; 

이 기능을 사용할 수 있습니다.두 가지 경우 모두 사용할 수 있습니다.

  1. var text="foo";// 동작하는 타입

  2. String text= new String("foo");// instance of는 동작합니다.

이는 ECMAScript 사양 섹션 7.3.19 스텝3에 정의되어 있습니다.If Type(O) is not Object, return false.

바꿔 말하면, 만약ObjObj 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

반응형