ES6 Symbol及对象遍历方法for in,Object,keys,JSON.stringify,getOwnPropertyNames,Reflect.ownKeys
来源:互联网 发布:外汇高盛软件 编辑:程序博客网 时间:2024/05/20 07:49
Symbol是原始类型,不能用new 创建
var s1 = Symbol('a');typeof s1;//symbol
Symbol参数可接受字符串
表示对Symbol实例的描述,主要是为了显示时容易区分,即是接受的字符串相等,返回值也不相等。
var s1 = Symbol('a');//Symbol(a) var s2 = Symbol('b');//Symbol(b) s1 === s2;//false var s3 = Symbol('a');//Symbol(a) s1 === s3;//false
Symbol不可强制转换为string,必须显示转换
''+s1;//VM4356:1 Uncaught TypeError: Cannot convert a Symbol value to a string at <anonymous>:1:3s1.toString();//"Symbol(a)"String(s1);//"Symbol(a)"
不能用.
为对象添加属性
因为.
后面必须是字符串,而Symbol不是string类型的,其typeof 返回symbol
var o = {a:1} var s1 = Symbol('a'); o[s1] = 2;
Symbol参数为对象时调用对象的toString返回值为Symbol的参数
var obj = { toString() { return 'abc'; }};var sym = Symbol(obj);//Symbol(abc)
- 若对象的toString方法返回原始值直接使用
- 若对象的toString方法返回对象,则检查是否有valueOf,返回valueOf的返回值
- 若toString和valueOf都返回对象,则报错,
- 若同时存在toString和valueOf,且都返回原始值则使用toString优先。
var obj = { toString() { return {}; }};var sym = Symbol(obj);Uncaught TypeError: Cannot convert object to primitive value at Symbol
遍历
Symbol定义的属性不会出现在下面循环中:
- for in:可获取原型属性,不可获取不可枚举属性
- for of:不可遍历对象,可遍历数组
- Object.keys:原型属性和不可枚举属性都不能获取
- Object.getOwnPropertyByNames:不可获取原型属性,可获取不可枚举属性
- JSON.stringify:原型属性和不可枚举属性都不能获取
- Reflect.ownKeys:可获取不可枚举和Symbol,不可获取原型
总结:
获取原型上属性的有:for in;
获取不可枚举属性的有:getOwnPropertyNames,Reflect.ownKeys
可获取Symbol属性的有:getOwnpropertySymbols,Reflect.ownKeys
可用下面的方法取到所有symbol类型的属性,返回Array类型的Symbol属性集合
Object.getOwnPropertySymbols(obj)
或者用下面的方法取到对象上的所有属性:
var p = {w:2};var obj = Object.create(p);obj.a = 1;Object.defineProperty(obj,"b",{ value:123})var a = Symbol('a');var b = Symbol('b');obj[a] = 'Hello';obj[b] = 'World';Reflect.ownKeys(obj);// [Symbol(a), Symbol(b)]
可见,Reflect.ownKeys可以取到隐式属性,但不能取到继承属性。
Symbol.for
Symbol.for接收字符串为其值,然后搜索有没有以该参数为名称的Symbol值,有的话直接返回,没有的话以该参数创建Symbol,相当于登记了一个全局Symbol,可在不同iframe或者service worker中取到。
var s1 = Symbol.for('s');var s2 = Symbol.for('s');s1 === s2;//true
Symbol.keyFor
Symbol.KeyFor返回已经登记的Symbol类型的值。
Symbol.keyFor(s1);//s
阅读全文
0 0
- ES6 Symbol及对象遍历方法for in,Object,keys,JSON.stringify,getOwnPropertyNames,Reflect.ownKeys
- Javascript研究: 遍历对象的方式Object.getOwnPropertyNames vs Object.keys vs for ...in
- (for..in)、Object.keys()和Object.getOwnPropertyNames(),for...of
- 属性遍历:in操作符/Object.keys()/ Object.getOwnPropertyNames()
- for in 、Object.keys()以及Object.getOwnPropertyNames的区别
- Difference between Object.keys() and Object.getOwnPropertyNames()
- ES6--Set、Map、Symbol、Proxy及Reflect
- 遍历json对象 for in
- JavaScript对象扩展(Object.is(), assign(), 对象遍历keys, es6原型介绍)
- ES6-对象的扩展-Object.keys(),Object.values(),Object.entries()
- 详解forin,Object.keys和Object.getOwnPropertyNames的区别
- hasOwnProperty,Object.keys(),propertyIsEnumerable,for-in(loop)
- Object.keys()运用及数组遍历
- es6 javascript的Reflect 对象的方法
- Object.getOwnPropertyNames()
- for in 遍历json
- JSON.stringify(Object)
- javascript中的Object.defineProperty()与getOwnPropertyNames ()方法
- Bootstrap插件(一)——模态框(modal.js)
- Java NIO的特点
- Windows IO模型-WSAAsynSelect模型(异步阻塞模型)
- 面向对象六大原则之单一职责原则
- 目前看到的最棒的HashMap源码分析(基于java 8)--Java 8系列之重新认识HashMap
- ES6 Symbol及对象遍历方法for in,Object,keys,JSON.stringify,getOwnPropertyNames,Reflect.ownKeys
- 关于java中的double check lock
- 零基础简单爬虫制作(以wjyt-china企业黄页爬虫为例)(上)
- HTML基础01
- 通过modbus协议实现arduino与电能表串口通信
- 从头开始学算法:考研机试题练习(C/C++)–STL使用
- JavaSe——8、Set、List和Queue
- BZOJ2719
- [自制操作系统] JOS文件系统详解&支持工作路径&MSH