ES6新特性教程(Symbol)

2021-09-12 09:01:25 字數 2733 閱讀 6937

symbol資料型別: 表示獨一無二的值

七種資料型別:undefined、null、布林值(boolean)、字串(string)、數值(number)、物件(object)、symbol

物件的屬性名現在可以有兩種型別,一種是原來就有的字串,另一種就是新增的 symbol 型別,性名屬於 symbol 型別,就都是獨一無二的,可以保證不會與其他屬性名產生衝突

symbol函式前不能使用new命令,否則會報錯。這是因為生成的 symbol 是乙個原始型別的值,不是物件。也就是說,由於 symbol 值不是物件,所以不能新增屬性。基本上,它是一種類似於字串的資料型別用法:

let s1 = symbol()

傳入乙個可選的字串引數

let s2 = symbol('another symbol')

typeof s1 // 'symbol' 是symbol型別

let s1 = symbol()

let s2 = symbol('another symbol')

let s3 = symbol('another symbol')

s1 === s2 // false

s2 === s3 // false //symbol是唯一的,不相等

1. 使用symbol來作為物件屬性名(key)

const prop_name = symbol()

const prop_age = symbol()

let obj =

obj[prop_age] = 18

obj[prop_name] // '一斤**'

obj[prop_age] // 18

2. 使用symbol來替代常量

const type_audio = symbol()

const type_video = symbol()

const type_image = symbol()

3.使用symbol定義類的私有屬性/方法

在檔案 a.js中

const password = symbol()

class login

checkpassword(pwd)

}export default login

在檔案 b.js 中

import login from './a'

const login = new login('admin', '123456')

login.checkpassword('123456') // true

login.password // oh!no!

login[password] // oh!no!

login["password"] // oh!no!

由於symbol常量password被定義在a.js所在的模組中,外面的模組獲取不到這個symbol,也不可能再建立乙個一模一樣的symbol出來(因為symbol是唯一的),因此這個password的symbol只能被限制在a.js內部使用,所以使用它來定義的類屬性是沒有辦法被模組外訪問到的,達到了乙個私有化的效果。

通常情況下,我們在乙個瀏覽器視窗中(window),使用symbol()函式來定義和symbol例項就足夠了。但是,如果你的應用涉及到多個window(最典型的就是頁面中使用了),並需要這些window中使用的某些symbol是同乙個,那就不能使用symbol()函式了,因為用它在不同window中建立的symbol例項總是唯一的,而我們需要的是在所有這些window環境下保持乙個共享的symbol。這種情況下,我們就需要使用另乙個api來建立或獲取symbol,那就是symbol.for(),它可以註冊或獲取乙個window間全域性的symbol例項。

註冊和獲取全域性symbol

let gs1 = symbol.for('global_symbol_1') //註冊乙個全域性symbol

let gs2 = symbol.for('global_symbol_1') //獲取全域性symbol

gs1 === gs2 // true

let foo = symbol.for( "1111" );

let bar = symbol.for("1111");

console.log( foo === bar ); //輸出: true

//只有通過symbol.for建立的物件,才能用keyfor找到原來的引數;

console.log(symbol.keyfor(foo)) //會輸出:1111

symbol.prototype: symbol有指向的原型

console.log(symbol.prototype); //輸出symbol的原型
symbol.length: symbol的length為1, 也就是說呼叫symbol需要乙個引數, 當然不給引數也沒啥事

symbol.iterator:物件的symbol.iterator屬性, 指向這個物件的預設遍歷器

var myiterable = {};

myiterable[symbol.iterator] = function* () ;

console.log([...myiterable]); // [1, 2, 3]

ES6 新特性之Symbol

symbol let s1 symbol foo let s2 symbol bar s1 symbol foo s2 symbol bar s1.tostring symbol foo s2.tostring symbol bar es6 引入了一種新的原始資料型別symbol,表示獨一無二的值。...

ES6新特性 增加新型別 Symbol

es6新增了一種資料型別 symbol,symbol是用來定義物件的唯一屬性名的不二之選 symbol如何使用呢,symbol不是乙個建構函式哦,如果用new symbol的話,會報錯的 執行下面 var sym1 symbol var sym2 symbol foo var sym3 symbol...

es6新特性 ES6新特性(一)

var 1 var宣告的是函式作用域 區域性 但在if for等定義的變數是全域性的 2 var 具有變數提公升,預解析 3 在同乙個作用域下,var可以宣告多次 4 var 宣告的變數會掛載到window上 let1 let不存在變數提公升,在變數使用之前,必須要先宣告 2 let在同一作用域下,...