Skip to content

Commit

Permalink
feat: array-like/is
Browse files Browse the repository at this point in the history
  • Loading branch information
medikoo committed Apr 4, 2019
1 parent d313eb6 commit 9a026a5
Show file tree
Hide file tree
Showing 3 changed files with 90 additions and 0 deletions.
22 changes: 22 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -277,6 +277,28 @@ ensureArray("foo"); // Thrown TypeError: null is not a regular expression object

---

#### Array Like

#### `array-like/is`

Restricted _array-like_ confirmation. Returns true for every value that meets following contraints

- is an _object_, or a _string_ if `allowString` option was set
- is not a _function_
- Exposes `length` as [`array-length` coercible value](#array-lengthcoerce)

```javascript
const isArrayLike = require("type/array-like/is");

isArrayLike([]); // true
isArrayLike({}); // false
isArrayLike({ length: 0 }); // true
isArrayLike("foo"); // false
isArrayLike("foo", { allowString: true }); // true
```

---

#### Array length

##### `array-length/coerce`
Expand Down
21 changes: 21 additions & 0 deletions array-like/is.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
"use strict";

var coerceToArrayLength = require("../array-length/coerce")
, isObject = require("../object/is");

module.exports = function (value/*, options*/) {
if (!isObject(value)) {
var options = arguments[1];
if (isObject(options) && options.allowString && typeof value === "string") return true;
return false;
}

if (typeof value === "function") return false;

var length;
try { length = value.length; }
catch (error) { return false; }

if (coerceToArrayLength(length) === null) return false;
return true;
};
47 changes: 47 additions & 0 deletions test/aray-like/is.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
"use strict";

var assert = require("chai").assert
, isArrayLike = require("../../array-like/is");

describe("array-like/is", function () {
it("Should return true on array", function () { assert.equal(isArrayLike([]), true); });
it("Should return true on array-like object", function () {
assert.equal(isArrayLike({ length: 1 }), true);
});
it("Should by default return false on string", function () {
assert.equal(isArrayLike("foo"), false);
});
it("Should accept strings if specified", function () {
assert.equal(isArrayLike("foo", { allowString: true }), true);
});

it("Should return false on objects with negative length", function () {
assert.equal(isArrayLike({ length: -1 }), false);
});

it("Should return false on plain object", function () {
assert.equal(isArrayLike({}), false);
});
it("Should return false on function", function () {
assert.equal(isArrayLike(function () { return true; }), false);
});

if (typeof Object.create === "function") {
it("Should return false on object with no prototype", function () {
assert.equal(isArrayLike(Object.create(null)), false);
});
}
it("Should return false on number", function () { assert.equal(isArrayLike(123), false); });
it("Should return false on NaN", function () { assert.equal(isArrayLike(NaN), false); });
it("Should return false on boolean", function () { assert.equal(isArrayLike(true), false); });
if (typeof Symbol === "function") {
it("Should return false on symbol", function () {
assert.equal(isArrayLike(Symbol("foo")), false);
});
}

it("Should return false on null", function () { assert.equal(isArrayLike(null), false); });
it("Should return false on undefined", function () {
assert.equal(isArrayLike(void 0), false);
});
});

0 comments on commit 9a026a5

Please sign in to comment.