《你不知道的javascript》--读书笔记(9)

对象

语法

两种形式定义:声明形式和构造形式。

//声明形式
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() 方法来遍历数据值。

猜你喜欢

转载自blog.csdn.net/NEW_cai/article/details/85114510
今日推荐