第四章 对象和数组

Object类型

创建方法有两种,字面量和new运算符

1. 使用new运算符

let obj = new Object(); new方式

obj.name = 'lin' 创建属性字段

2. new关键字可以省略

Let obj = Object(); 省略new关键字

3. 使用字面量方式

let obj = {a: 1, b: 2} 字面量方式 创建字段

4. 属性字段也可以使用字符串形式

Let obj = {
    'a': 1,
    'b': 2
}

5. 字面量,传统赋值方式

let obj = {};
obj.name = 'lin';
  1. 两种输出方式

    obj.a点表示法 obj['a']中括号表示法输出

    再使用字面量声明Object对象时,不会调用Object构造函数

  2. 给对象创建方法

let obj = {};
obj.sayHello = function () {
    console.log('hello');
};
obj.sayHello(); //hello
let obj = {
    // ...
    sayHello: function () {
        console.log('hello');
    }
};
obj.sayHello(); //hello

delete方法

//接上面代码
delete obj.sayHello;
obj.sayHello(); // not a function

开发过程中,一般喜欢字面量的方式。清晰,语法代码少,也是传递大量参数的首选方式。

let obj = {};
for (let i = 1; i < 50; i++) {
    obj['a' + i] = i;
    if (i >= 50) break;
}
function foo(obj) {
    if(obj.a1) console.log(obj.a1);     //1
    if(obj.a22) console.log(obj.a22);   //22
    if(obj.a55) console.log(obj.a55);   //无输出
}
foo(obj);

Array类型

数组对象的作用是:使用单独的变量名来存储一系列的值。数组的类型是object;

两种方法创建:字面量,new运算符new Array();

  1. 使用new关键字创建数组

    let arr = new Array();
    console.log(arr);   // []
    
    let arr1 = new Array(10);
    console.log(arr1);  // [empty × 10]
    arr1[3] = 'hello';
    arr1[5] = 'world';
    console.log(arr1);
    //[empty × 3, "hello", empty, "world", empty × 4]
    
    let arr2 = new Array(10,2);      
    //写一个参数是定义数组长度,多个是传入参数。
    console.log(arr2);  // [10, 2]
    

    new关键字可以省略。

  2. 字面量方式创建数组

    let arr = [];
    let arr1 = [1,2,3];
    let arr2 = [1,2,];  // 这里有些浏览器是三个元素 不推荐
    let arr3 = [,,,];   //有些浏览器不兼容 不推荐
    
  3. 使用下标读取数组的值

    let arr = [1,2,3];
    console.log(arr[0]);    //1
    arr[1] = 10;
    console.log(arr[1]);    //10
    
  4. 使用length属性获取元素量

    let arr = [1, 2, 3];
    console.log(arr.length);    //3
    arr.length = 10;
    console.log(arr.length);    //10
    console.log(arr);           //[1, 2, 3, empty × 7]
    arr.length = 2;
    console.log(arr);           //[1,2]
    arr.length = 10;
    console.log(arr);           //[1, 2, empty × 8]
    

数组中的方法

转换方法

对象或数组都有toLocaleString()、toString()、ValueOf()方法,toString()、ValueOf()无论重写哪个都会返回相同值。数组会将每个字用字符串的方式拼接,以逗号隔开。

let arr = ['小明', 18, '计算机'];
console.log(arr);                       // ["小明", 18, "计算机"]
console.log(arr.toLocaleString());      // 小明,18,计算机 
console.log(arr.toString());            // 小明,18,计算机
console.log(arr.valueOf());             // ["小明", 18, "计算机"]
join方法 — 转字符串

不改变原数组

let arr = ['小明', 18, '计算机'];
console.log(arr.join('|')); //小明|18|计算机
push&pop栈方法 — 尾插尾删
  • pop删除一个数组中的最后一个元素,并且返回这个元素
  • push添加一个或多个元素到数组的末尾,并返回数组新的长度
  • 改变原数组
shift&unshift队列方法 — 头插头删
  • shift删除数组的第一个元素,并返回这个元素
  • unshift在数组的开头插入一个或多个元素,并返回数组的新长度
  • 改变原数组
reverse&sort排序方法 — 逆序排序
  • reverse前后颠倒数组中元素的位置,第一个元素会成为最后一个

  • 记a和b是两个将要被比较的元素:

    如果函数function(a, b)返回值小于0, 则a会排在b之前
    如何函数返回值等于0, 则a和b的相对位置不变(并不被保证)
    如果函数返回值大于0,则a会排在b之后
    比较函数输出结果必须稳定,否则排序的结果将是不确定的

    改变原数组

    let arr = [2, 5, 1, 10, 99, 3];
    arr.sort(function (a, b) {
        return a - b;
    });
    console.log(arr);
    // [1, 2, 3, 5, 10, 99]
    arr.reverse();
    console.log(arr);
    // [99, 10, 5, 3, 2, 1]
    
concat&slice&splice — 连接数组、截取数组、删除/增加数组项
  • concat 基于原数组创建新数组

  • 不改变原数组

    let arr1 = [1, 2, 3];
    let arr2 = arr1.concat([4, 5]);
    console.log(arr1);  
    // [1, 2, 3,]
    console.log(arr2);  
    // [1, 2, 3, 4, 5]
    
  • slice

    方法可从已有的数组中返回选定的元素。

    不改变原数组。

    let arr1 = ['lin', 26, '吉林', '白山', 'HELLO'];
    let arr2 = arr1.slice(1);
    console.log(arr2);
    // [26, "吉林", "白山", "HELLO"]  从第一个位置截取数组
    console.log(arr1);
    // ["lin", 26, "吉林", "白山", "HELLO"]
    let arr3 = arr1.slice(1, 3);
    console.log(arr3);
    // [26, "吉林"]  从第一个位置取到第三个位置
    
  • splice

    方法向/从数组中添加/删除项目,然后返回被删除的项目。(改变原数组)

    语法: array.splice(start, deleteCount[, item1[, item2...])

    // 删除功能
    let arr1 = ['lin', 26, '吉林', '白山', 'HELLO'];
    let arr2 = arr1.splice(1);
    console.log(arr1);
    // ["lin"] 原数组被改变
    console.log(arr2);
    // [26, "吉林", "白山", "HELLO"]+
    let arr3 = arr2.splice(0, 2);
    console.log(arr3);
    // [26, "吉林"] 表示从第0位置取两个
    
    // 增加功能
    let arr1 = ['lin', 26, '吉林', '白山', 'HELLO'];
    arr1.splice(0, 0, '3号', '回家');
    // 第0项 删除0 增加两项
    console.log(arr1);
    // ["3号", "回家", "lin", 26, "吉林", "白山", "HELLO"]
    
    // 替换功能
    let arr1 = ['lin', 26, '吉林', '白山', 'HELLO'];
    arr1.splice(0, 1, 'zhang');
    // 第0项 替换1项 内容
    console.log(arr1);
    // ["zhang", 26, "吉林", "白山", "HELLO"]
    
    
fill方法 * ES6 替换数组元素

用于将一个固定值替换数组的元素。改变原数组。

语法:array.fill(value, start, end);IE 11 及更早版本不支持 fill() 方法。

参数 描述
value 必需。填充的值。
start 可选。开始填充位置。
end 可选。停止填充位置 (默认为 array.length)
let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
arr.fill(6, 0, 10);
console.log(arr);   //[6, 6, 6, 6, 6, 6, 6, 6, 6, 6]
copyWithin * ES6

语法:array.copyWithin(target, start [, end = this.length]

改变原数组。

参数 描述
target 必需。复制到指定目标索引位置。
start 可选。元素复制的起始位置。
end 可选。停止复制的索引位置 (默认为 array.length)。如果为负值,表示倒数。

进行替换操作,不改变数组长度,从开始下标:

let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
arr.length = 12;
arr.copyWithin(2, 0);
console.log(arr);   // [1, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
includes

用来判断当前数组是否包含某指定的值,如果是,则返回true,否则false

语法:array.includes(searchElement, [, fromIndex])

let arr1 = ['lin', 26, '吉林', '白山', 'HELLO'];
console.log(arr1.includes('lin'));
// true
toString

返回一个字符串,该字符串由数组中的每个元素的toString()返回值经调用join()方法连接(由逗号隔开)组成。

let arr1 = ['lin', 26, '吉林', '白山', 'HELLO'];
console.log(arr1.toString());
// lin,26,吉林,白山,HELLO
toLocaleString

返回一个字符串表示数组中的元素。数组中的元素将使用各自的toLocaleString方法转化成字符串,这些字符串将使用一个特定语言环境的字符串(例如逗号)隔开

let arr1 = ['lin', 26, '吉林', '白山', 'HELLO'];
console.log(arr1.toLocaleString());
// lin,26,吉林,白山,HELLO
indexOf

返回指定元素能在数组中找到的第一个索引值,否则返回-1
fromIndex可以为负,表示从倒数第n个开始(此时仍然从前向后查询数组
使用“严格相等”(===)进行匹配

array.indexOf(searchElement[, fromIndex = 0])

let arr1 = [1,2,5,5,6,7,8,8,9];
console.log(arr1.indexOf(5));
// 2
console.log(arr1.indexOf(55));
// -1
lastIndexOf

返回指定元素在数组中的最后一个的索引,如果不存在则返回-1, 从数组的后面向前查找

array.lastIndexOf(searchElement[, fromIndex = arr.length - 1])

let arr1 = [1,2,5,5,6,7,8,8,9];
console.log(arr1.lastIndexOf(5));
// 3
console.log(arr1.lastIndexOf(55));
// -1

数组遍历

forEach

array.forEach(function(currentValue, index, arr), thisValue);

参数 描述
currentValue 必需。当前元素
index 可选。当前元素的索引值。
arr 可选。当前元素所属的数组对象。
thisValue 可选。传递给函数的值一般用 "this" 值。
如果这个参数为空, "undefined" 会传递给 "this" 值
let arr1 = [1, 2, 3, 4, 5];
let sum = 0;
arr1.forEach(item => {
    sum += item;
});
console.log(sum);   //15

map

返回一个由原数组中的每个元素调用一个指定方法后的返回值组成的新数组
map 不修改调用它的原数组本身(当然可以在 callback 执行时改变原数组)

array.map((value, idx, a) => {})

let arr1 = [1, 2, 3, 4, 5];
let arr2 = arr1.map(item => item += 'haha');
console.log(arr1);
// [1, 2, 3, 4, 5]
console.log(arr2);
// ["1haha", "2haha", "3haha", "4haha", "5haha"]

filter

使用指定的函数测试所有元素,并创建一个包含所有测试通过的元素的新数组
callback函数返回一个布尔值,true即通过测试
callback只会在已经赋值的索引上被调用,对于那些已经被删除或者从未被赋值的索引不会被调用
不会改变原数组

array.filter((v, i, a) => {})

let arr1 = [1, 2, 3, 4, 5];
let arr2 = arr1.filter(item => item !== 2);
console.log(arr1);
// [1, 2, 3, 4, 5]
console.log(arr2);
// [1, 3, 4, 5]

reduce

reduce() 函数会对参数序列中元素进行累积。

函数将一个数据集合(链表,元组等)中的所有数据进行下列操作:用传给 reduce 中的函数 function(有两个参数)先对集合中的第 1、2 个元素进行操作,得到的结果再与第三个数据用 function 函数运算,最后得到一个结果。

reduce(function, iterable[, initializer])

  • function -- 函数,有两个参数
  • iterable -- 可迭代对象
  • initializer -- 可选,初始参数
let arr1 = [1, 2, 3, 4, 5];
let arr2 = arr1.reduce((a, b) => a + b);
console.log(arr1);
// [1, 2, 3, 4, 5]
console.log(arr2);
// [1, 3, 4, 5]
let arr1 = [[1, 2], [3, 4], [5, 6]].reduce((a, b) => a.concat(b));
console.log(arr1);
// [1, 2, 3, 4, 5, 6] 扁平数组

reduceRight

使用同上,与reduce()的执行方向相反

entries

Object.entries() 方法返回一个给定对象自身可枚举属性的键值对数组,其排列与使用 for...in 循环遍历该对象时返回的顺序一致(区别在于 for-in 循环也枚举原型链中的属性)。

通俗点就是 Object.entries() 可以把一个对象的键值以数组的形式遍历出来,结果和 for...in 一致,但不会遍历原型属性。

let arr1 = ['xiaoming', 'kakaxi', 'mingren', 'zuozhu', 'huoying'];
console.log(Object.entries(arr1));
arr
let obj = {name: 'xiaoming', age: 18, hobby: 'computer'};
console.log(Object.entries(obj));
obj

every

callback只会为那些已经被赋值的索引调用,不会为那些被删除或从来没有被赋值的索引调用
和forEach函数类似
注意:array.every()返回一个布尔值,即对每个元素的callback函数结果作逻辑“&”操作

some

使用方法同上,
注意:对每个元素的callback函数结果作逻辑“||”操作

keys

返回一个数组索引的迭代器(类似于array.entries()方法)

find

【有兼容性问题目前】
返回数组中满足测试条件的第一个元素,如果没有满足条件的元素,则返回undefined

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,711评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,079评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,194评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,089评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,197评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,306评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,338评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,119评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,541评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,846评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,014评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,694评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,322评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,026评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,257评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,863评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,895评论 2 351