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.mzph.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…