目录
1、数组
1.1 什么是数组?
字符串、数值和布尔值都属于离散值。如果某个变量是离散的,它在任何时刻就只能有一个值。如果想用一个变量来存储一组值,就要使用数组。 ----《JavaScript+Dom编程艺术》
数组是由名字相同的多个值构成的的集合,集合中的每个数据被称作这个数组的元素,在数组中可以存放任意类型的元素。
js中数组是基于对象的,不会有数组越界的问题,当访问溢出时,不会报错,值是undefined;当写操作溢出时,也不报错,可以溢出写。
用代码解释:
var arr=[1,2,3]
console.log(arr[3]);//长度为3的数组中,第四位的值为undefined
arr[4]="一个这个数组中还没有的值";//给一个长度为3的数组的第五位赋值
console.log(arr)//此时数组长度变为5 [1, 2, 3, empty, "一个这个数组中还没有的值"]
1.2 创建数组
JS 中创建数组有两种方式(一般都使用数组字面量方式)
(1) 利用 new 创建数组
var 数组名 = new Array() ;
var arr = new Array(); // 创建一个新的空数组
var arr2=new Array();
arr2[0]=1;
arr2[1]=2;
arr2[2]=3
//注意:当new Array括号里只传一个参数时,此时这个参数是数组的长度,不是数组元素的值,所以只能是整数
var arr3=new Array(10);
console.log(arr3)// [empty × 10] 长度为10的空数组
var arr3=new Array(10.2);// 表示数组长度,不能为小数,Uncaught RangeError: Invalid array length
(2)利用数组字面量创建数组
//1. 使用数组字面量方式创建空的数组
var 数组名 = [];
//2. 使用数组字面量方式创建带初始值的数组
var 数组名 = ['佩奇','小黑',['莫蒂','瑞奇'],function fn(){alert("123")},true];
//注意: 数组的字面量是方括号 [ ]
//声明数组并赋值称为数组的初始化
//这种字面量方式也是我们以后最多使用的方式
例如:
var arrStus = ['小白',12,true,28.9];
new Array方法的具体步骤如下:
首先声明数组:在js中,数组要用关键字Array来声明,在声明数组时还可以指定数组长度如:
var stars=Array(4);//定义一个长度为4的数组stars
填充数组:向数组中添加元素的操作,包括给出新元素和指定新元素的位置,位置通过下标给出,例如stars[0]=Jolin;方括号中的0就是下标,这条语句意思是为stars数组的第一位添加一个"Jolin "元素。
数组中可以存放数值、字符串、布尔值、函数或者一个变量、另一个数组的元素甚至还可以存放其他的数组。
注意:数组里的函数调用是通过下标+()方式
存放另一个数组的话,我们要访问里面的数组就要使用“数组名[][]”这种形式。如下面的例子
var dance=new Array("Jolin","Jack")
var actor=new Array("杨紫",24,true,"邓伦","张一山","靳东");
var stars=new Array(3);
stars[0]=true; //可以是boolean
stars[1]=dance[0];//数组元素的值可以是另外一个数组的元素
stars[2]=actor; //数组元素可以是另一个数组
// 访问stars数组的第三个元素(存的是数组)的第一个元素
console.log(stars[2][0]); //结果是输出“杨紫”
关联数组:通过元素名字引用数组元素而不是下标,提高可读性
// 关联数组:
var person=new Array();
person["name"]="Danny";
person["sex"]="male";
person["age"]=18;
console.log(person["name"]);//相当于原来的 console.log(person[0])
1.3 获取数组中的元素
数组可以通过索引来访问、设置、修改对应的数组元素,我们可以通过“数组名[索引]”的形式来获取数组中的元素。
数组的索引------索引 (下标) :用来访问数组元素的序号(数组下标从 0 开始)注意:索引号从0开始,数组长度是元素个数
// 定义数组
var arrStus = ['fan',20,'02175052'];
// 获取数组中的第3个元素
alert(arrStus[2]); //网页弹出02175052
1.4 遍历数组
(1)数组元素遍历: 就是把数组中的每个元素从头到尾都访问一次,可以使用循环实现数组的遍历。
基本格式为:
var arr = ['red','green','skyblue','purple','gold','yellowgreen', 'blue'];
for(var i = 0; i < arr.length; i++){
console.log(arr[i]);
}
(2)获取数组长度
使用“数组名.length”可以访问数组元素的数量(数组长度)
var arr = ['red','green','skyblue','purple','gold','yellowgreen', 'blue'];
console.log(arr.length);//输出数组长度是7
当数组里面的元素个数发生了变化,这个 length 属性跟着一起变化。这个特点在之后数组筛选,反转等算法中会经常使用
1.5 数组中新增元素
js数组的length属性并不是只读的,还可以修改。
(1)通过修改 length 长度新增数组元素
可以通过修改 length 长度来实现数组扩容的目的 ,length 属性是可读写的。
var arr = ['red', 'green', 'blue', 'pink'];
arr.length = 7;//将数组长度变为7
console.log(arr);
console.log(arr[4]);//声明变量未给值,默认值就是 undefined。
console.log(arr[5]);//声明变量未给值,默认值就是 undefined。
console.log(arr[6]);//声明变量未给值,默认值就是 undefined。
(2)通过修改数组索引新增数组元素(这是我们最常用的一种方式,建议使用)
可以通过修改数组索引的方式追加数组元素。
var arr = ['red', 'green', 'blue', 'pink'];
arr[4] = 'skyblue';
console.log(arr);// ["red", "green", "blue", "pink", "skyblue"]
但是不能直接给数组名赋值,否则会覆盖掉以前的数据,例如:
var arr = ['red', 'green', 'blue', 'pink'];
arr= 'purple';
console.log(arr);//只输出["purple"]
1.6 数组案例
(1)筛选数组
要求:将数组[2, 0, 6, 1, 77, 0, 52, 0, 25, 7]中的 0 去掉后,形成一个不包含 0 的新数组。
- 需要一个新数组用于存放筛选之后的数据。
- 遍历原来的数组,把不是 0 的数据添加到新数组里面( 此时要注意采用数组名+索引的格式接收数据)。
- 新数组里面的个数,用 length 不断累加。
var arr = [2, 0, 6, 1, 77, 0, 52, 0, 25, 7];
var newArr = []; // 空数组的默认的长度为 0
// 定义一个变量 i 用来计算新数组的索引号
for (var i = 0; i < arr.length; i++) {
// 找出大于 10 的数
if (arr[i] != 0) {
// 给新数组
// 每次存入一个值,newArr长度都会 +1
newArr[newArr.length] = arr[i];
}
}
console.log(newArr);
要求:将数组 [2, 0, 6, 1, 77, 0, 52, 0, 25, 7] 中大于等于 10 的元素选出来,放入新数组。
var arr = [2, 0, 6, 1, 77, 0, 52, 0, 25, 7];
var newArr = [];
for (var i = 0; i < arr.length; i++) {
if (arr[i] >= 10) {
// 给新数组
newArr[newArr.length] = arr[i];
}
}
console.log(newArr);
(2)翻转数组
要求: 将数组 ['red','green','skyblue','purple','gold','yellowgreen', 'blue'] 的内容反过来存放,并输出。
可以通过reverse()方法或者使用for循环倒序输出。
var arr = ['red','green','skyblue','purple','gold','yellowgreen', 'blue'];
//使用reverse方法
arr.reverse();
console.log(arr);
//使用for循环
for(i=arr.length-1;i>=0;i--){
console.log(arr[i]);
}
结果如下:
(3)数组排序
冒泡排序:是一种算法,把一系列的数据按照一定的顺序进行排列显示(从小到大或从大到小)。
要求:使用冒泡排序将数组[27,32,16,0,19,34,2,7]按照从小到大顺序排列并输出。
var arr = [27,32,16,0,19,34,2,7];
for (var i = 0; i < arr.length - 1; i++) {
for (var j = 0; j < arr.length - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
var temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
console.log(arr);//[0, 2, 7, 16, 19, 27, 32, 34]
(4)数组去重
//知识点:indexOf()方法可返回某个指定的字符串值在字符串中首次出现的位置。如果要检索的字符串值没有出现,则该方法返回 -1。
var arr=[1,3,1,1,2,4,4,8];
function Unique(){
for(i=0;i<arr.length;i++){
var result=[];
for(var i=0;i<arr.length;i++){
if(result.indexOf(arr[i])==-1){
result.push(arr[i]);
}
}
return result;
}
}
console.log(Unique(arr));//[1, 3, 2, 4, 8]
2.对象
2.1 什么是对象?
在 JavaScript 中,对象是一种非常重要的数据类型,它是一组无序的相关属性和方法的集合,是一组数据或功能的集合。所有的事物都是对象,例如字符串、数值、数组、函数等。 对象是由属性和方法组成的。 使用对象可以使我们的表达结构更清晰,内容更丰富。
属性:事物的特征,隶属于某个对象的变量
方法:事物的行为,只有某个特定对象才能调用的方法
属性/变量 方法/函数的区别:
对象的属性 | 普通变量 |
对象的方法 | 函数 |
婚后 | 婚前 |
变量:单独声明并赋值,使用时直接用变量名,单独存在
属性:在对象里面的,不需要声明,使用时用 对象名.属性名
函数:单独声明并且调用;
方法:在对象里面,调用时用 对象名.方法名
对象与对象相似arrays
,除了对象不是通过索引来访问和修改其数据,而是通过所谓的访问对象中的数据properties
。
对象对于以结构化方式存储数据很有用,并且可以表示现实世界中的对象,例如猫。
这是一个示例猫对象:
var cat = {
"name": "Whiskers",
"legs": 4,
"tails": 1,
"enemies": ["Water", "Dogs"]
};
2.2 创建对象的三种方式
(1)利用字面量创建对象
var student = {
name : 'Lily',
age : 18,
sex : '女',
study: function(){
alert("学习javascript真有趣!");
}
};
对象的调用:
console.log(student.name) //对象里面的属性调用-----对象.属性名
console.log(student['name']) //对象里面的属性调用-----对象['属性名']
student.study(); //对象里面的方法调用------对象.方法名
(2)利用new Object创建对象(跟前面的 new Array() 原理一致)
格式:对象.属性 = 值;
var student = new Object();
student.name = 'pink'; //格式:对象.属性 = 值;
student.age = 18;
student.sex = '男';
student.study = function(){
alert("学习javascript真有趣!");
}
(3)利用构造函数创建对象
构造函数 :是一种特殊的函数,主要用来初始化对象,即为对象成员变量赋初始值,它总与 new 运算符一起使用。可以把对象中一些公共的属性和方法抽取出来,然后封装到这个函数里面。 在 js 中,使用构造函数要时要注意以下几点:
- 构造函数约定首字母大写。
- 函数内的属性和方法前面需要添加 this ,表示当前对象的属性和方法。
- 构造函数中不需要 return 返回结果。
- 当我们创建对象的时候,必须用 new 来调用构造函数。
function Person(name, age, sex) {
this.name = name;
this.age = age;
this.sex = sex;
this.study = function() {
alert('我的名字叫:' + this.name + ',年龄:' + this.age + ',性别:' + this.sex);
}
}
var Danny = new Person('Danny', 18, '男');//通过 new 关键字创建对象的过程我们也称为对象实例化
var Jenny = new Person('Jenny', 16, '女');
console.log(Danny.name);
console.log(Jenny.name);
练习:利用构造函数创建两个英雄对象。函数中的公共部分包括:姓名属性(name),类型属性(type),血量属性(blood)和攻击方式(attack)。 英雄对象的信息如下 : 廉颇 坦克 500血量 攻击 :近战 后羿 射手 100血量 攻击: 远程
function hero(name, type, blood) {
this.name = name;
this.type = type;
this.blood = blood;
this.play= function(play) {
console.log(play);
}
}
var lianpo = new hero('廉颇', '坦克',500);
var houyi= new hero('后裔', '射手',100);
lianpo.play("近战");
houyi.play("远战");
执行结果:
2.3 访问对象属性
对象的操作方法
JS 对象运算符
- In 判断左侧运算数是否为右侧运算数的成员;
- Instancesof 判断对相爱呢个实例是否属于某个类或构造函数
- New 根据构造函数创建一个新的对象,并初始化该对象
-
Delete 删除指定对象的属性,数组元素或变量
可以删除对象里的属性console.log(myObj); // 输出对象{name: "aaaa"}
delete myObj.age;
var myObj = {name: 'aaaa', age: 21};
-
.
及[]
存取对象和数组元素 -
()
函数调用,改变运算运算符优先级等;
下面是分享的《Javascript高级程序设计》的内容,讲的很明白。
下面是自己的总结:
有两种访问对象属性的方式:点表示法(.
)和方括号表示法([]
),类似于数组。当提前知道要访问的属性的名称时,便使用点
符号。一般建议使用"."表示法。
以下是使用点符号(.
)读取对象属性的示例:
var myObj = {
prop1: "val1",
prop2: "val2"
};
var prop1val = myObj.prop1; // val1
var prop2val = myObj.prop2; // val2
访问对象属性的第二种方法是括号表示法([]
)。如果要访问的对象的属性名称中有空格,则需要使用方括号表示法。
但是,我们仍然可以在不带空格的对象属性上使用方括号表示法。
以下是使用括号表示法读取对象属性的示例:
var myObj = {
"Space Name": "Kirk",
"More Space": "Spock",
"NoSpace": "USS Enterprise"
};
myObj["Space Name"]; // Kirk
myObj['More Space']; // Spock
myObj["NoSpace"]; // USS Enterprise
在对象上使用括号表示法的另一种用法是访问存储为变量值的属性。这对于迭代对象的属性或访问查找非常有用。
这是使用变量访问属性的示例:
var dogs = {
Fido: "Mutt", Hunter: "Doberman", Snoopie: "Beagle"
};
var myDog = "Hunter";
var myBreed = dogs[myDog];
console.log(myBreed); // "Doberman"
更新、修改、删除对象属性
创建JavaScript对象后,可以随时更新其属性,就像更新任何其他变量一样。可以使用点或括号表示法进行更新。
可以通过修改现有属性的方式向现有JavaScript对象添加新属性。这是我们将"bark"
属性添加到的方法ourDog
:ourDog.bark = "bow-wow";同样
可以使用点或括号表示法进行更新。
可以通过delete 对象.属性名,或者delete 对象[" 属性名"]方式删除对象属性。例如:delete ourDog.bark;
对象其他属性
- constructor:保存用于创建当前对象的函数,构造函数就是Object()
- HasOwnProperty(propertyName) 检测给定输定在当前对象实例中是否存在(而不是实例的原型中)
- isPrototypeOf(object) :检测传入的对象是否是另一个对象的原型(而不是在实例中);
- propertyIsEnumerable(propertyName);检测给定属性是否能用for-in语句每句来枚举;
- toLocaleString() 返回对象的字符串表示,该字符串与执行环境的地区对应;
- toString() 返回对象的字符串表示
- valueOf() 返回对象的字符串,数值或布尔值表示;通常与toString()的值相同;
在ECMAScript中,Object是所有对象的基础,因此所有对象都具有这些基本的属性和方法。
2.4 其他
(1)new关键字
new 在执行时会做四件事情:
- 在内存中创建一个新的空对象。
- 让 this 指向这个新的对象。
- 执行构造函数里面的代码,给这个新对象添加属性和方法。
- 返回这个新对象(所以构造函数里面不需要return)。
(2)遍历对象属性
for...in 语句用于对数组或者对象的属性进行循环操作。例如遍历上面Lianpo对象的属性。
for (i in Lianpo) {
console.log(i);
console.log(Lianpo[i]);
}
2.5 Array Math Date对象
js内建对象可以简单、快速的帮我们完成很多任务。这里介绍3个,注意首字母大写:Array Math Date
(1)数组
var dance=new Array();
(2)Math
Math.round()
四舍五入
注意:正数时,包含5是向上取整,负数时包含5是向下取整。
Math.abs()
获取绝对值Math.ceil() and Math.floor()
向上取整和向下取整Math.random()
取[0,1)的随机小数Math.max() and Max.min()
获取一组数据中的最大值和最小值Math.PI
获取圆周率π 的值
例子
console.log(Math.max(10,1,9,100,200,45,78));
console.log(Math.min(10,1,9,100,200,45,78));
return Math.floor(Math.random() * 10);//使用Math函数生成1-9之间随机数
(3)Date
没有参数时,默认输出当前时间。
var now=new Date();
console.log(now); //输出当前时间
参数常见的写法,数字型2020,07,09,20,20
有5个数字时,分别指定年、月、日、小时和分钟;
有4个数字时,分别指定年、月、日和小时;
3 个数字指定年、月和日;2个数字指定年份和月份;
具体可以看MDN文档的介绍。
字符串型2020-07-19
JavaScript 从 0 到 11 计算月份。一月是 0。十二月是11。
var now=new Date(2020,01,09);
//数字型返回下一月Sun Feb 09 2020 00:00:00 GMT+0800 (中国标准时间)
var now=new Date("2020-01-09");
//字符串型返回当前月Thu Jan 09 2020 08:00:00 GMT+0800 (中国标准时间)
2.6 js宿主对象
由Web浏览器预定义的对象成为宿主对象,可以通过这些对象获取关于网页上表单元素的信息。主要有Form、Image、Element等。