JavaScript 數據類型(二)

Object 類型

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值都是惟一的。一個symbol值能做爲對象屬性的標識符;這是該數據類型僅有的目的。它不支持語法:new Symbol()
圍繞原始數據類型建立一個顯式包裝器對象從 ECMAScript 6 開始再也不被支持。 然而,現有的原始包裝器對象,如 new Boolean、new String以及new Number由於遺留緣由仍可被建立。prototype

建立

Symbol([description])

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([description])

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.prototype.description

獲取Symbol 的描述。ES2019提供的一個實例屬性。對象

const sym = Symbol('foo');

sym.description // "foo"

Symbol.keyFor()

返回一個已登記的 Symbol 類型值的key。ip

Symbol.keyFor(); // TypeError

const sym1 = Symbol('a');
Symbol.keyFor(sym1); // undefined

const sym2 = Symbol.for("b");
Symbol.keyFor(sym2); // "b"

Object.getOwnPropertySymbols()

獲取指定對象的全部 Symbol 屬性名。由於Symbol 做爲屬性名,該屬性不會出如今for...infor...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)]

Reflect.ownKeys()

返回全部類型的鍵名,包括常規鍵名和 Symbol 鍵名。get

const obj = {
  [Symbol('a')]: 1,
  name: 'Ashin',
  age: 3
};

Reflect.ownKeys(obj); // ["name", "age", Symbol(a)]

內置的 Symbol 值

...原型

相關文章
相關標籤/搜索