LibJS: Implement Number.isNaN()

Like the global isNaN() without the number coercion.
This commit is contained in:
Linus Groh 2020-04-26 18:31:56 +01:00 committed by Andreas Kling
parent c350f5ae67
commit 7bd6b58b29
Notes: sideshowbarker 2024-07-19 07:16:21 +09:00
4 changed files with 38 additions and 2 deletions

View file

@ -138,8 +138,7 @@ Value GlobalObject::gc(Interpreter& interpreter)
Value GlobalObject::is_nan(Interpreter& interpreter)
{
auto value = interpreter.argument(0).to_number();
return Value(value.is_nan());
return Value(interpreter.argument(0).to_number().is_nan());
}
Value GlobalObject::is_finite(Interpreter& interpreter)

View file

@ -41,6 +41,7 @@ NumberConstructor::NumberConstructor()
: NativeFunction("Number", *interpreter().global_object().function_prototype())
{
put_native_function("isFinite", is_finite, 1);
put_native_function("isNaN", is_nan, 1);
put_native_function("isSafeInteger", is_safe_integer, 1);
put("prototype", interpreter().global_object().number_prototype());
@ -79,6 +80,11 @@ Value NumberConstructor::is_finite(Interpreter& interpreter)
return Value(interpreter.argument(0).is_finite_number());
}
Value NumberConstructor::is_nan(Interpreter& interpreter)
{
return Value(interpreter.argument(0).is_nan());
}
Value NumberConstructor::is_safe_integer(Interpreter& interpreter)
{
if (!interpreter.argument(0).is_number())

View file

@ -43,6 +43,7 @@ private:
virtual const char* class_name() const override { return "NumberConstructor"; }
static Value is_finite(Interpreter&);
static Value is_nan(Interpreter&);
static Value is_safe_integer(Interpreter&);
};

View file

@ -0,0 +1,30 @@
load("test-common.js");
try {
assert(Number.isNaN.length === 1);
assert(Number.isNaN(0) === false);
assert(Number.isNaN(42) === false);
assert(Number.isNaN("") === false);
assert(Number.isNaN("0") === false);
assert(Number.isNaN("42") === false);
assert(Number.isNaN(true) === false);
assert(Number.isNaN(false) === false);
assert(Number.isNaN(null) === false);
assert(Number.isNaN([]) === false);
assert(Number.isNaN(Infinity) === false);
assert(Number.isNaN(-Infinity) === false);
assert(Number.isNaN() === false);
assert(Number.isNaN(undefined) === false);
assert(Number.isNaN("foo") === false);
assert(Number.isNaN({}) === false);
assert(Number.isNaN([1, 2, 3]) === false);
assert(Number.isNaN(NaN) === true);
assert(Number.isNaN(Number.NaN) === true);
assert(Number.isNaN(0 / 0) === true);
console.log("PASS");
} catch (e) {
console.log("FAIL: " + e.message);
}