You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

170 lines
3.7 KiB

/*===
function
number 0
number NaN [object Number]
number 0 [object Number]
number 1 [object Number]
number 0 [object Number]
number 123 [object Number]
number 0 [object Number]
number 123 [object Number]
number NaN [object Number]
number NaN [object Number]
number NaN [object Number]
number NaN [object Number]
arg valueOf
number 321 [object Number]
===*/
print('function');
function functionTest() {
var t;
function test(x, nargs) {
try {
if (nargs === 0) {
t = Number();
} else {
t = Number(x);
}
print(typeof t, t, Object.prototype.toString.call(t));
} catch (e) {
print(e.name);
}
}
// no arg given should be treated as +0
t = Number(); print(typeof t, t);
// other basic argument types
test(undefined);
test(null);
test(true);
test(false);
test(123);
test('');
test('123');
test(' 123foo');
test('foo');
test([1,2]);
test({ foo: 1, bar: 2 });
// coercion side effect
test({
toString: function() { print('arg toString'); return '123'; },
valueOf: function() { print('arg valueOf'); return '321'; }
});
}
try {
functionTest();
} catch (e) {
print(e);
}
/*===
constructor
object 0 [object Number] true true
object NaN [object Number] true true
object 0 [object Number] true true
object 1 [object Number] true true
object 0 [object Number] true true
object 123 [object Number] true true
object 0 [object Number] true true
object 123 [object Number] true true
object NaN [object Number] true true
object NaN [object Number] true true
object NaN [object Number] true true
object NaN [object Number] true true
arg valueOf
object 321 [object Number] true true
===*/
print('constructor');
function constructorTest() {
var t;
function test(x, nargs) {
try {
if (nargs === 0) {
t = new Number();
} else {
t = new Number(x);
}
print(typeof t, t, Object.prototype.toString.call(t),
Object.getPrototypeOf(t) === Number.prototype,
Object.isExtensible(t));
} catch (e) {
print(e.name);
}
}
// no arg given should be treated as +0
test(undefined, 0);
// other basic argument types
test(undefined);
test(null);
test(true);
test(false);
test(123);
test('');
test('123');
test(' 123foo');
test('foo');
test([1,2]);
test({ foo: 1, bar: 2 });
// coercion side effect
test({
toString: function() { print('arg toString'); return '123'; },
valueOf: function() { print('arg valueOf'); return '321'; }
});
}
try {
constructorTest();
} catch (e) {
print(e);
}
/*===
prototype
undefined
true
true
false
===*/
/* When called as a constructor, a Number instance will always have the
* original Number.prototype regardless of what Number.prototype is now
* set to. E5 Section 15.7.2.1.
*
* However, Number.prototype is not writable or configurable, so this
* behavior doesn't need to be implemented explicitly; just ensure that
* Number.prototype has the right attributes.
*/
print('prototype');
function prototypeTest() {
var orig_prototype = Number.prototype;
var repl_prototype = { "foo": "bar" };
Number.prototype = repl_prototype; /* this write will fail silently */
var num = new Number(123);
print(num.foo);
print(Object.getPrototypeOf(num) === Number.prototype);
print(Object.getPrototypeOf(num) === orig_prototype);
print(Object.getPrototypeOf(num) === repl_prototype);
}
try {
prototypeTest();
} catch (e) {
print(e);
}