一、对象的定义形式
01.字面量
var myObj = {} myObj.age = 30
02.new Object
var myObj = new Object()myObj.age = 30
二、对象属性的访问
0
1点操作符
下面使用了点操作符访问属性age
var myObj = { age: 20}console.log(myObj.age) // 20
02
[]操作符
下面使用了[]操作符访问属性age
var myObj = { age: 20 }console.log(myObj['age']) // 20
注:属性名都是字符串,即使在定义的时候没有声明,对象也会把他们转换为字符串形式
三、点和[]操作符的区别
01满足标识符的属性名
当属性名满足标识符的命名规范时,点操作符和[]操作符都可以使用,
当出现特殊命名时,如下:属性名是myAge%,只能使用[]操作符
<script> var myObj = { age: 20, 'myAge%': 30 } console.log(myObj['myAge%']) // 30script>
注:JavaScript的标识符只能包含字母或数字或下划线(“_”)或美元符号(“$”),且不能以数字开头
0
2计算属性名
[]内部可以使用表达式。
<script> var int = 'hello' var myObj = { [int + 'word']: 20 } console.log(myObj['helloword']) // 20script>
四、对象的引用
如下:变量myObj2和myObj都指向同一个对象{},
当给myObj设置age属性为18时,myObj2 也能访问到18,
因为这两个对象指向同一个内存地址,修改其中一个变量,另一个变量也会受到影响
<script> var myObj = {}; var myObj2 = myObj myObj.age = 18 console.log(myObj2.age) // 18 myObj2.name = 'zhangsan' console.log(myObj.name) // zhangsanscript>
当某个对象不再引用其中一个变量,不会影响另一个对象的值
myObj2 = {}console.log(myObj.age) // 18console.log(myObj2.age) // undefined
五、对象属性的查看
in运算符可以检查对象是否具有某个属性,存在返回true,否则返回false
如下:a是myObj的属性,返回true
var myObj = { a: 20}a in myObj // true
六、对象的属性描述符
使用defineProperty(..)可以给对象添加一些属性并显式指定某些特性
01
Writable
writable 默认值false, 表示不允许修改这个属性值
如下:当给myObj重新设置age为33时,只有writable 为true时,才能打印出33
<script> var myObj = {} Object.defineProperty(myObj, 'age', { value: '30', writable: true }); myObj.age = 33 console.log(myObj.age); // 33script> <script> var myObj = {} Object.defineProperty(myObj, 'age', { value: '30', writable: false }); myObj.age = 33 console.log(myObj.age); // 30script>
02Configurable
configurable 默认值false,表示不允许删除这个属性
如下:当configurable 为true时,myObj.age为undefined
<script> var myObj = {} Object.defineProperty(myObj, 'age', { value: '30', configurable: true }); delete myObj.age console.log(myObj.age); // undefinedscript>
<script> var myObj = {} Object.defineProperty(myObj, 'age', { value: '30', configurable: false }); delete myObj.age console.log(myObj.age); // 30script>
0
3enumerable
任何enumerable 默认值false, 表示不允许遍历一
如下:当enumerable为true时,可以打印出属性的值
<script> var myObj = { } Object.defineProperty(myObj, 'age', { value: '30', enumerable: true }); for(var key in myObj){ console.log(myObj[key]) // 30 }script>
<script> var myObj = { } Object.defineProperty(myObj, 'age', { value: '30', enumerable: false }); for(var key in myObj){ console.log(myObj[key]) // 无 }script>
04set和get
当设置set或者get时,JavaScript会忽略它们的value和writable特性
set:可以传参,当属性被设置时调用get:没有参数,在读取属性时调用第一段代码给myObj设置了属性todayYear,根据(x + '-' + this.month)运算规则,动态设置了date的属性值第二段代码可以直接给myObj的todayYear添加get,当读取属性时直接调用了(new Date().getFullYear())
<script> var myObj = { month: 10, date: '' } Object.defineProperty(myObj, "todayYear", { set: function (x) { this.date = x + '-' + this.month; } } ); myObj.todayYear = new Date().getFullYear(); console.log(myObj.date) // 2020-10script>
<script> var myObj = { month:10 } Object.defineProperty(myObj, 'todayYear', { get() { return todayYear = new Date().getFullYear(); }, }); console.log(myObj.todayYear) // 2020script>
七、对象属性的遍历和删除
0
1
遍
历
for in 遍历的是对象的可遍历属性,当给对象的属性描述符enumerable设置为false时,此属性不会被遍历
hasOwnProperty可以判断是否为自身属性,是返回true,否则返回false
<script> var myObj = { age: 20, name: 'zhangsan', doSomething:function(){ } } for(var key in myObj){ console.log(myObj[key]) }script>
var myObj = { name: 'zhansan' };for (var key in myObj ) { if (myObj.hasOwnProperty(key)) { console.log(key); }}
0
2删除
删除成功后再次返回会返回undefined
<script> var myObj = { age: 20, name: 'zhangsan', doSomething:function(){ } } delete myObj.age console.log(myObj.age) // undefinedscript>
一些读书摘要
所谓“阅读的人”(readers),是指那些今天仍然习惯于从书写文字中汲取大量资讯,以增进对世界了解的人,就和过去历史上每一个深有教养、智慧的人别无二致。