成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

ES6

FuisonDesign / 1885人閱讀

摘要:函數(shù)的參數(shù)只是表示對當(dāng)前值的描述,因此相同參數(shù)的函數(shù)的返回值是不相等的。方法返回的是一個數(shù)組成員是當(dāng)前對象中所有用作屬性名的值。

Symbol 概述

ES6引進(jìn)了一種新的原始數(shù)據(jù)類型Symbol表示獨(dú)一無二的值。它是JavaScript語言的第七種類型。
Symbol值是通過Symbol函數(shù)生成。這就是說,對象的屬性名吸納在可以有兩種類型,一種是原來的字符串,另一種就是新增的Symbol類型。凡是屬性名屬于Symbol類型,就都是獨(dú)一無二的,可以保證不會與其他屬性名沖突。

let s = Symbol();
alert(typeof s)  //Symbol

注意:

1.symbol函數(shù)不能使用new命令,否則會報(bào)錯
2.Symnol是一個原始類型的值,不是對象(不能添加屬性)
3.它是一種類似于字符串的數(shù)據(jù)類型

Symbol函數(shù)可以接收一個字符串作為參數(shù),表示對Symbol實(shí)例的描述,主要是為了在控制臺顯示,或者轉(zhuǎn)為字符串時比較容易區(qū)分。
Symbol函數(shù)的參數(shù)只是表示對當(dāng)前Symbol值的描述,因此相同參數(shù)的Symbol函數(shù)的返回值是不相等的。

// 沒有參數(shù)的情況
let s1 = Symbol();
let s2 = Symbol();
s1 === s2 // false

//有參數(shù)的情況
let s1 = Symbol("foo")
let s1 = Symbol("bar")
s1 === s2 // false 
  
//如果參數(shù)是一個對象,就會調(diào)用改對象的toString方法,將其轉(zhuǎn)為字符串,然后才生成一個Symbol值
const obj = {
    toString() {
        return "abc";
    }
};
const sym = Symbol(obj);
sym // Symbol(abc)
作為屬性名的Symbol
let mySymbol = Symbol();

// 第一種寫法
let a = {};
a[mySymbol] = "Hello!";

// 第二種寫法
let a = {
  [mySymbol]: "Hello!"
};

// 第三種寫法
let a = {};
Object.defineProperty(a, mySymbol, { value: "Hello!" });

// 以上寫法都得到同樣結(jié)果
a[mySymbol] // "Hello!"
a.mySymbol  // undefined  //作為對象屬性名時,不能用點(diǎn)運(yùn)算符。

a.mySymbol = "Hello!";
a[mySymbol] // undefined
a["mySymbol"] // "Hello!"
//因?yàn)辄c(diǎn)運(yùn)算符后面是字符串,所以不會讀取mySymbol作為標(biāo)識名所指代的那個值,導(dǎo)致a的屬性名實(shí)際上是一個字符串,而不是一個 Symbol 值。
屬性名的遍歷

Symbol作為屬性名,該屬性不會出現(xiàn)在for...in、for...of也不會被Object.keys()、Object.getOwnPropertyNames()、JSON.stringify()
返回。但是它也不是私有屬性。有一個Object。getOwnPropertySymbols方法,可以獲取指定對象的所有Symbol屬性名。

Object.getOwnPropertySymbol方法返回的是一個數(shù)組,成員是當(dāng)前對象中所有用作屬性名的Symbol值。

const obj = {};

let foo = Symbol("foo");

Object.defineProperty(obj, foo, {
  value: "foobar",
});

for (let i in obj) {
  console.log(i); // 無輸出
}

Object.getOwnPropertyNames(obj)
// []

Object.getOwnPropertySymbols(obj)
// [Symbol(foo)]

另一個新的 API,Reflect.ownKeys方法可以返回所有類型的鍵名,包括常規(guī)鍵名和 Symbol 鍵名。

let obj = {
  [Symbol("my_key")]: 1,
  enum: 2,
  nonEnum: 3
};

Reflect.ownKeys(obj)
//  ["enum", "nonEnum", Symbol(my_key)]

由于以Symbol值作為名稱的屬性,不會被常規(guī)方法遍歷得到。我們可以利用這個特性,為對象定義一些非私有的,但又希望只用于內(nèi)部的方法。

let size = Symbol("size");
class Collection{
    constructor(){
        this[size] = 0;
    }
}
add(item){
    this[this[size]] = item;
    this[size]++;
}
static sizeOf(instance){
    return instance[size];
}

let x = new Collection();
Collection.sizeOf(x); //0

x.add("foo");
Collection.sizeOf(x) // 1

Object.keys(x) // ["0"]
Object.getOwnPropertyNames(x) // ["0"]
Object.getOwnPropertySymbols(x) // [Symbol(size)]
//對象x的size屬性是一個Symbol值,所有Object.key(x)、object.getOwnPropertyName(x)
symbol.for(),symbol.keyFor()

有時,我們希望重新使用同一個Symbol值,symbol.for()方法可以做到這一點(diǎn)。它接受一個字符串作為參數(shù),然后搜索有沒有以該參數(shù)作為名稱的Symbol值。如果有,就返回這個Symbol值,否則就新建并返回一個以該字符串為名稱的Symbol值。

let s1 = Symbol.for("foo");
let s2 = Symbol.for("foo");
s1 === s2  //true   

Symbol.for()與Symbol()這兩種寫法,都會生成新的Symbol,它們的區(qū)別是,前者會被登記在全局環(huán)境中供搜索,后者不會。Symbol.for()不會每次調(diào)用就返回一個新的Symbol類型的值,而是會先檢查給定的key是否已經(jīng)存在,如果不存在才會新建一個值。

Symbol.for("bar") === Symbol.for("bar")
// true

Symbol("bar") === Symbol("bar")
// false

Symbol.keyFor方法返回一個已登記的symbol類型的key

let s1 = Symbol.for("foo");
Symbol.keyFor(s1) //"foo"

let 上 = Symbol("foo");
Symbol.keyFor(s2);  //undefined


文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/103785.html

相關(guān)文章

  • 使用ES6新特性開發(fā)微信小程序

    摘要:使用新特性開發(fā)微信小程序國際化與本地化新特性國際化與本地化新增了很多對于國際化的支持,比如時間格式,貨幣格式,數(shù)字格式等。 ECMAScript 6(簡稱ES6)是JavaScript語言的最新標(biāo)準(zhǔn)。因?yàn)楫?dāng)前版本的ES6是在2015年發(fā)布的,所以又稱ECMAScript 2015。 微信小程序支持絕大部分ES6的新增特性。 使用ES6新特性開發(fā)微信小程序(1) ES6新特性:Cons...

    Backache 評論0 收藏0
  • ES6-前世今生(0)

    摘要:更新了個版本,最新正式版是語言的下一代標(biāo)準(zhǔn),早已在年月正式發(fā)布?;静恢С忠苿佣藶g覽器對的支持情況版起便可以支持的新特性。比較通用的工具方案有,,,等。 1、ECMAScript是什么? 和 JavaScript 有著怎樣的關(guān)系? 1996 年 11 月,Netscape 創(chuàng)造了javascript并將其提交給了標(biāo)準(zhǔn)化組織 ECMA,次年,ECMA 發(fā)布 262 號標(biāo)準(zhǔn)文件(ECMA-...

    LeviDing 評論0 收藏0
  • 給React初學(xué)者的10分鐘ES6教程

    摘要:但是在中,可以通過關(guān)鍵字來實(shí)現(xiàn)類的繼承的使用可以使得繼承意義更加明確并且值得一提的是,如果你使用來定義的組件,那么可以在類的構(gòu)造器里面,用簡單的的聲明方式來替代方法。 原文:The 10 min ES6 course for the beginner React Developer譯者:Jim Xiao 著名的80/20定律可以用來解釋React和ES6的關(guān)系。因?yàn)镋S6增加了超過75...

    Awbeci 評論0 收藏0
  • 10個最佳ES6特性

    摘要:,正式名稱是,但是這個名稱更加簡潔。已經(jīng)不再是最新的標(biāo)準(zhǔn),但是它已經(jīng)廣泛用于編程實(shí)踐中。而制定了模塊功能。自從年雙十一正式上線,累計(jì)處理了億錯誤事件,得到了金山軟件等眾多知名用戶的認(rèn)可。 譯者按: 人生苦短,我用ES6。 原文: Top 10 ES6 Features Every Busy JavaScript Developer Must Know 譯者: Fundebug 為了保...

    codeKK 評論0 收藏0
  • 為什么都說js 里面任何對象最終都繼承了Object對象

    摘要:今天閑來無事,看見幾行小字。又說所有對象,繼承終是。強(qiáng)行押韻一波這首詩的意思就是說的我今天沒有什么事情,然后無意中又在網(wǎng)上看到了任何對象都是從對象繼承而來的這句話。一時興起,便去驗(yàn)證這句話。 今天閑來無事,看見幾行小字。又說所有對象,繼承終是Obj。—— 強(qiáng)行押韻一波 這首詩的意思就是說的我今天沒有什么事情,然后無意中又在網(wǎng)上看到了任何對象都是從Object對象繼承而來的這句話。一時興...

    Gemini 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<