]> git.kaiwu.me - njs.git/commitdiff
Added Object.is().
authorArtem S. Povalyukhin <artem.povaluhin@gmail.com>
Thu, 28 Nov 2019 06:59:10 +0000 (09:59 +0300)
committerArtem S. Povalyukhin <artem.povaluhin@gmail.com>
Thu, 28 Nov 2019 06:59:10 +0000 (09:59 +0300)
This closes #260 issue on Github.

src/njs_object.c
src/test/njs_unit_test.c

index 68a8404cffca6d46aff2c7f9cd13277b680d2d28..592f6c9018fd49bad02377a9dec3ee255c84b9ab 100644 (file)
@@ -1761,6 +1761,17 @@ njs_object_assign(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
 }
 
 
+static njs_int_t
+njs_object_is(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
+    njs_index_t unused)
+{
+    njs_set_boolean(&vm->retval, njs_values_same(njs_arg(args, nargs, 1),
+                                                 njs_arg(args, nargs, 2)));
+
+    return NJS_OK;
+}
+
+
 /*
  * The __proto__ property of booleans, numbers and strings primitives,
  * of objects created by Boolean(), Number(), and String() constructors,
@@ -2052,6 +2063,15 @@ static const njs_object_prop_t  njs_object_constructor_properties[] =
         .writable = 1,
         .configurable = 1,
     },
+
+    /* Object.is(). */
+    {
+        .type = NJS_PROPERTY,
+        .name = njs_string("is"),
+        .value = njs_native_function(njs_object_is, 2),
+        .writable = 1,
+        .configurable = 1,
+    },
 };
 
 
index be3d56569fa7f9e8c364ccc3991bd8899c0cd76a..873c5882cae223a5715f4d04b6580347a8b66d3c 100644 (file)
@@ -12036,6 +12036,41 @@ static njs_unit_test_t  njs_test[] =
     { njs_str("Object.isExtensible(undefined)"),
       njs_str("false") },
 
+    /* Object.is() */
+
+    { njs_str("typeof Object.is"),
+      njs_str("function") },
+
+    { njs_str("Object.is.length == 2"),
+      njs_str("true") },
+
+    { njs_str("Object.is()"),
+      njs_str("true") },
+
+    { njs_str("[undefined, null, false, NaN, '', Symbol(), {}]"
+              ".map((x) => Object.is(x, x))"
+              ".every((x) => x === true)"),
+      njs_str("true") },
+
+    { njs_str("[null, false, NaN, '', Symbol(), {}]"
+              ".map((x) => Object.is(x) || Object.is(void 0, x))"
+              ".every((x) => x === false)"),
+      njs_str("true") },
+
+    { njs_str("[false, NaN, '', Symbol()]"
+              ".map((x) => Object.is(Object(x), Object(x)))"
+              ".every((x) => x === false)"),
+      njs_str("true") },
+
+    { njs_str("Object.is(0, -0)"),
+      njs_str("false") },
+
+    { njs_str("Object.is(0, null)"),
+      njs_str("false") },
+
+    { njs_str("Object.is(42, '42')"),
+      njs_str("false") },
+
     { njs_str(
         "var fail;"
         "function isConfigurableMethods(o) {"