Path: csiph.com!.POSTED.204-73-239-109.cust.centrio.cz!not-for-mail From: Cezary Tomczyk Newsgroups: comp.lang.javascript Subject: Re: Object.defineProperties Date: Sat, 6 May 2017 15:26:03 +0200 Organization: csiph.com Internet News Service Message-ID: References: <1943190.NgBsaNRSFp@PointedEars.de> <1592229.TLkxdtWsSY@PointedEars.de> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit Injection-Date: Sat, 6 May 2017 13:26:04 +0000 (UTC) Injection-Info: csiph.com; posting-host="204-73-239-109.cust.centrio.cz:109.239.73.204"; logging-data="95775"; mail-complaints-to="admin@kev009.com" User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:45.0) Gecko/20100101 Thunderbird/45.8.0 In-Reply-To: <1592229.TLkxdtWsSY@PointedEars.de> Xref: csiph.com comp.lang.javascript:33235 On 05/05/2017 20:11, Thomas 'PointedEars' Lahn wrote: > Cezary Tomczyk wrote: > >> On 05/05/2017 18:14, Thomas 'PointedEars' Lahn wrote: >>> Cezary Tomczyk wrote: >> [...] >>>> I use: >>>> >>>> function isTypeOf(obj, typeToCheck) { >>>> if (arguments.length < 2) { >>>> return false; >>>> } >>>> return Object.prototype.toString.call(obj).slice(8, >>> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ >>>> -1).toLowerCase() === typeToCheck.toLowerCase(); >>> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ >>>> } >>>> >>>> which gives me more precisely a type of object. >>> I hope you have optimized that somewhat. >> >> I can't find a reliable way at the moment. Perhaps I should combine few >> methods, but that might be an overengineering. > > To begin with, you should have > > var _toString = {}.toString; > > function isTypeOf(obj, typeToCheck) { > if (arguments.length < 2) { > return false; > } > return _toString.call(obj).slice(8, -1).toLowerCase() === > typeToCheck.toLowerCase(); > } Tiny optimisation, but that's fine. :-) >>>> The Object.defineProperties says about object, but function, array are >>>> also objects. That's why: >>>> >>>> if (typeof obj !== 'object' || obj === null) >>>> throw new TypeError('bad obj'); >>>> >>>> looks like a bug to me. >>> typeof [] === "object", so that is OK. (common misconception) >> >> In a sense of that [] is an object - yes, but I'd prefer to know that >> tested object is in fact an Array type. Operator instanceof looks >> promising, but I need to check it anyway. > > Array.isArray() exists (since ECMAScript Ed. 5). For general and own > (array) types, I am using “instanceof” or “constructor”. Most of the time, > though, duck typing instead (“quack” ;-)). Ah, right, I forgot about Array.isArray() :) Finally I rewrote it a bit: var _toString = {}.toString; function isTypeOf(obj, typeToCheck) { var objectType; if (arguments.length !== 2) { return false; } objectType = typeof obj; if (typeToCheck === 'array' && Array.isArray(obj) || typeToCheck === 'null' && objectType === 'object' || typeToCheck === 'object' && objectType === 'object' || typeToCheck === 'number' && objectType === 'number' || typeToCheck === 'string' && objectType === 'string' || typeToCheck === 'boolean' && objectType === 'boolean' || typeToCheck === 'undefined' && objectType === 'undefined' || typeToCheck === 'symbol' && objectType === 'symbol' ) { return true; } return _toString.call(obj).slice(8, -1).toLowerCase() === typeToCheck.toLowerCase(); } -- Cezary Tomczyk http://www.ctomczyk.pl/ https://www.aslint.org/ - Accessibility validation tool