数组

内置基本类型和引用类型在内存中存储的方式:

内置基本类型:只有一块空间,栈空间,用来存储数值

引用类型:有两块空间:一块栈空间,存储的是堆空间的地址

​ 一块堆空间,存储的是数据的本身

栈:自动分配内存空间,系统自动释放,里面存放的是基本类型的值和引用类型的地址

堆:动态分配的内存,大小不定,也不会自动释放。里面存放引用类型的值。

数组的定义:

1,构造函数

new:在堆上开辟空间的关键字

Array:数组的类型

1
2
var arr = new Array(1, 2, 33, 44, 5, "嘿嘿");
console.log(arr);

2,字面量

1
2
var arr = [6,5,7,4,8];
console.log(arr);

数组元素的访问:

数组名[下标];

下标:基于0,连续的整数

​ 可以为常量和变量

1
2
console.log(arr[0]);
console.log(arr[1]);

数组的遍历:对数组每个元素操作的过程

数组元素的个数,也称为长度 arr.length;

1
2
3
4
console.log(arr.length);
for(var i = 0; i < arr.length; i++){
console.log(arr[i]);
}

数组的常见函数(API)

如何学习函数:关注3点

1,函数的功能

2,函数的参数

3,函数的返回值

push

功能:尾插

参数:push(参数1,[参数2,…参数n]);

返回值:数组的新长度

1
2
3
4
var arr = [6,7,8,9]; 
var len = arr.push(666,777);

console.log(arr,len);

pop

功能:尾删

参数:无参

返回值:被删除的元素

1
2
3
4
5
6
7
8
9
var arr = [6,7,8,4,9]; 
var x = arr.pop();

console.log(x);

x = arr.pop();

console.log(x);
console.log(arr);

unshift

功能:头插

参数:unshift(参数1,[参数2,…参数n]);

返回值:新数组的长度

1
2
3
4
5
6
var arr = [1,2,3,4,5]; 

var x = arr.unshift(9,8);

console.log(arr);
console.log(x);

shift

功能:头删

参数:无参

返回值:被删除的元素

1
2
3
4
5
var arr = [1,2,3,4,5]; 
var x = arr.shift();

console.log(arr);
console.log(x);

splice

功能:删除数组的元素,或添加新元素

参数:splice(起始位置,偏移量,[新添加的元素1,元素2…]);

返回值:被删除的元素

1
2
3
4
var arr = [6,5,4,8,9,3,0]; 
var arr1 = arr.splice(2,3,9,"heihei");

console.log(arr); console.log(arr1)

join

功能:将数组按照分隔符转换为字符串

参数:join([分隔符]):省略参数分隔符默认为逗号

返回值:字符串

1
2
3
4
var arr = [1,2,3,4,5,6]; 
var str = arr.join("heihei");

console.log(typeof str); console.log(str);

slice

功能:数组的部分截取

参数:slice(起始位置,结束位置):左闭右开;

返回值:截取的数组元素

1
2
3
4
var arr = [4,5,6,7,8,2,9]; 
var arr1 = arr.slice(2,4);

console.log(arr1);

concat

功能:拼接数组

参数:concat(数组)

返回值:拼接后的数组

1
2
3
4
5
var arr1 = [1,2,3]; 
var arr2 = [4,5,6];
var arr3 = arr1.concat(arr2);

console.log(arr3,arr1,arr2);

reverse

功能:逆序

参数:无

返回值:无

注意事项:会改变原数组

1
2
3
4
var arr = [1,2,3,4,5,6]; 
arr.reverse();

console.log(arr);

sort

功能:方法用于对数组的元素进行排序,默认按字符编码的顺序进行排序

1
2
3
4
var arr = [6,5,7,4,8,9,3,0,11]; 
arr.sort;

console.log(arr);

JS没有多维数组,所谓的多维数组,实际就是通过一维数组嵌套实现的

1
2
3
4
5
6
7
8
9
10
11
12
var arr = [
   [1, 2, 3], //arr[0][0]
   [4, 5, 6, 7], //arr[1]
   [8, 9], //arr[2]
];
  // console.log(arr[2][1]);
for (var i = 0; i < arr.length; i++) {
   for (var j = 0; j < arr[i].length; j++) {
     document.write(arr[i] [j] + " ");
}
    document.write("<br>");
}

indexOf

功能:数组元素的查找

参数:indexOf(目标元素)

返回值:找到返回元素下标,找不到返回-1

1
2
3
var arr = [6, 5, 4, 7, 8, 3, 6]; 

console.log(arr.indexOf(6));

数组三个迭代函数

forEach

功能:遍历(迭代)整个数组,执行某种功能

参数:forEach(回调函数)

function fun(当前数组元素的值,[数组元素的下标,数组名]){

}

返回值:无

1
2
3
4
5
6
7
8
9
10
11
function fun(x, index, a) {
   // console.log(x, index, a);
   a[index] += 10;
   console.log(a[index]);
}
var arr = [6, 5, 7, 8, 4, 9];
 // 原理
for (var i = 0; i < arr.length; i++) {
     fun(arr[i], i, arr);
}
arr.forEach(fun);

map

功能:遍历(迭代)整个数组,执行某种功能

参数:map(回调函数)

function fun(当前数组元素的值,[数组元素的下标,数组名]){

}

返回值:回调函数return的数据组成的新数组

1
2
3
4
5
6
7
8
function fun(x, index, a) {
  // console.log(x, index, a);
  a[index] += 10;
  return a[index];
}
var arr = [6, 5, 7, 8, 4, 9];
var arr1 = arr.map(fun);
console.log(arr1);

filter

功能:过滤,根据回调函数的return的布尔值,决定是否过滤该元素

参数:filter(回调函数)

function fun (当前数组元素的值,[数组元素的下标,数组名]){

}jl

返回值:根据回调函数return的布尔值,组成的新数组

1
2
3
4
5
6
7
8
9
10
function fun(x, index, a) {
   if (x % 2 == 1) {
       return true;
} else {
       return false;
}
}
var arr = [6, 5, 7, 8, 4, 9];
var arr1 = arr.filter(fun);
console.log(arr1);

array.at() 方法

array.at(index) 访问index参数处的元素

如果index参数是一个正整数>= 0,该方法返回该索引处的项目

1
2
3
4
const fruits = ['orange', 'apple', 'banana', 'grape'];

const item = fruits.at(1);
item; // => 'apple'

如果index参数大于或等于数组长度,则与常规访问器一样,该方法返回undefined:

1
2
3
4
const fruits = ['orange', 'apple', 'banana', 'grape'];

const item = fruits.at(999);
item; // => undefined

当你对array.at()方法使用负下标时,将从数组的末尾访问元素。

1
2
const lastItem = fruits.at(-1);
lastItem; // => 'grape'

数组去重:

1
2
3
4
5
6
7
8
var arr = [6, 6, 5, 3, 2, 2, 3, 4, 1, 2, 3];
var arr1 = [];
for (var i = 0; i < arr.length; i++) {
   if (arr1.indexOf(arr[i]) == -1) {
       arr1.push(arr[i]);
  }
}
console.log(arr1);

json对象:

是描述数据的一种格式,将若干个繁杂的属性和函数封装成一个整体。

a.定义,通过键值对实现定义,每组键值对用逗号隔开

1
2
3
4
var json = {
key1:value1,
key2:value2...
};

建议json的key加上双引号

1
2
3
4
5
6
7
8
9
10
11
12
13
var stu = {
"name":"",
"age":18,
"gender":'M',
"study": function() {
console.log("study");
},
"eat": function() {
console.log("eat");
}
}
console.log(stu);

b.属性的访问

1,通过点访问

1
2
3
4
5
6

stu.name = "";

console.log(stu.name,stu.age,stu.gender);
stu.eat();
stu.study();

2,通过下标访问

1
2
3
4
var str = "age";
console.log(stu["name"], stu[str], stu["gender"]);
stu["eat"]();
stu["study"]();

c.添加自定义属性

对象.新属性名=属性值;

1
2
stu.tall = "180";
console.log(stu.tall);

d.自己的函数访问其他的成员属性,需要加前缀this

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var stu = {
"name":"",
"age":18,
"gender":"M",
"study": function() {
console.log("study");
},
"eat": function() {
console,log("eat");
},
"showValue": function() {
//this暂时可以理解为是调用该方法的对象
console.log(this.name, this.age, this.gender);
this.study();
this.eat();
}
}
stu.showValue();

e.遍历json对象(通常被遍历的json对象是没有函数的)

1
2
3
4
5
6
7
8
9
10
11
12
var stu = {
"name":"",
"age":18,
"gender": 'M'
}

for(var index in json对象){
循环体
}

for (var index in stu) {
console.log(index);

for…in中不能用点

1
2
3
4
console.log(stu.index);

console.log(stu[index]);
}

字符串的创建

1.构造函数:引用类型

1
2
var str1 = new String("hello lao wang");
console.log(typeof str1);

2,字面量:内置基本类型

1
2
var str2 = "hello lao wang";
console.log(typeof str2);

字符串常见API及调用

charAt(下标):返回下标对应的字符

1
console.log(str.charAt(1));

charCodeAt(下标):返回下标对应的字符的asc码值

length: 表示字符串的长度

fromCharcode

功能:将asc码值转换为字符返回

参数:fromCharCode(asc码值1,[值2…])

返回值:asc码值对应的字符串

注意事项:该方法是直接通过String类型调用的

1
2
3
4
5
6
7
console.log(String.fromCharCode(97, 98));
indexOf("abc") 查找字符串第一次出现的位置
var str = "helloworld";
console.log(str.indexOf('l'));
lastIndexOf("abc") 查找字符串最后一次出现的位置 如果没找到 返回 -1
var str = "helloworld";
console.log(str.lastIndexOf('l'));

replace

功能:用参数2,替换参数1

参数:replace(目标字符串,替换字符串)

返回值:替换过后的字符串

1
2
3
var str = "duxingyu de ge bi shi duxingyu";
str = str.replace("duxingyu", "laowang");
console.log(str);

slice

功能:截取字符串:左闭右开

参数 slice(start,end): 支持负数

substring

功能:截取字符串:左闭右开

参数:substring (start,end)

split

功能:按照字符分割,转成一个数组

参数:split(分隔符)

返回值:通过分隔符拆分的字符串数组

1
2
3
var str = "wo de ge bi shi dilireba";
var arr = str.split(" ");
console.log(arr);

字符串大小写转换

1
2
3
console.log("HeiHei".toLowerCase());

console.log("HeiHei".toUpperCase());

json字符串转json对象

1
2
3
4
 var str = '{"name":"老王","age":18}';
 var json = JSON.parse(str);
 console.log(json);
 console.log(json.name, json.age);

json对象转json字符串

1
2
3
4
5
var json = {
    "name": "老王",
    "age": 18
};
var str = JSON.stringify(json);

对象转化为数组的三种方法:

Object.keys(obj) —–根据对象的键形成的数组(常用)

Object.entries(obj) —- 根据对象的键值对形成的数组

Object.values(obj)—-根据对象的值形成的数组

注意点:Object开头字母要大写