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 23:19:44 +0200 Organization: csiph.com Internet News Service Message-ID: References: <1943190.NgBsaNRSFp@PointedEars.de> <1592229.TLkxdtWsSY@PointedEars.de> <2032926.ElGaqSPkdT@PointedEars.de> <1982276.iZASKD2KPV@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 21:19:45 +0000 (UTC) Injection-Info: csiph.com; posting-host="204-73-239-109.cust.centrio.cz:109.239.73.204"; logging-data="20247"; 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: <1982276.iZASKD2KPV@PointedEars.de> Xref: csiph.com comp.lang.javascript:33243 On 06/05/2017 22:21, Thomas 'PointedEars' Lahn wrote: > Cezary Tomczyk wrote: > >> On 06/05/2017 16:43, Thomas 'PointedEars' Lahn wrote: >>> Cezary Tomczyk wrote: >>>> On 05/05/2017 20:11, Thomas 'PointedEars' Lahn wrote: >>>>> 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. :-) >>> >>> Tiny optimization with big impact, I think. It saves >>> >>> - 1 lookup along the scope chain up to the global object for “Object” >>> *every time the function is called* >>> >>> - 2 lookups along the prototype chain each for “prototype” and >>> “toString” >>> *every time the function is called* >>> >>> and removes the dependency on a potentially non-initial value of >>> “Object.prototype” and “Object.prototype.toString”. >> >> That's true, but it is also important to mention that the impact is >> significant in case of hundred operations at the same time. > > It is more significant if this function is called several times in a single- > threaded environment: the slower it is, the slower does the program run. True and if optimization can be done without complexity I am fine with that. >>>> Finally I rewrote it a bit: >>>> […] >>>> function isTypeOf(obj, typeToCheck) { >>>> […] >>>> if (arguments.length !== 2) { >>> This change does not make sense to me. “< 2” was clearer. >> >> Passing 1 argument doesn't make sense and that's why I've used !== 2. > > Yes, but … > >>>> return false; >>>> } >>>> >>>> objectType = typeof obj; >>> IMO, DRY demands declaration and initialization in one statement, if >>> possible. >> >> I did it on purpose. If argument will be !== 2 then it is not efficient >> to initialize anything before. > > [Your reply here does not have anything to do with what you are replying > to.] > > … why should the function return “false” if I pass 3 or more arguments to > it? > > Besides, an insufficient number of arguments should throw an exception > instead. Agreed. In my other post I do throw new Error. >>> The question remains: What is being *gained* by this comparably >>> inefficient precision instead of duck typing? _Not_ all things >>> that *can* be done also *should* be done. >> >> The gain is to get the real type (let me call it like that) of object. > > Why is that important? One of the reason is because I use it in other function that extends deeply one object with another. I can't use Object.assign as the changes on extended object must not mutate original object. -- Cezary Tomczyk http://www.ctomczyk.pl/ https://www.aslint.org/ - Accessibility validation tool