Repository files navigation

ArrayLike.js

A minimalist specification and polyfill for allowing any JavaScript object to advertise itself as having Array functionality.

Summary

// javascript libraries can simply use the provided Array.isArrayLike()// to check if an object supports Array methods// alternately, they can internally implement this functionality internally via:functionisArrayLike(obj){returnobj&&obj.__ArrayLike||Object.prototype.toString.call(obj)==='[object Array]';}// either way, javascript container objects can indicate that they provide Array methodsmyContainer.prototype.__ArrayLike=true;// and a polyfill is also available to coerce existing libraries into treating// these ArrayLike objects as actual arrays.

Rationale

JavaScript uses the built in Array type as the go-to sequential container. Libraries invariably use it heavily in their interfaces for providing containers for ordered data.

Many other container types exist that provide similar functionality to JavaScript Arrays, but are implemented as JavaScript objects. Several of these array-like objects are well established, such as the JavaScript arguments object for holding variable-length arguments lists and the results of many DOM methods such as document.getElementsByTagName(). But other new container objects are also possible that can provide additional convenience for the programmer, new semantics not otherwise available in the JavaScript Array object, or might represent sequential types in other programming languages implemented in JavaScript.

These new container objects often choose to implement some of all of the JavaScript Array methods to provide an interface familiar to JavaScript programmers and be interoperable with existing JavaScript libraries. However, JavaScript interop is often thwarted by libraries which inspect their arguments and require bona fide JavaScript Array as a prerequisite to further processing.

This specification serves to offer an alternative to JavaScript library writers in order to allow these chimera array-like objects to advertise their ability to supports Array methods. Several examples of potential use cases for using these array-like container objects are also available separately. In addition, this repo provides a polyfill for programmers who wish to use these handy container objects today in lieu of cooperating JavaScript libraries.

ArrayLike.js Specification

A separate page details JavaScript's current idioms for determining if an object is an array. For the two accepted best practices of using Object.prototype.toString and Array.isArray, the ArrayLike.js specification adds one additional check on the object. Should an object contain a property named __ArrayLike which evaluates to true, then that object can be used in a context expecting Array methods and funcationlity.

This functionality is available via a new Array.isArrayLike method, which is provided in the ArrayLike.js source file.

JavaScript library authors and maintainers can use this Array.isArrayLike method to check if an object support Array methods. Or if an internal function is preferred, the following code functions equivalently:

functionisArrayLike(obj){returnobj&&obj.__ArrayLike||Object.prototype.toString.call(obj)==='[object Array]';}

As does this form which uses Array.isArray directly:

functionisArrayLike(obj){returnobj&&obj.__ArrayLike||Array.isArray(obj);}

In all cases, authors of container objects that wish to conform to this standard have a very simple means of indicating to library consumers that the container should be treated as an array:

myContainer.prototype.__ArrayLike=true;

ArrayLike.js Polyfill

A JavaScript polyfill is available for using ArrayLike containers on libraries that do not otherwise use this ArrayLike.js convention. This polyfill works by patching the Object.prototype.toString method as well as the Array.isArray method so that ArrayLike container objects will instead pass the standard JavaScript Array introspection checks.

The ArrayLike.js authors very much prefer JavaScript libraries to conform to this ArrayLike specification so that this polyfill is unnecessary. However, it is offered as a useful crutch to anyone wanting to use the current family of ArrayLike containers without modifying existing JavaScript libraries.

Sample Code

In addition to the ArrayLike polyfill, this repository contains a simple example of an ArrayLike container object, along with two libraries. One library conforms to the spec above and recognizes the container object as an array, and the other does not but is made to be compatible via the polyfill. The conforming example and the polyfill example are both viewable online, and viewing the source will show that the output is generated by feeding the example library native arrays followed by an isArrayLike.js conformant container object.

ArrayLike containers

  • mrhyde lets native ClojureScript containers to play nice with JavaScript libraries.
  • array provides a better array for the browser and node.js

JavaScript libraries recognizing ArrayLike containers

  • D3.js treats objects that are not functions as arrays

JavaScript libraries compatible via ArrayLikeIsArray.js polyfill

Contributing

Feedback welcome.

About

specification and polyfill for allowing any JavaScript object to function as an array

Resources

Stars

7 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

ArrayLike.js

A minimalist specification and polyfill for allowing any JavaScript object to advertise itself as having Array functionality.

Summary

// javascript libraries can simply use the provided Array.isArrayLike()// to check if an object supports Array methods// alternately, they can internally implement this functionality internally via:functionisArrayLike(obj){returnobj&&obj.__ArrayLike||Object.prototype.toString.call(obj)==='[object Array]';}// either way, javascript container objects can indicate that they provide Array methodsmyContainer.prototype.__ArrayLike=true;// and a polyfill is also available to coerce existing libraries into treating// these ArrayLike objects as actual arrays.

Rationale

JavaScript uses the built in Array type as the go-to sequential container. Libraries invariably use it heavily in their interfaces for providing containers for ordered data.

Many other container types exist that provide similar functionality to JavaScript Arrays, but are implemented as JavaScript objects. Several of these array-like objects are well established, such as the JavaScript arguments object for holding variable-length arguments lists and the results of many DOM methods such as document.getElementsByTagName(). But other new container objects are also possible that can provide additional convenience for the programmer, new semantics not otherwise available in the JavaScript Array object, or might represent sequential types in other programming languages implemented in JavaScript.

These new container objects often choose to implement some of all of the JavaScript Array methods to provide an interface familiar to JavaScript programmers and be interoperable with existing JavaScript libraries. However, JavaScript interop is often thwarted by libraries which inspect their arguments and require bona fide JavaScript Array as a prerequisite to further processing.

This specification serves to offer an alternative to JavaScript library writers in order to allow these chimera array-like objects to advertise their ability to supports Array methods. Several examples of potential use cases for using these array-like container objects are also available separately. In addition, this repo provides a polyfill for programmers who wish to use these handy container objects today in lieu of cooperating JavaScript libraries.

ArrayLike.js Specification

A separate page details JavaScript's current idioms for determining if an object is an array. For the two accepted best practices of using Object.prototype.toString and Array.isArray, the ArrayLike.js specification adds one additional check on the object. Should an object contain a property named __ArrayLike which evaluates to true, then that object can be used in a context expecting Array methods and funcationlity.

This functionality is available via a new Array.isArrayLike method, which is provided in the ArrayLike.js source file.

JavaScript library authors and maintainers can use this Array.isArrayLike method to check if an object support Array methods. Or if an internal function is preferred, the following code functions equivalently:

functionisArrayLike(obj){returnobj&&obj.__ArrayLike||Object.prototype.toString.call(obj)==='[object Array]';}

As does this form which uses Array.isArray directly:

functionisArrayLike(obj){returnobj&&obj.__ArrayLike||Array.isArray(obj);}

In all cases, authors of container objects that wish to conform to this standard have a very simple means of indicating to library consumers that the container should be treated as an array:

myContainer.prototype.__ArrayLike=true;

ArrayLike.js Polyfill

A JavaScript polyfill is available for using ArrayLike containers on libraries that do not otherwise use this ArrayLike.js convention. This polyfill works by patching the Object.prototype.toString method as well as the Array.isArray method so that ArrayLike container objects will instead pass the standard JavaScript Array introspection checks.

The ArrayLike.js authors very much prefer JavaScript libraries to conform to this ArrayLike specification so that this polyfill is unnecessary. However, it is offered as a useful crutch to anyone wanting to use the current family of ArrayLike containers without modifying existing JavaScript libraries.

Sample Code

In addition to the ArrayLike polyfill, this repository contains a simple example of an ArrayLike container object, along with two libraries. One library conforms to the spec above and recognizes the container object as an array, and the other does not but is made to be compatible via the polyfill. The conforming example and the polyfill example are both viewable online, and viewing the source will show that the output is generated by feeding the example library native arrays followed by an isArrayLike.js conformant container object.

ArrayLike containers

  • mrhyde lets native ClojureScript containers to play nice with JavaScript libraries.
  • array provides a better array for the browser and node.js

JavaScript libraries recognizing ArrayLike containers

  • D3.js treats objects that are not functions as arrays

JavaScript libraries compatible via ArrayLikeIsArray.js polyfill

Contributing

Feedback welcome.

About

specification and polyfill for allowing any JavaScript object to function as an array

Resources

Stars

7 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

ArrayLike.js

A minimalist specification and polyfill for allowing any JavaScript object to advertise itself as having Array functionality.

Summary

// javascript libraries can simply use the provided Array.isArrayLike()// to check if an object supports Array methods// alternately, they can internally implement this functionality internally via:functionisArrayLike(obj){returnobj&&obj.__ArrayLike||Object.prototype.toString.call(obj)==='[object Array]';}// either way, javascript container objects can indicate that they provide Array methodsmyContainer.prototype.__ArrayLike=true;// and a polyfill is also available to coerce existing libraries into treating// these ArrayLike objects as actual arrays.

Rationale

JavaScript uses the built in Array type as the go-to sequential container. Libraries invariably use it heavily in their interfaces for providing containers for ordered data.

Many other container types exist that provide similar functionality to JavaScript Arrays, but are implemented as JavaScript objects. Several of these array-like objects are well established, such as the JavaScript arguments object for holding variable-length arguments lists and the results of many DOM methods such as document.getElementsByTagName(). But other new container objects are also possible that can provide additional convenience for the programmer, new semantics not otherwise available in the JavaScript Array object, or might represent sequential types in other programming languages implemented in JavaScript.

These new container objects often choose to implement some of all of the JavaScript Array methods to provide an interface familiar to JavaScript programmers and be interoperable with existing JavaScript libraries. However, JavaScript interop is often thwarted by libraries which inspect their arguments and require bona fide JavaScript Array as a prerequisite to further processing.

This specification serves to offer an alternative to JavaScript library writers in order to allow these chimera array-like objects to advertise their ability to supports Array methods. Several examples of potential use cases for using these array-like container objects are also available separately. In addition, this repo provides a polyfill for programmers who wish to use these handy container objects today in lieu of cooperating JavaScript libraries.

ArrayLike.js Specification

A separate page details JavaScript's current idioms for determining if an object is an array. For the two accepted best practices of using Object.prototype.toString and Array.isArray, the ArrayLike.js specification adds one additional check on the object. Should an object contain a property named __ArrayLike which evaluates to true, then that object can be used in a context expecting Array methods and funcationlity.

This functionality is available via a new Array.isArrayLike method, which is provided in the ArrayLike.js source file.

JavaScript library authors and maintainers can use this Array.isArrayLike method to check if an object support Array methods. Or if an internal function is preferred, the following code functions equivalently:

functionisArrayLike(obj){returnobj&&obj.__ArrayLike||Object.prototype.toString.call(obj)==='[object Array]';}

As does this form which uses Array.isArray directly:

functionisArrayLike(obj){returnobj&&obj.__ArrayLike||Array.isArray(obj);}

In all cases, authors of container objects that wish to conform to this standard have a very simple means of indicating to library consumers that the container should be treated as an array:

myContainer.prototype.__ArrayLike=true;

ArrayLike.js Polyfill

A JavaScript polyfill is available for using ArrayLike containers on libraries that do not otherwise use this ArrayLike.js convention. This polyfill works by patching the Object.prototype.toString method as well as the Array.isArray method so that ArrayLike container objects will instead pass the standard JavaScript Array introspection checks.

The ArrayLike.js authors very much prefer JavaScript libraries to conform to this ArrayLike specification so that this polyfill is unnecessary. However, it is offered as a useful crutch to anyone wanting to use the current family of ArrayLike containers without modifying existing JavaScript libraries.

Sample Code

In addition to the ArrayLike polyfill, this repository contains a simple example of an ArrayLike container object, along with two libraries. One library conforms to the spec above and recognizes the container object as an array, and the other does not but is made to be compatible via the polyfill. The conforming example and the polyfill example are both viewable online, and viewing the source will show that the output is generated by feeding the example library native arrays followed by an isArrayLike.js conformant container object.

ArrayLike containers

  • mrhyde lets native ClojureScript containers to play nice with JavaScript libraries.
  • array provides a better array for the browser and node.js

JavaScript libraries recognizing ArrayLike containers

  • D3.js treats objects that are not functions as arrays

JavaScript libraries compatible via ArrayLikeIsArray.js polyfill

Contributing

Feedback welcome.

About

specification and polyfill for allowing any JavaScript object to function as an array

Resources

Stars

7 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

ArrayLike.js

A minimalist specification and polyfill for allowing any JavaScript object to advertise itself as having Array functionality.

Summary

// javascript libraries can simply use the provided Array.isArrayLike()// to check if an object supports Array methods// alternately, they can internally implement this functionality internally via:functionisArrayLike(obj){returnobj&&obj.__ArrayLike||Object.prototype.toString.call(obj)==='[object Array]';}// either way, javascript container objects can indicate that they provide Array methodsmyContainer.prototype.__ArrayLike=true;// and a polyfill is also available to coerce existing libraries into treating// these ArrayLike objects as actual arrays.

Rationale

JavaScript uses the built in Array type as the go-to sequential container. Libraries invariably use it heavily in their interfaces for providing containers for ordered data.

Many other container types exist that provide similar functionality to JavaScript Arrays, but are implemented as JavaScript objects. Several of these array-like objects are well established, such as the JavaScript arguments object for holding variable-length arguments lists and the results of many DOM methods such as document.getElementsByTagName(). But other new container objects are also possible that can provide additional convenience for the programmer, new semantics not otherwise available in the JavaScript Array object, or might represent sequential types in other programming languages implemented in JavaScript.

These new container objects often choose to implement some of all of the JavaScript Array methods to provide an interface familiar to JavaScript programmers and be interoperable with existing JavaScript libraries. However, JavaScript interop is often thwarted by libraries which inspect their arguments and require bona fide JavaScript Array as a prerequisite to further processing.

This specification serves to offer an alternative to JavaScript library writers in order to allow these chimera array-like objects to advertise their ability to supports Array methods. Several examples of potential use cases for using these array-like container objects are also available separately. In addition, this repo provides a polyfill for programmers who wish to use these handy container objects today in lieu of cooperating JavaScript libraries.

ArrayLike.js Specification

A separate page details JavaScript's current idioms for determining if an object is an array. For the two accepted best practices of using Object.prototype.toString and Array.isArray, the ArrayLike.js specification adds one additional check on the object. Should an object contain a property named __ArrayLike which evaluates to true, then that object can be used in a context expecting Array methods and funcationlity.

This functionality is available via a new Array.isArrayLike method, which is provided in the ArrayLike.js source file.

JavaScript library authors and maintainers can use this Array.isArrayLike method to check if an object support Array methods. Or if an internal function is preferred, the following code functions equivalently:

functionisArrayLike(obj){returnobj&&obj.__ArrayLike||Object.prototype.toString.call(obj)==='[object Array]';}

As does this form which uses Array.isArray directly:

functionisArrayLike(obj){returnobj&&obj.__ArrayLike||Array.isArray(obj);}

In all cases, authors of container objects that wish to conform to this standard have a very simple means of indicating to library consumers that the container should be treated as an array:

myContainer.prototype.__ArrayLike=true;

ArrayLike.js Polyfill

A JavaScript polyfill is available for using ArrayLike containers on libraries that do not otherwise use this ArrayLike.js convention. This polyfill works by patching the Object.prototype.toString method as well as the Array.isArray method so that ArrayLike container objects will instead pass the standard JavaScript Array introspection checks.

The ArrayLike.js authors very much prefer JavaScript libraries to conform to this ArrayLike specification so that this polyfill is unnecessary. However, it is offered as a useful crutch to anyone wanting to use the current family of ArrayLike containers without modifying existing JavaScript libraries.

Sample Code

In addition to the ArrayLike polyfill, this repository contains a simple example of an ArrayLike container object, along with two libraries. One library conforms to the spec above and recognizes the container object as an array, and the other does not but is made to be compatible via the polyfill. The conforming example and the polyfill example are both viewable online, and viewing the source will show that the output is generated by feeding the example library native arrays followed by an isArrayLike.js conformant container object.

ArrayLike containers

  • mrhyde lets native ClojureScript containers to play nice with JavaScript libraries.
  • array provides a better array for the browser and node.js

JavaScript libraries recognizing ArrayLike containers

  • D3.js treats objects that are not functions as arrays

JavaScript libraries compatible via ArrayLikeIsArray.js polyfill

Contributing

Feedback welcome.

About

specification and polyfill for allowing any JavaScript object to function as an array

Resources

Stars

7 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

ArrayLike.js

A minimalist specification and polyfill for allowing any JavaScript object to advertise itself as having Array functionality.

Summary

// javascript libraries can simply use the provided Array.isArrayLike()// to check if an object supports Array methods// alternately, they can internally implement this functionality internally via:functionisArrayLike(obj){returnobj&&obj.__ArrayLike||Object.prototype.toString.call(obj)==='[object Array]';}// either way, javascript container objects can indicate that they provide Array methodsmyContainer.prototype.__ArrayLike=true;// and a polyfill is also available to coerce existing libraries into treating// these ArrayLike objects as actual arrays.

Rationale

JavaScript uses the built in Array type as the go-to sequential container. Libraries invariably use it heavily in their interfaces for providing containers for ordered data.

Many other container types exist that provide similar functionality to JavaScript Arrays, but are implemented as JavaScript objects. Several of these array-like objects are well established, such as the JavaScript arguments object for holding variable-length arguments lists and the results of many DOM methods such as document.getElementsByTagName(). But other new container objects are also possible that can provide additional convenience for the programmer, new semantics not otherwise available in the JavaScript Array object, or might represent sequential types in other programming languages implemented in JavaScript.

These new container objects often choose to implement some of all of the JavaScript Array methods to provide an interface familiar to JavaScript programmers and be interoperable with existing JavaScript libraries. However, JavaScript interop is often thwarted by libraries which inspect their arguments and require bona fide JavaScript Array as a prerequisite to further processing.

This specification serves to offer an alternative to JavaScript library writers in order to allow these chimera array-like objects to advertise their ability to supports Array methods. Several examples of potential use cases for using these array-like container objects are also available separately. In addition, this repo provides a polyfill for programmers who wish to use these handy container objects today in lieu of cooperating JavaScript libraries.

ArrayLike.js Specification

A separate page details JavaScript's current idioms for determining if an object is an array. For the two accepted best practices of using Object.prototype.toString and Array.isArray, the ArrayLike.js specification adds one additional check on the object. Should an object contain a property named __ArrayLike which evaluates to true, then that object can be used in a context expecting Array methods and funcationlity.

This functionality is available via a new Array.isArrayLike method, which is provided in the ArrayLike.js source file.

JavaScript library authors and maintainers can use this Array.isArrayLike method to check if an object support Array methods. Or if an internal function is preferred, the following code functions equivalently:

functionisArrayLike(obj){returnobj&&obj.__ArrayLike||Object.prototype.toString.call(obj)==='[object Array]';}

As does this form which uses Array.isArray directly:

functionisArrayLike(obj){returnobj&&obj.__ArrayLike||Array.isArray(obj);}

In all cases, authors of container objects that wish to conform to this standard have a very simple means of indicating to library consumers that the container should be treated as an array:

myContainer.prototype.__ArrayLike=true;

ArrayLike.js Polyfill

A JavaScript polyfill is available for using ArrayLike containers on libraries that do not otherwise use this ArrayLike.js convention. This polyfill works by patching the Object.prototype.toString method as well as the Array.isArray method so that ArrayLike container objects will instead pass the standard JavaScript Array introspection checks.

The ArrayLike.js authors very much prefer JavaScript libraries to conform to this ArrayLike specification so that this polyfill is unnecessary. However, it is offered as a useful crutch to anyone wanting to use the current family of ArrayLike containers without modifying existing JavaScript libraries.

Sample Code

In addition to the ArrayLike polyfill, this repository contains a simple example of an ArrayLike container object, along with two libraries. One library conforms to the spec above and recognizes the container object as an array, and the other does not but is made to be compatible via the polyfill. The conforming example and the polyfill example are both viewable online, and viewing the source will show that the output is generated by feeding the example library native arrays followed by an isArrayLike.js conformant container object.

ArrayLike containers

  • mrhyde lets native ClojureScript containers to play nice with JavaScript libraries.
  • array provides a better array for the browser and node.js

JavaScript libraries recognizing ArrayLike containers

  • D3.js treats objects that are not functions as arrays

JavaScript libraries compatible via ArrayLikeIsArray.js polyfill

Contributing

Feedback welcome.

About

specification and polyfill for allowing any JavaScript object to function as an array

Resources

Stars

7 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

ArrayLike.js

A minimalist specification and polyfill for allowing any JavaScript object to advertise itself as having Array functionality.

Summary

// javascript libraries can simply use the provided Array.isArrayLike()// to check if an object supports Array methods// alternately, they can internally implement this functionality internally via:functionisArrayLike(obj){returnobj&&obj.__ArrayLike||Object.prototype.toString.call(obj)==='[object Array]';}// either way, javascript container objects can indicate that they provide Array methodsmyContainer.prototype.__ArrayLike=true;// and a polyfill is also available to coerce existing libraries into treating// these ArrayLike objects as actual arrays.

Rationale

JavaScript uses the built in Array type as the go-to sequential container. Libraries invariably use it heavily in their interfaces for providing containers for ordered data.

Many other container types exist that provide similar functionality to JavaScript Arrays, but are implemented as JavaScript objects. Several of these array-like objects are well established, such as the JavaScript arguments object for holding variable-length arguments lists and the results of many DOM methods such as document.getElementsByTagName(). But other new container objects are also possible that can provide additional convenience for the programmer, new semantics not otherwise available in the JavaScript Array object, or might represent sequential types in other programming languages implemented in JavaScript.

These new container objects often choose to implement some of all of the JavaScript Array methods to provide an interface familiar to JavaScript programmers and be interoperable with existing JavaScript libraries. However, JavaScript interop is often thwarted by libraries which inspect their arguments and require bona fide JavaScript Array as a prerequisite to further processing.

This specification serves to offer an alternative to JavaScript library writers in order to allow these chimera array-like objects to advertise their ability to supports Array methods. Several examples of potential use cases for using these array-like container objects are also available separately. In addition, this repo provides a polyfill for programmers who wish to use these handy container objects today in lieu of cooperating JavaScript libraries.

ArrayLike.js Specification

A separate page details JavaScript's current idioms for determining if an object is an array. For the two accepted best practices of using Object.prototype.toString and Array.isArray, the ArrayLike.js specification adds one additional check on the object. Should an object contain a property named __ArrayLike which evaluates to true, then that object can be used in a context expecting Array methods and funcationlity.

This functionality is available via a new Array.isArrayLike method, which is provided in the ArrayLike.js source file.

JavaScript library authors and maintainers can use this Array.isArrayLike method to check if an object support Array methods. Or if an internal function is preferred, the following code functions equivalently:

functionisArrayLike(obj){returnobj&&obj.__ArrayLike||Object.prototype.toString.call(obj)==='[object Array]';}

As does this form which uses Array.isArray directly:

functionisArrayLike(obj){returnobj&&obj.__ArrayLike||Array.isArray(obj);}

In all cases, authors of container objects that wish to conform to this standard have a very simple means of indicating to library consumers that the container should be treated as an array:

myContainer.prototype.__ArrayLike=true;

ArrayLike.js Polyfill

A JavaScript polyfill is available for using ArrayLike containers on libraries that do not otherwise use this ArrayLike.js convention. This polyfill works by patching the Object.prototype.toString method as well as the Array.isArray method so that ArrayLike container objects will instead pass the standard JavaScript Array introspection checks.

The ArrayLike.js authors very much prefer JavaScript libraries to conform to this ArrayLike specification so that this polyfill is unnecessary. However, it is offered as a useful crutch to anyone wanting to use the current family of ArrayLike containers without modifying existing JavaScript libraries.

Sample Code

In addition to the ArrayLike polyfill, this repository contains a simple example of an ArrayLike container object, along with two libraries. One library conforms to the spec above and recognizes the container object as an array, and the other does not but is made to be compatible via the polyfill. The conforming example and the polyfill example are both viewable online, and viewing the source will show that the output is generated by feeding the example library native arrays followed by an isArrayLike.js conformant container object.

ArrayLike containers

  • mrhyde lets native ClojureScript containers to play nice with JavaScript libraries.
  • array provides a better array for the browser and node.js

JavaScript libraries recognizing ArrayLike containers

  • D3.js treats objects that are not functions as arrays

JavaScript libraries compatible via ArrayLikeIsArray.js polyfill

Contributing

Feedback welcome.

About

specification and polyfill for allowing any JavaScript object to function as an array

Resources

Stars

7 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

ArrayLike.js

A minimalist specification and polyfill for allowing any JavaScript object to advertise itself as having Array functionality.

Summary

// javascript libraries can simply use the provided Array.isArrayLike()// to check if an object supports Array methods// alternately, they can internally implement this functionality internally via:functionisArrayLike(obj){returnobj&&obj.__ArrayLike||Object.prototype.toString.call(obj)==='[object Array]';}// either way, javascript container objects can indicate that they provide Array methodsmyContainer.prototype.__ArrayLike=true;// and a polyfill is also available to coerce existing libraries into treating// these ArrayLike objects as actual arrays.

Rationale

JavaScript uses the built in Array type as the go-to sequential container. Libraries invariably use it heavily in their interfaces for providing containers for ordered data.

Many other container types exist that provide similar functionality to JavaScript Arrays, but are implemented as JavaScript objects. Several of these array-like objects are well established, such as the JavaScript arguments object for holding variable-length arguments lists and the results of many DOM methods such as document.getElementsByTagName(). But other new container objects are also possible that can provide additional convenience for the programmer, new semantics not otherwise available in the JavaScript Array object, or might represent sequential types in other programming languages implemented in JavaScript.

These new container objects often choose to implement some of all of the JavaScript Array methods to provide an interface familiar to JavaScript programmers and be interoperable with existing JavaScript libraries. However, JavaScript interop is often thwarted by libraries which inspect their arguments and require bona fide JavaScript Array as a prerequisite to further processing.

This specification serves to offer an alternative to JavaScript library writers in order to allow these chimera array-like objects to advertise their ability to supports Array methods. Several examples of potential use cases for using these array-like container objects are also available separately. In addition, this repo provides a polyfill for programmers who wish to use these handy container objects today in lieu of cooperating JavaScript libraries.

ArrayLike.js Specification

A separate page details JavaScript's current idioms for determining if an object is an array. For the two accepted best practices of using Object.prototype.toString and Array.isArray, the ArrayLike.js specification adds one additional check on the object. Should an object contain a property named __ArrayLike which evaluates to true, then that object can be used in a context expecting Array methods and funcationlity.

This functionality is available via a new Array.isArrayLike method, which is provided in the ArrayLike.js source file.

JavaScript library authors and maintainers can use this Array.isArrayLike method to check if an object support Array methods. Or if an internal function is preferred, the following code functions equivalently:

functionisArrayLike(obj){returnobj&&obj.__ArrayLike||Object.prototype.toString.call(obj)==='[object Array]';}

As does this form which uses Array.isArray directly:

functionisArrayLike(obj){returnobj&&obj.__ArrayLike||Array.isArray(obj);}

In all cases, authors of container objects that wish to conform to this standard have a very simple means of indicating to library consumers that the container should be treated as an array:

myContainer.prototype.__ArrayLike=true;

ArrayLike.js Polyfill

A JavaScript polyfill is available for using ArrayLike containers on libraries that do not otherwise use this ArrayLike.js convention. This polyfill works by patching the Object.prototype.toString method as well as the Array.isArray method so that ArrayLike container objects will instead pass the standard JavaScript Array introspection checks.

The ArrayLike.js authors very much prefer JavaScript libraries to conform to this ArrayLike specification so that this polyfill is unnecessary. However, it is offered as a useful crutch to anyone wanting to use the current family of ArrayLike containers without modifying existing JavaScript libraries.

Sample Code

In addition to the ArrayLike polyfill, this repository contains a simple example of an ArrayLike container object, along with two libraries. One library conforms to the spec above and recognizes the container object as an array, and the other does not but is made to be compatible via the polyfill. The conforming example and the polyfill example are both viewable online, and viewing the source will show that the output is generated by feeding the example library native arrays followed by an isArrayLike.js conformant container object.

ArrayLike containers

  • mrhyde lets native ClojureScript containers to play nice with JavaScript libraries.
  • array provides a better array for the browser and node.js

JavaScript libraries recognizing ArrayLike containers

  • D3.js treats objects that are not functions as arrays

JavaScript libraries compatible via ArrayLikeIsArray.js polyfill

Contributing

Feedback welcome.

About

specification and polyfill for allowing any JavaScript object to function as an array

Resources

Stars

7 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

ArrayLike.js

A minimalist specification and polyfill for allowing any JavaScript object to advertise itself as having Array functionality.

Summary

// javascript libraries can simply use the provided Array.isArrayLike()// to check if an object supports Array methods// alternately, they can internally implement this functionality internally via:functionisArrayLike(obj){returnobj&&obj.__ArrayLike||Object.prototype.toString.call(obj)==='[object Array]';}// either way, javascript container objects can indicate that they provide Array methodsmyContainer.prototype.__ArrayLike=true;// and a polyfill is also available to coerce existing libraries into treating// these ArrayLike objects as actual arrays.

Rationale

JavaScript uses the built in Array type as the go-to sequential container. Libraries invariably use it heavily in their interfaces for providing containers for ordered data.

Many other container types exist that provide similar functionality to JavaScript Arrays, but are implemented as JavaScript objects. Several of these array-like objects are well established, such as the JavaScript arguments object for holding variable-length arguments lists and the results of many DOM methods such as document.getElementsByTagName(). But other new container objects are also possible that can provide additional convenience for the programmer, new semantics not otherwise available in the JavaScript Array object, or might represent sequential types in other programming languages implemented in JavaScript.

These new container objects often choose to implement some of all of the JavaScript Array methods to provide an interface familiar to JavaScript programmers and be interoperable with existing JavaScript libraries. However, JavaScript interop is often thwarted by libraries which inspect their arguments and require bona fide JavaScript Array as a prerequisite to further processing.

This specification serves to offer an alternative to JavaScript library writers in order to allow these chimera array-like objects to advertise their ability to supports Array methods. Several examples of potential use cases for using these array-like container objects are also available separately. In addition, this repo provides a polyfill for programmers who wish to use these handy container objects today in lieu of cooperating JavaScript libraries.

ArrayLike.js Specification

A separate page details JavaScript's current idioms for determining if an object is an array. For the two accepted best practices of using Object.prototype.toString and Array.isArray, the ArrayLike.js specification adds one additional check on the object. Should an object contain a property named __ArrayLike which evaluates to true, then that object can be used in a context expecting Array methods and funcationlity.

This functionality is available via a new Array.isArrayLike method, which is provided in the ArrayLike.js source file.

JavaScript library authors and maintainers can use this Array.isArrayLike method to check if an object support Array methods. Or if an internal function is preferred, the following code functions equivalently:

functionisArrayLike(obj){returnobj&&obj.__ArrayLike||Object.prototype.toString.call(obj)==='[object Array]';}

As does this form which uses Array.isArray directly:

functionisArrayLike(obj){returnobj&&obj.__ArrayLike||Array.isArray(obj);}

In all cases, authors of container objects that wish to conform to this standard have a very simple means of indicating to library consumers that the container should be treated as an array:

myContainer.prototype.__ArrayLike=true;

ArrayLike.js Polyfill

A JavaScript polyfill is available for using ArrayLike containers on libraries that do not otherwise use this ArrayLike.js convention. This polyfill works by patching the Object.prototype.toString method as well as the Array.isArray method so that ArrayLike container objects will instead pass the standard JavaScript Array introspection checks.

The ArrayLike.js authors very much prefer JavaScript libraries to conform to this ArrayLike specification so that this polyfill is unnecessary. However, it is offered as a useful crutch to anyone wanting to use the current family of ArrayLike containers without modifying existing JavaScript libraries.

Sample Code

In addition to the ArrayLike polyfill, this repository contains a simple example of an ArrayLike container object, along with two libraries. One library conforms to the spec above and recognizes the container object as an array, and the other does not but is made to be compatible via the polyfill. The conforming example and the polyfill example are both viewable online, and viewing the source will show that the output is generated by feeding the example library native arrays followed by an isArrayLike.js conformant container object.

ArrayLike containers

  • mrhyde lets native ClojureScript containers to play nice with JavaScript libraries.
  • array provides a better array for the browser and node.js

JavaScript libraries recognizing ArrayLike containers

  • D3.js treats objects that are not functions as arrays

JavaScript libraries compatible via ArrayLikeIsArray.js polyfill

Contributing

Feedback welcome.

About

specification and polyfill for allowing any JavaScript object to function as an array

Resources

Stars

7 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages