ES6-10 super、4種遍歷方式、原型、symbol遍歷

由于現代 JavaScript 引擎優化屬性訪問所帶來的特性的關系,更改對象的 [[Prototype]]即__proto__在各個瀏覽器和 JavaScript 引擎上都是一個很慢的操作。

一 Object原型方法

1 Object.setPrototypeOf(obj, proto)

  • 用該方法而不是直接修改__proto__
  • 返回值是設置好原型的obj,即第一個參數
  • 若第一個參數不是對象,則該操作沒有效果,將第一個參數構造函數的原型作為obj的原型
const n = new Number(1)
console.log(n)
console.log(Object.getPrototypeOf(n))
const obj = Object.setPrototypeOf(1, { a: 100 })
console.log(obj)
console.log(Object.getPrototypeOf(obj)) // 查看原型是否設置上

在這里插入圖片描述

  • 若第一個參數是undefined/null(沒有包裝類),則報錯

2 Object.getPrototypeOf()

  • 當參數是原始值,則返回其包裝類構造函數的原型
    在這里插入圖片描述

3 Object.keys()

  • 返回可枚舉屬性,不含繼承屬性
  • for in可以拿到繼承的屬性

4 Object.values()

  • 返回可枚舉屬性值

5 Object.entries()

const obj = { a: 1 }
Object.defineProperties(obj, {b: {value: 2,enumerable: true},c: {value: 3}
})
const p = { d: 4 }
Object.setPrototypeOf(obj, p)
console.log(obj)
console.log('keys', Object.keys(obj))
console.log('values', Object.values(obj))
console.log('entries', Object.entries(obj))

在這里插入圖片描述
在這里插入圖片描述

super

  • 指向對象的原型對象
  • 使用限制:必須是對象的方法,且是簡寫時才能訪問到super
let proto = {y: 20,z: 40
}
let obj = {x: 10,foo() {console.log(super.y)}
}
Object.setPrototypeOf(obj, proto)
obj.foo() // 20

Symbol

  • 解決對象屬性重名的問題
  • 是原始值類型
  • Symbol是構造函數,new會報錯
  • 生成獨一無二的值
  • typeof返回symbol
  • 掛不上屬性
    在這里插入圖片描述

包裝類是這么掛屬性么

let s1 = Symbol()
s1.a = 1;
console.log(s1.a) // undefined
console.log(Symbol()) // Symbol()
console.log(Symbol(undefined)) // Symbol()
console.log(Symbol(null)) // Symbol(null)
console.log(Symbol(1)) // Symbol(1)
console.log(Symbol(true)) // Symbol(true)
console.log(Symbol('1')) // Symbol(1)
console.log(Symbol({})) // Symbol([object Object])
console.log(Symbol(function () { })) // Symbol(function(){})
console.log(Symbol([])) // Symbol()
console.log(Symbol([1, 2, 3])) // Symbol(1,2,3)
console.log(String(Symbol('字符串'))) // Symbol(字符串)
console.log(Boolean(Symbol(1))) // true
console.log(Boolean(Symbol(null))) // true 注意為false的就6種
const s1 = Symbol()
console.log(Object.getPrototypeOf(s1)) // Symbol.prototype
// Cannot convert a Symbol value to a number
console.log(Number(Symbol(1))) // 報錯
console.log(Symbol() + 1) // 報錯

在這里插入圖片描述

很明顯,生成Symbol時,在括號內使用了對應變量的toString方法,數組、對象、方法的返回值各不相同

  • Symbol有自己的toString方法
  • 顯式轉換只有Number不能轉,Boolean、String可以
  • 隱式轉換僅限Boolean

Symbol作為對象屬性

  • obj[s1] = xx
  • const obj = { [s1]: xxx }
  • Object.defineProperty(obj, s1, { value: xxx })

Symbol方法

  • Symbol.for(‘foo’)獲取到同樣的Symbol值
  • 傳相同的key
  • Symbol.keyFor(s1)獲取到用Symbol.for指定的key值
const s1 = Symbol.for('foo')
const s2 = Symbol.for('foo')
console.log(s1 === s2) // true 
console.log(Symbol.keyFor(s1)) // foo
const s22 = Symbol()
const s3 = Symbol(null)
const s4 = Symbol(1)
console.log(Symbol.keyFor(s22)) // undefined 他們都沒有用Symbol.for指定key
console.log(Symbol.keyFor(s3)) // undefined
console.log(Symbol.keyFor(s4)) // undefined

Symbol屬性遍歷

  • for in不能遍歷到Symbol類型的屬性
  • for of不能遍歷到Symbol類型的屬性
  • 特有的api Object.getOwnPropertySymbols(obj)僅遍歷obj的Symbol類型的屬性

for…in語句以任意順序遍歷一個對象的除Symbol以外的可枚舉屬性(包括繼承)。
Object.keys() 方法會返回一個由一個給定對象的自身可枚舉屬性組成的數組,數組中屬性名的排列順序和正常循環遍歷該對象時返回的順序一致 。
在給定對象自身上找到的所有 Symbol 屬性的數組。(和枚舉無關)

const obj = { c: 1, d: 2 }
let a = Symbol('a')
let b = Symbol('b')
let _a = Symbol('_a')
let _b = Symbol('_b')
obj[a] = 'hello'
obj[b] = 'world'
Object.defineProperties(obj, {e: {value: 5,enumerable: true,},f: {value: 6,enumerable: false,},[_a]: {value: -1,enumerable: true,},[_b]: {value: -2,enumerable: false,},
})
let h = Symbol('h')
let i = Symbol('i')
let j = Symbol('j')const obj1 = {g: 7,[h]: 8
}
Object.defineProperties(obj1, {[i]: {value: 9,enumerable: true,},[j]: {value: 10,},k: {value: 11}
})
Object.setPrototypeOf(obj, obj1)
console.log(obj)
for (let i in obj) {console.log(i) //  c d e  g 
}
console.log(Object.keys(obj)) // ["c", "d", "e"]
console.log(Object.getOwnPropertySymbols(obj)) 
// [Symbol(a), Symbol(b), Symbol(_a), Symbol(_b)]
console.log(Object.assign(obj)) // 只拷貝自身的可枚舉屬

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/251014.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/251014.shtml
英文地址,請注明出處:http://en.pswp.cn/news/251014.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

IntelliJ IDEA使用

1:下載 ideaIU-2017.2.exe,JetbrainsCrack-2.6.2.jar(補丁) 2:安裝ideaIU-2017.2.exe,將補丁放在D:\java\intellij\IntelliJ IDEA 2017.2\bin 目錄下 3:在安裝的idea下面的bin目錄下面有2個文件 : 一個是id…

js中如何刪除json對象的某一個選項

我有一個這樣一個對象,getData, 但是我不想要每一項的id,那怎么去刪除呢(使用delete)? getData.map((item) >{delete item["id"];});console.log(getData);轉載于:https://www.cnblogs.com/mmykdbc/p/8386407.html

ES6-11 Symbol、iterator、forOf、typeArray

…剩余運算符 const obj1 {a: 1,b: 2 } const obj2 {a: 100,b: 2,c: 300 } const obj {...obj1,...obj2 } console.log(obj) // 和Object.assign(obj, obj1, obj2)結果相同[Symbol.hasInstance] Symbol構造函數上的屬性,默認調用了方法 iterator迭代器 對數…

node --- 游走在客戶端和服務器間的http

本篇文章,講述了一個很簡單的上傳圖片(/start)到本地服務器,然后路由跳轉到/upload. 寫這個程序的目的是為了幫助理解HTTP的一些基本概念及node對于http api的實現以及程序的設計模式. IP: 計算機之間的通信 TCP: 應用程序之間的通信 HTTP: 基于TCP實現的應用層協議,設計之初是…

BigDecimal踩過的大坑

通常Java中涉及金錢相關的計算為了保持精度,會采用BigDecimal來實現,但是BigDecimal中創建BigDecimal類對象的時候,如果使用直接new的話,必須是String類型的參數,否則會導致創建出來的對象不是你想要的,比如…

redis配置環境變量

直接上圖不解釋 redis安裝路徑,我的電腦右擊屬性 窗口R鍵,輸入cmd回車,輸入redis-server.exe 回車 再開一個命令窗口,窗口R鍵,輸入cmd回車,輸入 redis-cli.exe -h 127.0.0.1 -p 6379 回車 轉載于:https:/…

對轉義字符的思考

ASCII碼 計算機存儲文字時用的是二進制,ASCII碼就是一張對照表,什么字符對應什么碼,將二進制碼存儲下來0-127位表示基礎的ASCII碼0-31,和127表示非打印控制字符(如換行、回車、響鈴、文頭、文尾)32-126表示…

進程總結

進程總結 進程: 正在進行的一個過程或者說一個任務 進程是計算機中資源分配的最小單位 多進程之間的數據是隔離的 多進程是用來解決高計算型的程序用的 啟動進程的開銷比較大,其開啟數量和cpu的個數相關,正常在cpu的個數1-2倍之間 進程越多&a…

debian如何安裝Let's Encrypt

如果python默認版本不是2,刪除 /usr/bin/python 添加軟引用 in -s /usr/bin/python2 /usr/bin/python 第一步,卸載virtualenv apt-get purge python-virtualenv python3-virtualenv virtualenv 如果pip沒有就安裝pip apt-get install python-pip pip …

算法 --- 判斷某個值是否在二叉搜索樹中

function funA(root, k) {if(root null) {return false} else {if(k root.val) {return true } else {if( k < root.val) {return funA(root.left, k)} else {return funA(root.right, k)}}} }

ES6-12 array/數值拓展、ArrayOf、ArrayFrom

要使用…須有迭代器接口 數組方法 構造器上的方法 Array.of()聲明數組 替代new Array()的方式聲明數組new Array()不傳參數返回空數組&#xff0c;只傳1個參數時&#xff0c;代表數組長度&#xff0c;內容用empty填充&#xff0c;傳多個參數&#xff0c;則代表數組內容&…

React01

目錄 React-day01 入門知識React介紹官網React開發環境初始化 SPA腳手架初始化項目&#xff08;方便&#xff0c;穩定&#xff09;*通過webpack進行初始化配置鏡像地址開發工具配置元素渲染組件及組件狀態函數定義組件(無狀態)類定義組件(有狀態)*組合組件Props屬性*State狀態*…

算法 --- 反轉數組

幾個注意點: 1.輸出的時候,也要做數字超出處理 2.js中可以使用 str -0 將字符串類型轉換成數字類型 ( 注意不是 0) 3.可以使用 num ‘’ 將數字類型轉換成字符串類型 4.使用str.split(’’) 可以將字符串轉換成數組 5.使用arr.join(’’) 可以將數組轉換成字符串 6.JS中2的31次…

ES6-13 正則方法、修飾符yus、UTF_16編碼方式

修飾符 m multiLine 對于str中含\n的情況g globali ignoreCase 元字符 反斜杠加轉義 元字符含義簡寫\w匹配字母、數字、下劃線。等價于’[A-Za-z0-9_]’。word\W匹配非字母、數字、下劃線。等價于 ‘[^A-Za-z0-9_]’。\s匹配任何空白字符&#xff0c;包括空格、制表符、換頁…

svn文件大小類型限制,提交必須加多少字的說明

#!/bin/shREPOS"$1" TXN"$2" #此處更改大小限制&#xff0c;這里是5M MAX_SIZE5242880 #此處增加限制文件后綴名 FILTER\.(zip|rar|o|obj|tar|gz)$SVNLOOK/usr/bin/svnlookLOGMSG$SVNLOOK log -t "$TXN" "$REPOS" | wc -cif [ "$…

cmd窗口快速定位到具體文件夾方法

在用Python進行機器實戰時&#xff0c;打開cmd窗口后&#xff0c;總是到定位到kNN.py所在文件夾才能Python&#xff08;否則import kNN失敗&#xff09;&#xff0c;每次都要輸入地址非常麻煩 這里介紹一個cmd窗口快速定位到具體文件夾方法&#xff1a; 按住Shift鍵右擊鼠標打開…

算法 --- 羅馬數字轉整數

解體思路: 1.寫一個對象trans用于保存羅馬和數字之間的映射關系 2.重點在于當數值小的出現在數值大的左邊時,會減去該數,出現在右邊時會加上該數,因此需要與后面的進行比較 3.在得到s時,首先給它轉換成字符串,并在末位加一個0 /*** param {string} s* return {number}*/ var r…

正則 - 阮一峰

學習地址 一 正則實例方法 1. test 正則實例.test返回布爾值 var r /x/g; var s _x_x;r.lastIndex // 0 r.test(s) // truer.lastIndex // 2 r.test(s) // truer.lastIndex // 4 r.test(s) // false死循環&#xff0c;因為while循環的每次匹配條件都是一個新的正則表達式…

LintCode 6.合并排序數組 ||

import org.junit.Test;import java.util.Arrays;public class MergeSort {/*** param A: sorted integer array A* param B: sorted integer array B* return: A new sorted integer array* <p>* 合并排序數組 II* 合并兩個排序的整數數組A和B變成一個新的數組。* <p…

算法 --- 有效的括號

解題思路: 1.對括號分別賦值(左括號大于0,右括號小于0),方便后期比較 2.使用棧,對于大于0的字符串入棧,對于小于0的字符串,檢查棧中是否有元素,若沒有返回false,否則拿出棧頂的一個元素,和現在的元素進行比較 /** * param {string} s * return {boolean} */ var isValid func…