ECMAScript中的對象就是一組數據和功能的集合。函數
const o = new Object(); const o = new Object; // 有效,但不推薦省略圓括號 const o = {};
constructor
: 構造函數。hasOwnProperty(propertyName)
: 檢查 propertyName
(傳入的屬性)在當前對象實例中(不是實例原型中)是否存在。isPrototypeOf(object)
: 用於檢查傳入的對象是不是當前對象的原型。propertyIsEnumerable(propertyName)
: 檢查 propertyName
(傳入的屬性)是否可以使用 for-in
語句枚舉。toLocaleString()
: 返回對象的字符串表示,該字符串與執行環境的地區對應。toString()
: 返回對象的字符串表示。valueOf()
: 返回對象的字符串、數值或布爾值表示。一般與toString()
返回值相同。 const o = new Object(); console.log(o.toLocaleString()); // "[object Object]" console.log(o.toString()); // "[object Object]" console.log(o.valueOf()); // "{}"
表示獨一無二的值。是一種基本數據類型。每一個從Symbol()
返回的symbol
值都是惟一的。一個symbol
值能做爲對象屬性的標識符;這是該數據類型僅有的目的。它不支持語法:new Symbol()
。
圍繞原始數據類型建立一個顯式包裝器對象從 ECMAScript 6 開始再也不被支持。 然而,現有的原始包裝器對象,如 new Boolean、new String以及new Number由於遺留緣由仍可被建立。prototype
description: 可選的字符串。symbol的描述,可用於調試(控制檯顯示、轉爲字符串等)但不能訪問symbol自己。
若是 Symbol 的參數是一個對象,就會調用該對象的toString方法,將其轉爲字符串,而後才生成一個 Symbol 值。調試
var sym1 = Symbol(); var sym2 = Symbol('foo'); var sym3 = Symbol('foo'); typeof sym1 // "symbol" sym1 // Symbol() sym2 // Symbol('foo') sym3 // Symbol('foo') sym1.toString() // "Symbol()" sym2.toString() // "Symbol(foo)" sym3.toString() // "Symbol(foo)" sym2 === sym3 // false var sym = new Symbol(); // TypeError // 建立一個Symbol包裝器對象 var sym = Symbol("foo"); typeof sym; // "symbol" var symObj = Object(sym); typeof symObj; // "object" // 運算 `your symbol is ${sym}` // TypeError: can't convert symbol to string Boolean(sym) // true Number(sym) // TypeError
Symbol.for()與Symbol()這兩種寫法,都會生成新的 Symbol。它們的區別是,前者會被登記在全局環境中供搜索,後者不會。Symbol.for()不會每次調用就返回一個新的 Symbol 類型的值,而是會先檢查給定的key是否已經存在,若是不存在纔會新建一個值。code
Symbol.for("bar") === Symbol.for("bar"); // true Symbol.for() === Symbol.for(); // true Symbol("bar") === Symbol("bar"); // false
獲取Symbol 的描述。ES2019提供的一個實例屬性。對象
const sym = Symbol('foo'); sym.description // "foo"
返回一個已登記的 Symbol 類型值的key。ip
Symbol.keyFor(); // TypeError const sym1 = Symbol('a'); Symbol.keyFor(sym1); // undefined const sym2 = Symbol.for("b"); Symbol.keyFor(sym2); // "b"
獲取指定對象的全部 Symbol 屬性名。由於Symbol 做爲屬性名,該屬性不會出如今for...in
、for...of
循環中,也不會被Object.keys()
、Object.getOwnPropertyNames()
、JSON.stringify()
返回。字符串
const obj = {}; let a = Symbol('a'); let b = Symbol('b'); obj[a] = 'Hello'; obj[b] = 'World'; for (let i in obj) { console.log(i); // 無輸出 } Object.getOwnPropertyNames(obj); // [] Object.getOwnPropertySymbols(obj); // [Symbol(a), Symbol(b)]
返回全部類型的鍵名,包括常規鍵名和 Symbol 鍵名。get
const obj = { [Symbol('a')]: 1, name: 'Ashin', age: 3 }; Reflect.ownKeys(obj); // ["name", "age", Symbol(a)]
...原型