对象
语法
两种形式定义:声明形式和构造形式。
//声明形式
var myObj1 = {
key: value
//...
}
//构造形式
var myObj2 = new Object();
myObj2.key = value;
类型
对象是JavaScript的基础。
JavaScript中一共有六种主要类型。
string number boolean null undefined object
!简单基本类型(tring number boolean null undefined)本身不是对象
函数是对象的一个子类型。
内置基本类型
String Number Boolean Object Function Array Date RegExp Error
实际上是一些内置函数,可以当作构造函数来使用,构造一个对应子类型的新对象。
必要时语言自动把字符串/数值字面量转换成一个String/Number对象。
null和undefined没有对应的构造形式,,Date只有构造。
Object、Array、Function和RegExp 两种形式都是对象,无字面量。
内容
对象的内容是由一些存储在特定命名位置的值组成的,称之为属性。
var obj = {
name: "newman"
};
obj.name;//"newman"
obj["name"];//"newman"
用.或者[]操作符访问对象。.name被称为“属性访问”,[“name”]被称为“键访问”。
对象中,属性名永远都是字符串。
属性与方法
无论返回值是什么类型,每次访问对象的属性就是属性访问。如果属性访问返回的是一个函数,那它也并不是一个“方法”。属性访问返回的函数和其它函数没有任何区别。
复制对象
深拷贝和浅拷贝区别:
栈内存:地方小,所以存小数据(其他特性不细说)
堆内存:地方大,所以存大数据(其他特性不细说)
js值类型数据是直接寻址:需要存的数据较小,指向的栈地址里存的即是数据(这里的数据又叫操作数)
js引用类型数据是间接寻址:指向的栈地址里存的是堆地址,对应的堆地址里存放操作数(顾名思义“间接”)。
如果想复制一组引用类型的数据,因为引用类型是间接寻址,则需要深拷贝。(如果只是简单的“=”赋值,则只是浅拷贝。浅拷贝只会把第一个变量的堆地址赋值给第二个变量,这样第一个变量和第二个变量指向的是同一个堆地址,这时第二个变量的值改变,第一个变量的值也会跟着改变。如果需要第二个变量的值改变的同时第一个变量不变,则需要深拷贝,即不拷贝指针(堆地址),只拷贝堆地址中存的数据(操作数)。)
深拷贝简单方法:
let obj2=JSON.parse(JSON.stringify(obj1))
let array2=JSON.parse(JSON.stringify(array1))
属性描述符
-
Writeable 决定是否可以修改
-
Configurable 决定是否可配置
-
Enumerable 控制属性是否出现在对象属性的枚举中
遍历
for…in循环可以用来遍历对象的可枚举属性列表。
forEach(…)会遍历数组中所有值并忽略回调函数的返回值,every(…)会一直运行到回调函数返回false,some(…)会一直运行直到回调函数返回true。
ES6 增加了一种用来遍
历数组的 for…of 循环语法,可直接遍历值。
小结
-
对象是基础类型之一。对象包括function在内的子类型,不同的子类型具有不同的行为。
-
对象就是键值对的集合。
-
属性的特性可以通过属性描述符来控制。
-
属性不一定包含值。
-
ES6 的 for…of 语法来遍历数据结构(数组、对象,等等)中的值, for…of会寻找内置或者自定义的 @@iterator 对象并调用它的 next() 方法来遍历数据值。