object-tostring.js (1578B)
1 function doTest(expected, v) { 2 assertEq(Object.prototype.toString.call(v), expected) 3 } 4 5 function Dummy() {} 6 7 // Basic primitive cases 8 doTest("[object Undefined]", undefined); 9 doTest("[object Null]", null); 10 doTest("[object String]", ""); 11 doTest("[object Number]", 12); 12 doTest("[object Number]", 12.34); 13 doTest("[object Boolean]", true); 14 doTest("[object Symbol]", Symbol()); 15 doTest("[object BigInt]", 1234n); 16 17 // Exotic objects with builtinTag 18 doTest("[object Array]", []); 19 (function() { 20 doTest("[object Arguments]", arguments); 21 })(); 22 doTest("[object Function]", () => {}); 23 doTest("[object Error]", new Error); 24 doTest("[object Date]", new Date); 25 doTest("[object RegExp]", /i/); 26 27 // Exotic objects with @@toStringTag 28 doTest("[object Map]", new Map); 29 doTest("[object Set]", new Set); 30 doTest("[object JSON]", JSON); 31 doTest("[object Math]", Math); 32 33 // Normal object cases 34 doTest("[object Object]", {}); 35 doTest("[object Object]", new Dummy); 36 doTest("[object Foo]", { [Symbol.toStringTag]: "Foo" }); 37 38 // Test the receiver of Symbol.toStringTag 39 let receiver1; 40 let object1 = { 41 __proto__: { 42 get [Symbol.toStringTag]() { 43 receiver1 = this; 44 } 45 } 46 }; 47 doTest("[object Object]", object1); 48 assertEq(receiver1, object1); 49 50 //// BELOW THIS LINE TAMPERS WITH GLOBAL 51 52 // Set a toStringTag on the global String.prototype 53 let receiver2; 54 Object.defineProperty(String.prototype, Symbol.toStringTag, { get: function() { 55 receiver2 = this; 56 return "XString"; 57 }}); 58 doTest("[object XString]", ""); 59 assertEq(Object.getPrototypeOf(receiver2), String.prototype);