Bug 749818: add Number.isNaN, r=jwalden

--HG--
extra : rebase_source : f3faa700eb75c6106b0ebb421d53080e293b714a
This commit is contained in:
Benjamin Peterson 2012-06-02 20:16:24 +02:00
Родитель 6d98894d86
Коммит e2c95974dc
2 изменённых файлов: 39 добавлений и 0 удалений

Просмотреть файл

@ -0,0 +1,15 @@
assertEq(Number.isNaN(NaN), true);
assertEq(Number.isNaN(0/0), true);
assertEq(Number.isNaN(Number("NaN")), true);
assertEq(Number.isNaN(4), false);
assertEq(Number.isNaN(4.5), false);
assertEq(Number.isNaN("hi"), false);
assertEq(Number.isNaN("1.3"), false);
assertEq(Number.isNaN("51"), false);
assertEq(Number.isNaN(0), false);
assertEq(Number.isNaN(-0), false);
assertEq(Number.isNaN({valueOf: function () { return 3; }}), false);
assertEq(Number.isNaN({valueOf: function () { return 0/0; }}), false);
assertEq(Number.isNaN({ valueOf: function() { throw 17; } }), false);
assertEq(Number.isNaN({ toString: function() { throw 17; } }), false);
assertEq(Number.isNaN({ valueOf: function() { throw 17; }, toString: function() { throw 42; } }), false);

Просмотреть файл

@ -836,6 +836,27 @@ static JSFunctionSpec number_methods[] = {
JS_FS_END
};
// ES6 draft ES6 15.7.3.10
static JSBool
Number_isNaN(JSContext *cx, unsigned argc, Value *vp)
{
CallArgs args = CallArgsFromVp(argc, vp);
if (args.length() < 1 || !args[0].isDouble()) {
args.rval().setBoolean(false);
return true;
}
args.rval().setBoolean(MOZ_DOUBLE_IS_NaN(args[0].toDouble()));
return true;
}
static JSFunctionSpec number_static_methods[] = {
JS_FN("isNaN", Number_isNaN, 1, 0),
JS_FS_END
};
/* NB: Keep this in synch with number_constants[]. */
enum nc_slot {
NC_NaN,
@ -998,6 +1019,9 @@ js_InitNumberClass(JSContext *cx, JSObject *obj)
if (!JS_DefineConstDoubles(cx, ctor, number_constants))
return NULL;
if (!DefinePropertiesAndBrand(cx, ctor, NULL, number_static_methods))
return NULL;
if (!DefinePropertiesAndBrand(cx, numberProto, NULL, number_methods))
return NULL;