From e64959acb08f3d316e2da9900bb8b28f2364dd71 Mon Sep 17 00:00:00 2001 From: "Artem S. Povalyukhin" Date: Thu, 28 Nov 2019 09:59:10 +0300 Subject: [PATCH] Added Object.is(). This closes #260 issue on Github. --- src/njs_object.c | 20 ++++++++++++++++++++ src/test/njs_unit_test.c | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+) diff --git a/src/njs_object.c b/src/njs_object.c index 68a8404c..592f6c90 100644 --- a/src/njs_object.c +++ b/src/njs_object.c @@ -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, + }, }; diff --git a/src/test/njs_unit_test.c b/src/test/njs_unit_test.c index be3d5656..873c5882 100644 --- a/src/test/njs_unit_test.c +++ b/src/test/njs_unit_test.c @@ -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) {" -- 2.47.3