>웹 프론트엔드 >JS 튜토리얼 >객체 유형을 감지하기 위해 Object.prototype.toString.call(obj)을 사용하는 이유는 무엇입니까?

객체 유형을 감지하기 위해 Object.prototype.toString.call(obj)을 사용하는 이유는 무엇입니까?

青灯夜游
青灯夜游앞으로
2018-10-10 17:27:452519검색

저는 최근 js 인터뷰 25가지 필수 JavaScript 인터뷰 질문*을 수행했습니다. 그 중 첫 번째는 다음과 같습니다. "bar"가 객체인지 감지하기 위해 typeof bar === "object"를 사용하는 경우의 단점은 무엇입니까? 물체? 그것을 피하는 방법? typeof bar === "object"检测”bar”是否为对象有什么缺点?如何避免?

这是一个十分常见的问题,用 typeof 是否能准确判断一个对象变量,答案是否定的,null 的结果也是 object,Array 的结果也是 object,有时候我们需要的是 "纯粹" 的 object 对象。如何避免呢?比较好的方式是:

console.log(Object.prototype.toString.call(obj) === "[object Object]");

使用以上方式可以很好的区分各种类型:

(无法区分自定义对象类型,自定义类型可以采用instanceof区分)

console.log(Object.prototype.toString.call("jerry"));//[object String]
console.log(Object.prototype.toString.call(12));//[object Number]
console.log(Object.prototype.toString.call(true));//[object Boolean]
console.log(Object.prototype.toString.call(undefined));//[object Undefined]
console.log(Object.prototype.toString.call(null));//[object Null]
console.log(Object.prototype.toString.call({name: "jerry"}));//[object Object]
console.log(Object.prototype.toString.call(function(){}));//[object Function]
console.log(Object.prototype.toString.call([]));//[object Array]
console.log(Object.prototype.toString.call(new Date));//[object Date]
console.log(Object.prototype.toString.call(/\d/));//[object RegExp]
function Person(){};
console.log(Object.prototype.toString.call(new Person));//[object Object]

为什么这样就能区分呢?于是我去看了一下toString方法的用法:toString方法返回反映这个对象的字符串。

那为什么不直接用obj.toString()呢?

console.log("jerry".toString());//jerry
console.log((1).toString());//1
console.log([1,2].toString());//1,2
console.log(new Date().toString());//Wed Dec 21 2016 20:35:48 GMT+0800 (中国标准时间)
console.log(function(){}.toString());//function (){}
console.log(null.toString());//error
console.log(undefined.toString());//error

同样是检测对象obj调用toString方法(关于toString()方法的用法的可以参考toString的详解),obj.toString()的结果和Object.prototype.toString.call(obj)的结果不一样,这是为什么?

这是因为toString为Object的原型方法,而Array이것은 매우 일반적인 질문입니다. typeof를 사용하여 개체 변수를 정확하게 결정할 수 있습니까? 대답은 '아니요'입니다. null의 결과도 개체입니다. >Array 의 결과도 객체입니다. 때때로 우리에게 필요한 것은 "순수한" 객체 객체입니다. 그것을 피하는 방법? 더 좋은 방법은:

var arr=[1,2,3];console.log(Array.prototype.hasOwnProperty("toString"));//true
console.log(arr.toString());//1,2,3
delete Array.prototype.toString;//delete操作符可以删除实例属性
console.log(Array.prototype.hasOwnProperty("toString"));//false
console.log(arr.toString());//"[object Array]"
위 방법을 사용하면 다양한 유형을 잘 구분할 수 있습니다. (사용자 정의 개체 유형은 구분할 수 없으며 사용자 정의 유형은 인스턴스of를 사용하여 구분할 수 있습니다.) rrreee왜 이런 방식으로 구분할 수 있습니까? 그래서 toString 메소드의 사용법을 살펴보았습니다. toString 메소드는 이 객체를 반영하는 문자열을 반환합니다. 그럼 그냥 obj.toString()을 사용하면 어떨까요? rrreeetoString 메소드(toString() 메소드 사용법은 toString의 자세한 설명 참조)를 호출하는 감지 객체 obj이기도 하며, obj.toString() 및

의 결과입니다. Object.

prototype.toString

.call(obj)

의 결과가 다릅니다 왜 그럴까요? 이것은 toString이 Object의 프로토타입 메서드이고 Object의 인스턴스인 Arrayfunction과 같은 유형이

toString

메서드를 재정의했기 때문입니다. 다양한 객체 유형이 toString 메소드를 호출하면 프로토타입 체인에 대한 지식을 기반으로 해당 재작성된

toString

메소드가 호출됩니다(함수 유형은 내용이 함수 본문인 문자열을 반환하고 Array 유형은 문자열을 반환합니다). .....) Object에서 프로토타입

toString

메서드를 호출하는 대신(객체의 특정 유형 반환) obj.toString()

을 사용하면 해당 객체 유형을 가져올 수 없으며 다음을 수행할 수 있습니다. obj를 문자 유형으로만 변환합니다. 따라서 특정 유형의 객체를 얻으려면 Object에서 프로토타입 toString 메서드를 호출해야 합니다.

배열의 toString 메서드를 삭제하면 이를 확인할 수 있고 결과가 어떻게 나올지 확인할 수 있습니다.

rrreeeArray의 toString 메서드를 삭제한 후 arr.toString() 메서드도 사용하면 다음과 같은 문제가 발생합니다. 더 이상 Object 프로토타입 메서드의 인스턴스 메서드를 Shield하지 않으므로 프로토타입 체인을 따라 arr은 최종적으로 Object의 toString 메서드를 호출하여

Object.🎜prototype🎜.🎜toString🎜.call(arr)🎜과 동일한 결과를 반환합니다. 🎜🎜🎜🎜요약: 위 내용은 이 글의 전체 내용입니다. 모든 분들의 공부에 도움이 되었으면 좋겠습니다. 더 많은 관련 튜토리얼을 보려면 🎜JavaScript 비디오 튜토리얼🎜을 방문하세요! 🎜🎜관련 권장 사항: 🎜🎜🎜php 공공 복지 교육 비디오 튜토리얼🎜🎜🎜🎜JavaScript 그래픽 튜토리얼 🎜🎜🎜🎜JavaScript 온라인 매뉴얼🎜🎜

위 내용은 객체 유형을 감지하기 위해 Object.prototype.toString.call(obj)을 사용하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 cnblogs.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제