diff --git a/src/jv_aux.c b/src/jv_aux.c
index 3153d6e61b..6a5efa9432 100644
--- a/src/jv_aux.c
+++ b/src/jv_aux.c
@@ -215,6 +215,7 @@ jv jv_has(jv t, jv k) {
   } else if (jv_get_kind(t) == JV_KIND_ARRAY &&
              jv_get_kind(k) == JV_KIND_NUMBER) {
     if (jvp_number_is_nan(k)) {
+      jv_free(t);
       ret = jv_false();
     } else {
       jv elem = jv_array_get(t, (int)jv_number_value(k));
diff --git a/src/jv_parse.c b/src/jv_parse.c
index e91f65d02b..2caf330b29 100644
--- a/src/jv_parse.c
+++ b/src/jv_parse.c
@@ -490,7 +490,11 @@ static pfunc check_literal(struct jv_parser* p) {
   switch (p->tokenbuf[0]) {
   case 't': pattern = "true"; plen = 4; v = jv_true(); break;
   case 'f': pattern = "false"; plen = 5; v = jv_false(); break;
-  case 'n': pattern = "null"; plen = 4; v = jv_null(); break;
+  case 'n':
+    // if it starts with 'n', it could be a literal "nan"
+    if (p->tokenpos != 3) {
+      pattern = "null"; plen = 4; v = jv_null();
+    }
   }
   if (pattern) {
     if (p->tokenpos != plen) return "Invalid literal";
diff --git a/tests/jq.test b/tests/jq.test
index 3182c1f362..4a8bfeee0c 100644
--- a/tests/jq.test
+++ b/tests/jq.test
@@ -1799,6 +1799,18 @@ reduce .[] as $then (4 as $else | $else; . as $elif | . + $then * $elif)
 
 
 # { $__loc__ } works
+
 { a, $__loc__, c }
 {"a":[1,2,3],"b":"foo","c":{"hi":"hey"}}
 {"a":[1,2,3],"__loc__":{"file":"<top-level>","line":1},"c":{"hi":"hey"}}
+
+
+# nan is parsed as a valid NaN value from JSON
+
+fromjson | isnan
+"nan"
+true
+
+tojson | fromjson
+{"a":nan}
+{"a":null}