object

文章目录

对象

只要不是五种基本数据类型(ES5 五种,ES6 加了 Symbol),都是对象。

对象的值保存在堆内存中,对象的引用(即变量)是保存在栈内存中的。

垃圾回收机制

如果一个对象没有变量指向它,它就会被回收。重点是理解 等号左右两边,它们都是独立的一部分,不要把它们看成整体。 右边只是一个对象而已,左边的变量也不是对象的名字,对象没有名字,只是指向它的地址而已。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
let obj1 = {
a: 1
}
// 此时 { a: 1 } 这个对象被 obj1 引用了,所以它不会被回收


obj1 = null

// 此时 { a: 1 } 这个对象没有被任何变量引用,它就会被回收



let obj2 = { a: 1 }

// 这是一个新的 { a: 1 } 对象

let obj1 = obj2
obj2 = null
// 此时 { a: 1 } 不会被销毁,虽然 obj2 已经不再指向它的地址,但 obj1 仍然指向它,满足有变量指向它的条件。

创建对象

  • 字面量创建

    var obj = {} ,也叫直接创建

  • 构造函数创建

    var obj = new Object()

  • Object.create() 该方法使用现用对象来提供新对象的 __proto__ ,例

    1
    2
    3
    const o = Object.create({ x: 1, y: 2});
    o.__proto__ // { x: 1, y: 2}
    o // {} 自身没有属性,只有一个__proto__ 指向原型对象

修改属性

1
2
3
4
5
6
var obj = {}
console.log(obj)
obj.age = 25
obj.name = 'tt'
console.log(obj)
// 注意在 chrome 浏览器中,两个console.log 打印出来的 Obj 展开后是一样的(点一下小三角形),因为 chrome 会把计算后的对象返回到三角形里。 这时候刷新一下页面就能显示不一样,但点击三角形拓展了之后内容还是一样的。

this

this 只有在调用的时候才会明确

1
2
3
4
5
6
7
8
9
var obj = {
say: function() {
console.log(this.name)
},
name: 'tt'
}
obj.say() // tt ,obj调用了say(), this 指向 obj
var foo = obj.say
foo() // undefined // window 调用了 say(),this 指向 window ,window 中没有 name 属性。

构造函数

  • 构造函数 是专门用来创建对象的。

  • 它的首字母一般都是大写的。

  • 相当于是一个模具

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function Student(name, age) {
this.name = name
this.age = age
this.city = 'Zhengzhou'
}
var stu1 = new Student('tt',21)
var stu2 = new Student('bb',22)
// 两个 stu 的 name 和 age 属性是传入的值,但他们都有属性 city 值为 'Zhengzhou',
// new 的过程
// 1. 创建一个空对象,并
// 2. 将空对象的 __proto__ 指向了构造函数的 prototype
// 3.this 的指针指向这个空对象
// 4. 执行构造函数中的代码
// 5. 把这个对象 return

对象的分类

  • 内置对象

  • 宿主对象

  • 自定义对象,

对象的遍历

for ... in 循环

1
2
3
4
5
6
7
8
var obj = {
name: 'tt',
age: 18
}
for(var key in obj) {
console.log(key) // 打印属性名
console.log(obj[key]) // 打印属性值
}

数组遍历

1
2
3
4
5
6
var arr = [1, 3, 5, 7, 9]
// 数组遍历方法 forEach ,函数作为参数,称作回调函数
arr.forEach(function(item,idx){
// 回调函数中 第一个参数是当前遍历的元素值,第二个参数表示当前遍历的元素对应的下标
console.log(item, idx) // 1 0, 3 1, 5 2, 7 3, 9 4
});

特殊对象

JSON
1
2
3
4
5
6
var json = `{"a": "Hello", "b": "World"}`;
// 本质是一个字符串(JSON 字符串),头尾用 '' 包住,属性名和属性值都用 "" 包住
// 因为对象无法在网络间进行传输,但字符串可以,于是诞生了 JSON,是网络间进行传输的一种数据格式,拿到 JSON 字符串后把它变回对象,就能进行对象的基本操作。
var jsonObj = JSON.parse(str)
// {a: "Hello", b: "World"} 把 JSON 字符串变回对象
var str = JSON.stringify(jsonObj) // `{"a": "Hello", "b": "World"}` 对象转换成 JSON 字符串
arguments
1
2
3
4
5
function add(x, y, z) {
console.log(arguments) // 函数的实参**对象**,是个类数组,具备索引,长度属性,但无法使用数组方法,里面存折传进来的实参信息
console.log(arguments.callee) // 返回这个函数本身
}
add()

题外

document ###### 垃圾回收

如果没有变量能引用这个对象,这个对象就会被回收(即使这个对象能引用别的变量)。如

1
2
3
4
5
6
7
8
9
var obj = {
name: 'tt'
obj: obj2
}
var obj2 = {
age: 18
}
obj = null
// 因为 obj 的地址被修改了,没有变量用到 {name: 'tt'} 这个对象了。所以会被回收,因为没有人能找到它了,即使它能找到别人。
分享到:

评论完整模式加载中...如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理