对象
对象存储在堆中,栈中存放着对内存地址的引用。
注意问题
- 两个对象相比较
obj1 = {}
obj2 = {}
obj1 == obj2 // false
2. 引用赋值,影响原对象
info = {name:'11',age:1,address:{name:"aa"}}
obj =info.address
obj.name = 'bbb'
ifno.address.name // bbb
3.引用传递,作为函数的参数传入时,在函数中创建新的对象,没有对传入的对象进行修改。
obj = { name:"aa" }function foo(o){o ={ name:"bb"}}foo(obj) obj.name // aa
//foo(o) 在函数中 会把传入的参数赋值给形参,即 a = obj
//然后再执行 a = {},不会影响原对象
3.引用传递,作为函数的参数传入时,修改对象的属性,会影响原对象
obj = { name:"aa" }function foo(o){o.name = 'bb'}foo(obj) obj.name // bb
类
在es5之前通过构造函数创建,es6之后,可以通过class来生命。
1.通过构造函数创建
// 在函数中有一个this变量,这个变量大多数情况下指向一个对象。// 定义一个构造函数
function Person(name, age) { this.name = name; // 设置对象的name属性 this.age = age; // 设置对象的age属性
}
// 使用构造函数创建对象
const person1 = new Person('Alice', 25);
函数在执行new操作符会执行如下操作
- 在内存中创建一个新对象(空对象{})
- 这个对象内部的[[prototype]]属性被赋值为该构造函数的prototype属性
- 构造函数内部的this,会指向创建出来的新对象
- 执行函数内部的代码
- 如果构造函数没有返回非空对象,就返回创建出来的新对象
原始类型的包装类
js的原始类型并非包装类,理论上不能获取属性或调用方法,但是经常可以看到执行这样的操作:
cosnt msg = "aaa"msg.lengthmsg.slice(0,1)
这是因为 js为了使其可以调用属性和方法,对齐封装了对应的包装类。
常见的包装类有 String,Number,Boolean,Symbol,BigInt.