There are some corner cases that arise in the json0 library because -
given an object obj, and an array arr -these statements are both
true in JavaScript:
obj['123'] === obj[123]
arr['123'] === arr[123]
The fact that these statements are true can lead to some unexpected
silent transform() failures:
Fixes: https://github.com/ottypes/json0/issues/37
Background
There are some corner cases that arise in the
json0
library because - given an objectobj
, and an arrayarr
-these statements are bothtrue
in JavaScript:The fact that these statements are true can lead to some unexpected silent
transform()
failures:Actual result:
[{p: ["a", 2, 0], si: "hi"}]
Expected result:[{p: ["a", 0, 0], si: "hi"}]
Solution
In order to prevent this, it's been decided that arrays should always be indexed by
number
, and objects should always be indexed bystring
.This change enforces stricter type checks when calling
apply()
, and now throws in the following cases:number
is used to key an object property:type.apply({'1': 'a'}, [{p:[1], od: 'a'}])
string
is used to key an array property:type.apply(['a'], [{p:['0'], ld: 'a'}])
string
to anumber
:type.apply(1, [{p:[], na: 'a}])
number
to astring
:type.apply('a', [{p:[], na: 1}])
type.apply(1, [{p: [0], si: 'a'}])