JavaScript对象概述
栏目: JavaScript · 发布时间: 5年前
内容简介:一个属性的名称如果不是一个有效的ES6 为什么引入了Symbol?ES5 的对象属性名都是字符串,这容易造成属性名的冲突。比如,你使用了一个他人提供的对象,但又想为这个对象添加新的方法(mixin 模式),新方法的名字就有可能与现有方法产生冲突。如果有一种机制,保证每个属性的名字都是独一无二的就好了,这样就从根本上防止属性名的冲突。这就是 ES6 引入Symbol的原因。
JavaScript JavaScript
一个属性的名称如果不是一个有效的 JavaScript
标识符(例如,一个由空格或连字符,或者以数字开头的属性名),就只能通过方括号标记访问。
2.Symbol
ES6 为什么引入了Symbol?
ES5 的对象属性名都是字符串,这容易造成属性名的冲突。比如,你使用了一个他人提供的对象,但又想为这个对象添加新的方法(mixin 模式),新方法的名字就有可能与现有方法产生冲突。如果有一种机制,保证每个属性的名字都是独一无二的就好了,这样就从根本上防止属性名的冲突。这就是 ES6 引入Symbol的原因。
Symbol 值通过Symbol函数生成。这就是说,对象的属性名现在可以有两种类型,一种是原来就有的字符串,另一种就是新增的 Symbol 类型。凡是属性名属于 Symbol 类型,就都是独一无二的,可以保证不会与其他属性名产生冲突。 --阮一峰
作为属性名,每一个Symbol值都是不相等的。
// 无参数 let a = Symbol(); let b = Symbol(); a === b //false // 有参数 let c = Symbol('foo'); let d = Symbol('foo'); c === c //false 复制代码
注意:
- Symbol 值作为对象属性名时,不能用点运算符。
- 在对象内部,使用Symbol定义属性时,Symbol值必须放在方括号[]内。
3.枚举一个对象的所有属性
-
for...in
循环:该方法依次访问一个对象及其原型链中所有可枚举的属性(不含Symbol
属性)。 -
Object.keys(obj)
:该方法返回一个对象 obj 自身包含(不包括原型中)的所有属性的名称的数组。 -
Object.getOwnPropertyNames(obj)
:该方法返回一个数组,它包含了对象obj
所有拥有的属性(无论是否可枚举)的名称。 -
Object.getOwnPropertySymbols(obj)
:返回一个数组,包含对象自身的所有Symbol
属性的键名。 -
Reflect.ownKeys(obj)
:Reflect.ownKeys
返回一个数组,包含对象自身的所有键名,不管键名是Symbol
或字符串,也不管是否可枚举。
3.创建对象(创建对象一共有七种方式,这里只列举了几种常见的)
- 对象字面量
let person = { name: 'Luna', age: '18', hobby: 'reading', greeting: function() { console.log('hello,I am ' + this.name) } }; 复制代码
-
使用
new
表达式
let person = new Object(); person.name = 'Luna'; person.age = '18'; person.hobby = 'reading'; person.greeting = function () { console.log('hello,I am ' + this.name) } 复制代码
- 使用构造函数:
function Person(name, age, hobby) { this.name = name; this.age = age; this.hobby = hobby; this.greeting = function () { console.log('hello,I am ' + this.name) } } let person = new Person('Luna','18','reading'); 复制代码
- 使用工厂模式
function ceatePerson(name, age, hobby) { let obj = new Object(); obj.name = name; obj.age = age; obj.hobby = hobby; this.greeting = function () { console.log('hello,I am ' + this.name) } return obj; } let person = cratePerson('Luna','18','reading'); 复制代码
- 原型模式
function Person () {} Person.prototype.name = 'Luna'; Person.prototype.age = '18'; Person.prototype.hobby = 'reading'; Person.prototype.greeting = function () { console.log('hello,I am ' + this.name) } let person = new Person() 复制代码
4.对象的方法
- Object.is():ES6 提出“Same-value equality”(同值相等)算法(ES5:JavaScript 缺乏一种运算,在所有环境中,只要两个值是一样的,它们就应该相等。),用Object.is()解决严格相等的问题。
与"==="的区别:
+0 === -0 //true NaN === NaN // false Object.is(+0, -0) // false Object.is(NaN, NaN) // true 复制代码
- Object.assign():通过复制一个或多个对象来创建一个新的对象(属于浅拷贝【Object.assign()浅拷贝在后面章节会进行讲解】)。
const target = { a: 1 }; const source1 = { b: 2 }; const source2 = { c: 3 }; Object.assign(target, source1, source2); 复制代码
- Object.create():使用指定的原型对象和属性创建一个新对象。
const person = { name: 'Luna', age: '18', hobby: 'reading', greeting: function() { console.log('hello,I am ' + this.name) } }; const me = Object.create(person); me.name = 'Bella'; 复制代码
-
Object.defineProperty()/Object.defineProperties():给对象添加一个/多个属性并指定该属性的配置。
-
Object.entries():返回给定对象自身可枚举属性的[key, value]数组。
-
Object.freeze()/Object.isFrozen():冻结对象:其他代码不能删除或更改任何属性/判断对象是否已经冻结。
-
Object.getOwnPropertyDescriptor():返回对象指定的属性配置。
-
Object.getOwnPropertyNames():返回一个数组,它包含了指定对象所有的可枚举或不可枚举的属性名。
-
Object.getOwnPropertySymbols():返回一个数组,它包含了指定对象自身所有的符号属性。
-
Object.getPrototypeOf():返回指定对象的原型对象。
-
Object.isExtensible():判断对象是否可扩展。
-
Object.isSealed()/Object.seal():判断对象是否已经密封。/防止其他代码删除对象的属性。
-
Object.keys():返回一个包含所有给定对象自身可枚举属性名称的数组。
-
Object.preventExtensions():防止对象的任何扩展。
-
Object.setPrototypeOf():设置对象的原型(即内部[Prototype]属性)。
-
Object.values():返回给定对象自身可枚举值的数组
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
浪潮之巅(第三版)(上下册)
吴军 / 人民邮电出版社 / 2016-5 / 99.00元
一个企业的发展与崛起,绝非只是空有领导强人即可达成。任何的决策、同期的商业环境,都在都影响着企业的兴衰。《浪潮之巅》不只是一本历史书,除了讲述科技顶尖企业的发展规律,对于华尔街如何左右科技公司,以及金融风暴对科技产业的冲击,也多有着墨。此外,这本书也着力讲述很多尚在普及 或将要发生的,比如微博和云计算,以及对下一代互联网科技产业浪潮的判断和预测。因为在极度商业化的今天,科技的进步和商机是分不开的。......一起来看看 《浪潮之巅(第三版)(上下册)》 这本书的介绍吧!