【《你不知道的JS(中卷)》】三、对象

时间:2020-06-17 23:23:20   收藏:0   阅读:58

三、对象:

一)、语法:

对象有两种形式定义:

声明(文字)形式

var myObj = {
    key: value
    // ...
};

构造形式

var myObj = new Object();
myObj.key = value;

1、类型:

? 对象是JS的基础,JS中一共有六种主要类型。

? 前五个被称为 简单基本类型,本身并不是对象,执行type of null会返回obejct,这属于JS语言的一个bug。因此 JS中并不是万物皆是对象

? JS中有许多特殊的对象子类型,称之为 复杂基本类型

2、内置对象:

? 内置对象的表现形式很像其他语言的类型(type)或者类(class),(比如Java中的String类)。但是在JS中,这些只是一些内置函数(可以当作构造函数使用(参见本卷this详解中new绑定))。

var strPrimitive = "I am a string";
console.log(typeof strPrimitive);  // string
console.log(strPrimitive instanceof String);  // false

var strObject = new String("I am a string");
console.log(typeof strObject);  // object
console.log(strObject instanceof String);  // true

console.log(strPrimitive.charAt(3));  // m

三)、内容:

? 对象的内容是由一些存储在特定命名位置的(任意类型的)值组成的,我们称之为属性。

属性访问、键访问:

var myObject = {
  a: 2
};

// 属性访问:
console.log(myObject.a);  // 2
// 键访问:
console.log(myObject["a"]);  // 2

1、可计算属性名:

? 主要用于ES6中的符号(Symbol)。

2、属性与方法:

? 准确来说,函数并不会属于一个对象,因此JS中的函数并不是“方法”。(即使具有this引用)。

3、数组:

? 数组也支持字符串作为键,但是使用数值下标经过了优化。

4、复制对象:

浅拷贝/深拷贝:

function anotherFunction() {
  // ...
}

var anotherObject = {
  c: true
};

var anotherArray = [];

var myObject = {
a: 2,
b: anotherObject,  // 引用
c: anotherArray,
d: anotherFunction 
};

浅拷贝在复制myObject的同时,也会去复制a的值,而b、c、d的值仍然是引用。

深拷贝则会同时复制b、c、d的值。(深拷贝可能会导致循环引用,导致死循环)

5、属性描述符:

6、不变性:

7、[[Get]]:

? 属性访问并不是简单的在对象中查找该属性。而是实现了[[Get]]操作(类似于函数调用[[Get]]())。会在对象中查找是否有名称相同的属性,如果有则返回该属性的值,如果没有则沿原型链查找。如果还是找不到则会返回undefined(如果该变量在当前词法作用域中没有定义,则会抛出ReferenceError异常)。

8、[[Put]]:

[[Put]]流程:

  1. 属性是否是访问描述符?如果是并且存在setter就调用setter。
  2. 属性的数据描述符中writable是否是false?如果是,在非严格模式下静默失败,在严格模式下抛出TypeError异常。
  3. 如果都不是,将该值设置为属性的值。

9、Getter和Setter:

? getter和setter是隐藏函数,分别会在获取属性值、设置属性值时会被调用。

10、存在性:

? 当类似 myObject.a这样访问属性时返回undefined,可能时属性不存在,但是也有可能该属性存储的值就是undefined。

var myObject = {
  a: 2
};

console.log("a" in myObject)  // true
console.log("b" in myObject)  // false
console.log(myObject.hasOwnProperty("a"));  // true
console.log(myObject.hasOwnProperty("b"));  // false

四)、遍历:

辅助迭代器:

? 接受回调函数并把它应用到数组的每个元素上,唯一的区别就是它们对于回调函数返回值的处理方式不同。

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!