七种数据类型
- 数字 number
- 字符串 string
- 布尔 boolean
- 符号 symbol
- 空 undefined
- 空 null
- 对象 object
5个Falsy值
- NaN
- 0
- undefined
- null
- ‘’ (空字符串)
对象
- 定义
无序的数据集合;键值对的集合 - 写法
1.let obj = { 'name' : 'Ting' , 'age' : 18 }
2.let obj = new Object({ 'name' : 'Ting' , 'age' : 18 })
- 细节:
- 键名是字符串,不是标识符,可以包含任意字符
- 引号可以省略,省略之后就只能写标识符
- 就算引号省略的,键名也还是字符串
变量做属性名
每个key都是对象的属性名;每个value都是对象的属性值。
Object.keys(obj)
可以得到obj的所有key
let p1 = 'name'
let obj = { p1 : 'Ting' }
,这样写,属性名为’p1’let obj = { [p1] : 'Ting' }
,这样写,属性名为’name’
细节- 不加[ ]的属性名会自动变成字符串
- 加了[ ]的属性名则会当做变量求值
- 值如果不是字符串,则会自动变成字符串
删除对象的属性
delete obj.xxx
或delete obj['xxx']
delete obj.xxx
删除后 属性名还在,属性值为undefined
delete obj['xxx']
删除后 属性名和属性值都不在了
查看对象属性
- 查看自身所有属性
Object.keys(obj)
- 查看自身+共有属性
console.dir(obj)
或者 依次用Object.keys打印出obj._ _ proto_ _
- 判断一个属性是自身的还是共有的
obj.hasOwnProperty('toString')
- 查看属性
obj['key']
obj,key
重要
obj.name 等价于obj.['name']
obj.name 不等价于 obj.[name]
name、['name']
里面的 name 是字符串 ;[name]里面的name是变量
修改和增加属性
直接赋值
let obj = {name : 'Ting' ]
// name是字符串obj.name = 'Ting'
// name是字符串obj.['name'] = 'Ting'
// 错 因为name值为变量 值不确定obj.['name'] = 'Ting'
obj.['na'+'me'] = 'Ting'
let key = 'name'
;obj[key] = 'Ting'
let key = 'name'
;// 错 因为obj.key = 'Ting
obj.key
等价于obj.['key']
批量赋值
Object.assign(obj,{age : 18 , genger : 'woman'})
重要
- 无法通过自身修改或增加共有属性
let obj = {}, obj2 = {}
// 共有属性toString
obj.toString = 'xxx'
只会在改obj自身属性
obj2.toString
还是在原型上 - 修改隐藏属性 推荐使用Object.create
let obj = Object.create(common)
obj.name = 'Ting'
let obj2 = Object.create(common)
obj2.name = 'Jack'
大概意思是,要改就一开始改,别后来再改
'name' in obj
和obj.hasOwnProperty('name')
的区别
hasOwnProperty('name')
该方法用于检查既定的属性在对象实例中是否存在,作为参数的属性名必须是字符串类型。简单来说,name 是否是obj的自己具有的属性,而不是原型上共有的属性
因为对象obj中有name属性,所以返回true;因为没有age属性,所以返回false
let obj = {
name: 'jinlian'
}
Object.prototype.age = 18;
console.log(obj.hasOwnProperty("name")) // true
console.log(obj.hasOwnProperty("age")) // false
in操作符,同样也是检测既定的属性是否存在于对象中,但是不一样的是,只要对象能访问到的属性,in操作符都会返回true,即使在原型上存在该属性。
let obj = {
name: 'jinlian'
}
Object.prototype.age = 18;
console.log("name" in obj) // true
console.log("age" in obj) // true