对象的含义
对象就是一组“键值对”(key-value)的集合,是一种无序的复合数据集合。
//两种声明方式
let obj = { 'name': 'lion', 'age': 18 }
let obj2 = new Object({'name': 'lion'})
console.log({ 'name': 'lion, 'age': 18 })
上述代码种,大括号中就定义了一个对象,它被赋值给变量obj,所以变量obj就指向一个对象。该对象内部包含两个键值对(又称为两个“成员”),第一个键值对是'name: 'lion' ,其中 'name' 是“键名”(成员的名称),字符串 'lion' 是“键值”(成员的值)。键名与键值之间用冒号分隔。第二个键值对是 'age': '18','age' 是键名,'18' 是键值。两个键值对之间用逗号分隔。
引号可以省略,省略之后就只能写标识符,就算引号省略了,键名也还是字符串
对象的属性(增删改查)
每个 key 都是对象的属性名(property)
每个 value 都是对象的属性值
对象的所有键名都是字符串,不是标识符,可以包含任意字符,如果键名是数值,会被自动转为字符串。
var obj = {
7: 'a',
7.7: 'b',
7e2: true,
7e-2: true,
.777: true,
0xFF: true
};
obj
// Object {
// 7: "a",
// 7.7: "b",
// 700: true,
// 0.07: true,
// 0.777: true,
// 255: true
// }
obj['100'] // true
Object.keys(obj)
=> ["7", "225", "700", "7.7", "0.07", "0.234"]
Object.keys(obj) 可以得到 obj 的所有 key
如果键名不符合标识名的条件(比如第一个字符为数字,或者含有空格或运算符),且也不是数字,则必须加上引号,否则会报错。
// 报错
var obj = {
1p: 'Hello World'
};
// 不报错
var obj = {
'1p': 'Hello World',
'h w': 'Hello World',
'p+q': 'Hello World'
};
属性的修改或增加
#### 直接赋值 ```javascript let obj = {name: 'lion'} // name 是字符串 obj.name = 'lion' // name 是字符串 obj['name'] = 'lion' obj[name] = 'frank' // 错误语法 obj['na'+'me'] = 'lion'
<a name="uA6AQ"></a>
#### 批量赋值
```javascript
let obj ={}
Object.assign(obj, {'name':'lion',age: 18, gender: 'man'})
//{age: 18, gender: "man", name: "lion"}
共有属性的修改或增加
无法通过自身修改或增加共有属性
let obj = {}, obj2 = {} // 共有 toString
obj.toString = 'xxx' //"xxx",只会在改 obj 自身属性
obj2.toString //ƒ toString() { [native code] },还是在原型上
强行修改或增加原型上的属性
obj.__proto__.toString = 'xxx' // 不推荐用 __proto__
Object.prototype.toString = 'xxx'
let obj = Object.create(common) //一开始就指定原型
这一用法说明了只要用户找到原型就能修改原型里的所有属性,使得JS的属性都变得不可信了,体现了JS的脆弱性。一般来说,不要修改原型,会引起很多问题。
属性的删除(delete 命令)
delet命令最好只用来删除属性,删除对象要用其他方法,以下两种方法都能删除obj的 a 属性
let obj = {a:1}
Object.keys(obj) //["a"]
delete obj.a //true
obj.a // undefined
Object,keys(obj) // []
//或者
delete obj['a']
delete命令中,obj.name=undefined 和 delete obj.name 的区别
let obj ={name:"fuck",age:18}
obj.name=undefined //只删除属性值
obj
//{name:undefined,age:18}
delete obj.name //连属性名一起删除
obj
//{age:18}
要区分“属性值为 undefined ”和“不含属性名”的区别
let obj={}
let obj2={x:undefined}
obj.x === undefined //true
obj2.x===undefined //true
'x' in obj //false
这个例子中,obj不含属性名,obj2中属性名 'x' 的值为 undefined ,但它们都等于 undefined 故不能用obj.'属性名' === undefined 来判断'属性名’是否为obj的属性
in函数只能判断有没有这个属性,不能判断是自身的还是共有的;obj.hasOwnProperty('属性')可以判断这个属性是自身的还是共有的
属性的读取
查看自身所有属性
Object.keys(obj)
查看自身+共有属性
console.dir(obj)
或者自己依次用 Object.keys 打印出 obj.__proto__
判断一个属性是自身的还是共有的
obj.hasOwnProperty('toString')
属性的查看
两种方法查看属性
let obj = {a:1,b:2}
obj['key'] //中括号语法
obj.key //点语法
//['a','b']
obj[key] //错误语法
要明确的区分字符串和变量的区别
//这里的 name 是字符串,而不是变量
obj.name === obj['name']
obj.name !== obj[name]
let name = 'lion'
obj[name] === obj['lion']
obj[name] !== obj['name']
obj[name] !== obj.name
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 提示下载完但解压或打开不了?
- 找不到素材资源介绍文章里的示例图片?
- 模板不会安装或需要功能定制以及二次开发?
发表评论
还没有评论,快来抢沙发吧!