国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

深入理解ES6之《Symbol》

Tangpj / 3352人閱讀

摘要:創建及辨別方法是原始值,因此調用會導致程序拋出錯誤使用來辨別其類型可用于計算對象字面量屬性名如果想創建一個共享的,可使用方法方法在全局注冊表中檢索與有關的鍵全局注冊表是一個類似全局作用域的共享環境,也就是說你不能假設目前環境中存在哪些鍵與類

創建Symbol及辨別方法

Symbol是原始值,因此調用new Symbol會導致程序拋出錯誤

let firstName = Symbol()
let person = {}
person[firstName] = "angela"
console.log(person[firstName])

使用typeof來辨別其類型

let symbol=Symbol("this is test description")
console.log(typeof symbol)//symbol

Symbol可用于計算對象字面量屬性名、Object.defineProperty、Object.defineProperties

如果想創建一個共享的Symbol,可使用Symbol.for方法

let uid = Symbol.for("uid")
let object = {
  [uid]: "12345"
}
console.log(object[uid])//12345
console.log(uid)//Symbol(uid)
let uid2 = Symbol.for("uid")
console.log(uid === uid2)//true
console.log(object[uid2])//12345
console.log(uid2)//Symbol(uid)

Symbol.keyFor方法在Symbol全局注冊表中檢索與Symbol有關的鍵

let uid = Symbol.for("uid")
console.log(Symbol.keyFor(uid))//uid
let uid2 = Symbol.for("uid")
console.log(Symbol.keyFor(uid2))//uid
let uid3=Symbol("uid")
console.log(Symbol.keyFor(uid3))//undefined

Symbol全局注冊表是一個類似全局作用域的共享環境,也就是說你不能假設目前環境中存在哪些鍵

Symbol與類型強制轉換

不能將Symbol強制轉換成數字類型,Symbol也不可以被轉換成字符串

let uid = Symbol.for("uid")
let desc = uid + ""http://報錯 Uncaught TypeError: Cannot convert a Symbol value to a string
let uid = Symbol.for("uid")
let desc = uid / 1//報錯  Uncaught TypeError: Cannot convert a Symbol value to a number

但是卻可以像下面這樣使用

let uid = Symbol.for("uid")
let desc = String(uid)
console.log(desc)//Symbol(uid)
Symbol屬性檢索

Object.getOwnPropertySymbols

let uid = Symbol.for("uid")
let object = {
  [uid]: "12345"
}
let symbols=Object.getOwnPropertySymbols(object)
Symbol.hasInstance

Symbol.hasInstance只接受一個參數,即要檢查的值
每個函數都有Symbol.hasInstance方法,用于確定對象是否為函數實例,該方法在Function.prototype中定義,該方法被定義不為可寫、不可配置、不可枚舉

let obj = []
//obj instanceof Array //下面一句代碼與此句功能等價
Array[Symbol.hasInstance](obj)//true 

我們可以通過Object.defineProperty方法改寫一個不可寫屬性
所以其實可以重寫所有內建函數(如Date和Error)默認的Symbol.hasInstance屬性

function SpecialNumber() { }
Object.defineProperty(SpecialNumber, Symbol.hasInstance, {
  value: function (v) {
    return (v instanceof Number) && (v >= 1 && v <= 100)
  }
})
var two = new Number(2),
  zero = new Number(0);
console.log(two instanceof SpecialNumber)//true
console.log(zero instanceof SpecialNumber)//false
Symbol.isConcatSpreadable

Symbol.isConcatSpreadable屬性值為true表明屬性值應當作為獨立元素添加到數組中

let c1 = ["red", "green"],
  c2 = c1.concat(["blue", "black"], "yellow")
console.log(c2)//["red", "green", "blue", "black", "yellow"]

為什么上面一段代碼結果是["red", "green", "blue", "black", "yellow"]而不是["red", "green", ["blue", "black"], "yellow"]?

如果把上面的代碼稍微改一下,結果就完全不一樣了

let collection = {
  0: "hello",
  1: "world",
  2: "demo",
  3: "test",
  [Symbol.isConcatSpreadable]: true,
  length: 4
}
let msg = ["Hi"].concat(collection)
console.log(msg)//["Hi", "hello", "world", "demo", "test"]
Symbol.match,Symbol.replace,Symbol.search,Symbol.split
let hasLenOf10 = {
  [Symbol.match](v) {
    return v.length === 10 ? [v.substring(0, 10)] : null
  },
  [Symbol.replace](v, replacement) {
    return v.length === 10 ? replacement + v.substring(10) : v;
  },
  [Symbol.search](v) {
    return v.length === 10 ? 0 : -1
  },
  [Symbol.split](v) {
    return v.length === 10 ? ["", ""] : [v]
  }
}
let msg1 = "Hello world",
  msg2 = "Hello John";
console.log(msg1.match(hasLenOf10))//null
console.log(msg2.match(hasLenOf10))//[Hello John]
console.log(msg1.replace(hasLenOf10))//Hello world
console.log(msg2.replace(hasLenOf10))//undefined
console.log(msg1.search(hasLenOf10))//-1
console.log(msg2.search(hasLenOf10))//0
console.log(msg1.split(hasLenOf10))//["Hello world"]
console.log(msg2.split(hasLenOf10))//["",""]
Symbol.toPrimitive

在執行特定操作時,經常會嘗試將對象轉換到相應的原始值
Symbol.toPrimitive被定義在每一個標準類型的原型上,并且規定了當對象被轉換為原始值時應該執行的操作
每當執行類型轉換總會調用Symbol.toPrimitive方法并傳入一個值作為參數,這個值在規范中被稱作類型提示hint,類型提示參數只有三種選擇number、string、default

function Temperature(degree) {
  this.degree = degree
}
Temperature.prototype[Symbol.toPrimitive] = function (hint) {
  switch (hint) {
    case "string":
      return this.degree + "u00b0";
    case "number":
      return this.degree;
    case "default":
      return this.degree + " degrees"
  }
}
var freezing = new Temperature(32)
console.log(freezing + "!")//32 degrees!
console.log(freezing / 2)//16
console.log(String(freezing))//32°
Symbol.toStringTag

以前判斷一個對象的類型一般都是這樣

function isArray(value) {
  return Object.prototype.toString.call(value) === "[object Array]"
}

ES6中我們可以自定義對象字符串標簽

function Person(name) {
  this.name = name
}
Person.prototype[Symbol.toStringTag] = "Person"
Person.prototype.toString = function () {
  return this.name
}
var me = new Person("angela")
console.log(me.toString())//angela
console.log(Object.prototype.toString.call(me))//[object Person]

如果我們不重寫toString方法,則me.toString返回的值就是[object Person]
我們可以給Person.prototype[Symbol.toStringTag]賦任意值,當然也可以修改原生對象的字符串標簽

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/87378.html

相關文章

  • 深入理解ES6Symbol

    摘要:創建及辨別方法是原始值,因此調用會導致程序拋出錯誤使用來辨別其類型可用于計算對象字面量屬性名如果想創建一個共享的,可使用方法方法在全局注冊表中檢索與有關的鍵全局注冊表是一個類似全局作用域的共享環境,也就是說你不能假設目前環境中存在哪些鍵與類 創建Symbol及辨別方法 Symbol是原始值,因此調用new Symbol會導致程序拋出錯誤 let firstName = Symbol()...

    xavier 評論0 收藏0
  • 深入理解ES6《迭代器與生成器》

    摘要:什么是迭代器中創建迭代器如下所示什么是生成器生成器是一種返回迭代器的函數每當招待完一條語句后函數就會自動停止執行關鍵字可返回任何值或表達式關鍵字只可在生成器內部使用,在其它地方使用會導致程序拋出語法錯誤所以下面例子是有錯誤的可迭代對象具有屬 什么是迭代器 ES5中創建迭代器如下所示: function createIterator(items) { var i = 0 retu...

    王軍 評論0 收藏0
  • 深入理解ES6《迭代器與生成器》

    摘要:什么是迭代器中創建迭代器如下所示什么是生成器生成器是一種返回迭代器的函數每當招待完一條語句后函數就會自動停止執行關鍵字可返回任何值或表達式關鍵字只可在生成器內部使用,在其它地方使用會導致程序拋出語法錯誤所以下面例子是有錯誤的可迭代對象具有屬 什么是迭代器 ES5中創建迭代器如下所示: function createIterator(items) { var i = 0 retu...

    myshell 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<