七种数据类型:number string bool symbol (四基) null undefined (两空) object (对象)
五个falsy值:null undefined NaN 0 ''(空字符串)
声明对象的两种语法
对象
定义:
- 无序的数据集合
- 键值对的集合
写法:
let
细节:
- 键名是字符串,不是标识符,可以包含任意字符
- 引号可省略,省略之后就只能写标识符(标识符规则:不能以数字开头)
- 就算引号省略了,键名也还是字符串(重要)
奇怪的属性名
所有属性名会自动变成字符串
let
细节:
Object,keys(obj)可以得到obj的所有key
变量作属性名:
如何用变量作属性名
let
对比:
变量的值要作为key,就需要将变量用[]括起来
不加[]的属性名会自动变成字符串
加了[]则会当做变量求值
值如果不是字符串,则会自动变成字符串
对象的隐藏属性
隐藏属性
- JS中每一个对象都有一个隐藏属性
- 这个隐藏属性存储着其共有属性组成的对象的地址
- 这个共有属性组成的对象叫做原型
- 也就是说,隐藏属性存储着原型的地址
代码示例
var
如何删除对象的属性
删除属性
delete http://obj.xxx或delete obj['xxx']
即可删除obj的xxx属性
注意区分属性值为undefined和不含属性名
不含属性名
'xxx' in obj === false
含有属性名,但是值为undefined
'xxx' in obj&&obj.xxx===undefined
注意obj.xxx===undefined(只能判定xxx的属性值,不能判断属性名)
不能断定'xxx'是否为obj的属性
如何查看对象的属性
查看自身所有属性
Object.keys(obj)
查看自身+共有属性
- console.dir(obj)
- 或者自己依次用Object.keys打印出obj._proto__
判断一个属性是自身的还是共有的
obj,hasOwnProperty('toString')
原型
每个对象都有原型
- 原型里存着对象的共有属性
- 比如obj的原型就是一个对象
- obj._proto__存着这个对象的地址
- 这个对象里有toString/constructor.valueOf等属性
对象的原型也是对象
- 所以对象的原型也有原型
- obj={}的原型即为所有对象的原型
- 这个原型包含所有对象的共有属性是对象的根
- 这个原型也有原型,是null
![f6ffdfa81f04a9cf3812f8fd6e041c93.png](https://img-blog.csdnimg.cn/img_convert/f6ffdfa81f04a9cf3812f8fd6e041c93.png)
查看属性
两种方法查看属性
- 中括号语法:obj['key']
- 点语法:obj.key
- 坑新人语法:obj[key]//变量key值一般不为'key'
请优先使用中括号语法
- 点语法会误导你,让你以为key不是字符串
- 等你确定不会弄混两种语法,再改用点语法
![0a211c72860c85013c83bb33f0e0e999.png](https://img-blog.csdnimg.cn/img_convert/0a211c72860c85013c83bb33f0e0e999.png)
![60eba4224abd70081f58cab305d24940.png](https://img-blog.csdnimg.cn/img_convert/60eba4224abd70081f58cab305d24940.png)
![e1f885217c9ff78ce7f33e41ba22b411.png](https://img-blog.csdnimg.cn/img_convert/e1f885217c9ff78ce7f33e41ba22b411.png)
log的返回值永远是undefined
如何修改或增加对象的属性
直接赋值
![b1a448855717939cf90fd27324689957.png](https://img-blog.csdnimg.cn/img_convert/b1a448855717939cf90fd27324689957.png)
批量复制
Object
![78e41242c40b8a3a85e1dfd262d2764e.png](https://img-blog.csdnimg.cn/img_convert/78e41242c40b8a3a85e1dfd262d2764e.png)
修改或增加共有属性
![f51e3f9ddf8c683dc2319cf1c8f886ca.png](https://img-blog.csdnimg.cn/img_convert/f51e3f9ddf8c683dc2319cf1c8f886ca.png)
修改隐藏属性
![620edb902232fa993bb4fb94075e28e9.png](https://img-blog.csdnimg.cn/img_convert/620edb902232fa993bb4fb94075e28e9.png)
'name' in obj和obj.hasOwnProperty('name')的区别
in 是查看是否有这个属性,但是无法知道是自己特有的,还是共有的
hasOwnProperty可以查看到底是不是自己特有的
总结
![832daa380eb3fbf155bef288b7499c38.png](https://img-blog.csdnimg.cn/img_convert/832daa380eb3fbf155bef288b7499c38.png)
![43a66f9f9ad1e160909709449be487c3.png](https://img-blog.csdnimg.cn/img_convert/43a66f9f9ad1e160909709449be487c3.png)