JavaScript学习之基础第二部分

1、数组

在这里插入图片描述
在这里插入图片描述
注意:数组中可以存放任意类型的数据,例如字符串,数组,布尔值等。
获取数组元素:格式如下:数组名[索引下标] ,下标一样是从0开始的,和Java中一样。
获取数组长度:数组名.length
JavaScript中修改数组长度可以直接修改length值做到。

2、JavaScript函数

2.1 声明函数

// 声明函数
function 函数名() {
 //函数体代码
}

 function 是声明函数的关键字,必须小写
 由于函数一般是为了实现某个功能才定义的, 所以通常我们将函数名命名为动词,比如 getSum
2.2 调用函数

// 调用函数
函数名(); // 通过调用函数名来执行函数体代码

 调用的时候千万不要忘记添加小括号
 口诀:函数不调用,自己不执行。
注意:声明函数本身并不会执行代码,只有调用函数时才会执行函数体代码。
2.3 函数的封装
 函数的封装是把一个或者多个功能通过函数的方式封装起来,对外只提供一个简单的函数接口
 简单理解:封装类似于将电脑配件整合组装到机箱中 ( 类似快递打包)
3.3 函数形参和实参个数不匹配问题
在这里插入图片描述
注意:在JavaScript中,形参的默认值是undefined。
3.4 小结
 函数可以带参数也可以不带参数
 声明函数的时候,函数名括号里面的是形参,形参的默认值为 undefined
 调用函数的时候,函数名括号里面的是实参
 多个参数中间用逗号分隔
 形参的个数可以和实参个数不匹配,但是结果不可预计,我们尽量要匹配

4. 函数的返回值

4.1 return 语句
有的时候,我们会希望函数将值返回给调用者,此时通过使用 return 语句就可以实现。
return 语句的语法格式如下:

// 声明函数
function 函数名(){
 ...
 return 需要返回的值;
}
// 调用函数
函数名(); // 此时调用函数就可以得到函数体内return 后面的值

 在使用 return 语句时,函数会停止执行,并返回指定的值
 如果函数没有 return ,返回的值是 undefined
有的时候,我们会希望函数将值返回给调用者,此时通过使用 return 语句就可以实现。
例如,声明了一个sum()函数,该函数的返回值为666,其代码如下:

// 声明函数
function sum(){
 ...
 return 666}
// 调用函数
sum(); // 此时 sum 的值就等于666,因为 return 语句会把自身后面的值返回给调用者

4.2 return 终止函数
return 语句之后的代码不被执行。
4.3 return 的返回值
return 只能返回一个值。如果用逗号隔开多个值,以最后一个为准

function add(num1,num2){
 //函数体
 return num1,num2;
}
var resNum = add(21,6); // 调用函数,传入两个实参,并通过 resNum 接收函数返回值
alert(resNum); // 6

4.4 函数没有 return 返回 undefined
函数都是有返回值的

  1. 如果有return 则返回 return 后面的值
  2. 如果没有return 则返回 undefined

5、arguments的使用

当我们不确定有多少个参数传递的时候,可以用 arguments 来获取。在 JavaScript 中,arguments 实际上它是当前函数的一个内置对象。所有函数都内置了一个 arguments 对象,arguments 对象中存储了传递的所有实参。 arguments展示形式是一个伪数组,因此可以进行遍历。伪数组具有以下特点:
 具有 length 属性
 按索引方式储存数据
 不具有数组的 push , pop 等方法
案例:利用函数求任意个数的最大值:

function maxValue() {
	 var max = arguments[0];//即取所有传过来的形参中的第一个形参值
	 //如果直接输出arguments,则会输出所有形参值,以数组形式
	 for (var i = 0; i < arguments.length; i++) {
	 if (max < arguments[i]) {
	 max = arguments[i];
		 }
	 }
	 return max;
}
 console.log(maxValue(2, 4, 5, 9));
 console.log(maxValue(12, 4, 9));

7. 函数的两种声明方式

  1. 自定义函数方式(命名函数)
    利用函数关键字 function 自定义函数方式。
// 声明定义方式
function fn() {...}
// 调用 
fn();

 因为有名字,所以也被称为命名函数
 调用函数的代码既可以放到声明函数的前面,也可以放在声明函数的后面
2. 函数表达式方式(匿名函数)
利用函数表达式方式的写法如下:

// 这是函数表达式写法,匿名函数后面跟分号结束
var fn = function(){...}// 调用的方式,函数调用必须写到函数体下面
fn();

 因为函数没有名字,所以也被称为匿名函数
 这个fn 里面存储的是一个函数
 函数表达式方式原理跟声明变量方式是一致的
 函数调用的代码必须写到函数体后面

JavaScript作用域

啥是作用域?
就是代码名字在某个范围内起作用和效果。
目的是为了提高程序的可靠性,更重要的是减少命名冲突。

js的作用域(ES6之前版本,ES6我们后面会讲):分为全局作用域和局部作用域。
全局作用域:在整个<script>标签中,或者是一个单独的js文件中,无论哪里都能使用即在全局范围内都能起作用。
局部作用域(函数作用域):在函数内部就是局部作用域,这个代码的名字只在函数内部起作用和效果。

另外现阶段我们的JS中没有块级作用域概念,因为我们现在使用的是ES5的规范,在学习了ES6之后才会产生块级作用域。

作用域链

内部函数访问外部函数的变量,采取的是链式查找的方式来决定取哪个值,这种结构我们称为作用域链。
在这里插入图片描述

JavaScript预解析

JavaScript代码是由浏览器中的JavaScript解析器来执行的。JavaScript解析器在运行JavaScript代码的时候分两步:预解析和代码执行。

预解析:js引擎会把js里面所有的var 还有 function提升到当前作用域的最前面,然后再代码执行,按照代码书写的顺序从上往下执行。

预解析又分为 变量预解析(变量提升) 和函数预解析(函数提升)

先来解释变量提升:就是把所有的变量声明提升到当前的作用域最前面,但是要注意,并不执行赋值操作。
然后是函数提升,就是把所有的函数声明提升到当前作用域的最前面,但是注意并不调用函数。

JavaScript对象

这概念和Java一样的,就不多解释了。

2. 创建对象的三种方式

在 JavaScript 中,现阶段我们可以采用三种方式创建对象(object):
 利用字面量创建对象
 利用 new Object 创建对象
 利用构造函数创建对象

2.1 利用字面量创建对象

对象字面量:就是花括号 { } 里面包含了表达这个具体事物(对象)的属性和方法。
{ } 里面采取键值对的形式表示
 键:相当于属性名
 值:相当于属性值,可以是任意类型的值(数字类型、字符串类型、布尔类型,函数类型等)

var star = {
 name : 'pink',
 age : 18,
 sex : '男',
 sayHi : function(){
 alert('大家好啊~');
 }
};

对象的调用:
 对象里面的属性调用 : 对象.属性名 ,这个小点 . 就理解为“ 的 ”
 对象里面属性的另一种调用方式 : 对象[‘属性名’],注意方括号里面的属性必须加引号,我们后面会用
 对象里面的方法调用:对象.方法名() ,注意这个方法名字后面一定加括号

console.log(star.name) // 调用名字属性
console.log(star['name']) // 调用名字属性
star.sayHi(); // 调用 sayHi 方法,注意,一定不要忘记带后面的括号

变量、属性、函数、方法总结:
 变量:单独声明赋值,单独存在
 属性:对象里面的变量称为属性,不需要声明,用来描述该对象的特征
 函数:单独存在的,通过“函数名()”的方式就可以调用
 方法:对象里面的函数称为方法,方法不需要声明,使用“对象.方法名()”的方式就可以调用,方法用来描述该对象的
行为和功能。

2.2 利用new Object创建对象

跟我们前面学的 new Array() 原理一致

var andy = new Obect();
andy.name = 'pink';
andy.age = 18;
andy.sex = '男';
andy.sayHi = function(){
 alert('大家好啊~');
}

 Object() :第一个字母大写
 new Object() :需要 new 关键字
 使用的格式:对象.属性 = 值;

2.3 利用构造函数创建对象

构造函数 :是一种特殊的函数,主要用来初始化对象,即为对象成员变量赋初始值,它总与 new 运算符一起使用。我们可以把对象中一些公共的属性和方法抽取出来,然后封装到这个函数里面。 在 js 中,使用构造函数要时要注意以下两点:
 构造函数用于创建某一类对象,其首字母要大写
 构造函数要和 new 一起使用才有意义

function Person(name, age, sex) {
 this.name = name;
 this.age = age;
 this.sex = sex;
 this.sayHi = function() {
 alert('我的名字叫:' + this.name + ',年龄:' + this.age + ',性别:' + this.sex);
 }
}
var bigbai = new Person('大白', 100, '男');
var smallbai = new Person('小白', 21, '男');
console.log(bigbai.name);
console.log(smallbai.name);

注意

  1. 构造函数约定首字母大写。
  2. 函数内的属性和方法前面需要添加 this ,表示当前对象的属性和方法。
  3. 构造函数中不需要 return 返回结果。
  4. 当我们创建对象的时候,必须用 new 来调用构造函数。

3. new关键字

  1. 在内存中创建一个新的空对象。
  2. 让 this 指向这个新的对象。
  3. 执行构造函数里面的代码,给这个新对象添加属性和方法。
  4. 返回这个新对象(所以构造函数里面不需要return)。

4. 遍历对象属性

for…in 语句用于对数组或者对象的属性进行循环操作。
其语法如下:

for (变量 in 对象名字) {
 // 在此执行代码
}

语法中的变量是自定义的,它需要符合命名规范,通常我们会将这个变量写为 k 或者 key。

for (var k in obj) {
 console.log(k); // 这里的 k 是属性名
 console.log(obj[k]); // 这里的 obj[k] 是属性值
}

小结

  1. 对象可以让代码结构更清晰
  2. 对象复杂数据类型object。
  3. 本质:对象就是一组无序的相关属性和方法的集合。
  4. 构造函数泛指某一大类,比如苹果,不管是红色苹果还是绿色苹果,都统称为苹果。
  5. 对象实例特指一个事物,比如这个苹果、正在给你们讲课的pink老师等。
  6. for…in 语句用于对对象的属性进行循环操作。

内置对象

JavaScript中的对象分为三种:自定义对象、内置对象、浏览器对象。
前面两种对象是JS基础内容,属于ECMAScript;第三个浏览器对象属于我们JS独有的,我们在JS API中讲解。
内置对象就是指JS语言自带的一些对象,这些对象供开发者使用,并提供了一些常用的或是最基本而必要的功能(属性和方法)。
内置对象最大的优点就是帮助我们快速开发。
JavaScript提供了多个内置对象:Math、Date、Array、String等。
(其实跟Java中的那些类库差不多)

查文档

在这里插入图片描述

Math对象

Math 对象不是构造函数,它具有数学常数和函数的属性和方法。跟数学相关的运算(求绝对值,取整、最大值等)可以使用 Math 中的成员。
在这里插入图片描述
注意:上面的方法必须带括号;

3.2 随机数方法 random()

random() 方法可以随机返回一个小数,其取值范围是 [0,1),左闭右开 0 <= x < 1
得到一个两数之间的随机整数,包括两个数在内

function getRandom(min, max) {
 return Math.floor(Math.random() * (max - min + 1)) + min; 
}

日期对象

4.1 Date 概述

 Date 对象和 Math 对象不一样,他是一个构造函数,所以我们需要实例化后才能使用
 Date 实例用来处理日期和时间

4.2 Date()方法的使用

获取当前时间必须实例化。

var now = new Date();
console.log(now);

Date() 构造函数的参数。
如果括号里面有时间,就返回参数里面的时间。例如日期格式字符串为‘2019-5-1’,可以写成new Date(‘2019-5-1’) 或 者 new Date(‘2019/5/1’)
 如果Date()不写参数,就返回当前时间
 如果Date()里面写参数,就返回括号里面输入的时间

4.3 日期格式化

我们想要 2019-8-8 8:8:8 格式的日期,要怎么办?
需要获取日期指定的部分,所以我们要手动的得到这种格式。
在这里插入图片描述

4.4 获取日期的总的毫秒形式

Date 对象是基于1970年1月1日(世界标准时间)起的毫秒数。
我们经常利用总的毫秒数来计算时间,因为它更精确。

// 实例化Date对象
var now = new Date();
// 1. 用于获取对象的原始值
console.log(date.valueOf())
console.log(date.getTime())
// 2. 简单写可以这么做
var now = + new Date();
// 3. HTML5中提供的方法,有兼容性问题
var now = Date.now();

数组对象

5.1 数组对象的创建

创建数组对象的两种方式
 字面量方式
 new Array()

5.2 检测是否为数组

 instanceof 运算符,可以判断一个对象是否属于某种类型
 Array.isArray()用于判断一个对象是否为数组,isArray() 是 HTML5 中提供的方法

var arr = [1, 23];
var obj = {};
console.log(arr instanceof Array); // true
console.log(obj instanceof Array); // false
console.log(Array.isArray(arr)); // true
console.log(Array.isArray(obj)); // false

5.3 添加删除数组元素的方法

在这里插入图片描述

5.4 数组排序

在这里插入图片描述

var arr = [1, 64, 9, 6];
arr.sort(function(a, b) {
 return b - a; // 降a序
 // return a - b; // 升序
});
console.log(arr);

5.5 数组索引方法

在这里插入图片描述

5.6 数组转换为字符串

在这里插入图片描述

5.7 课下查询

在这里插入图片描述
slice() 和 splice() 目的基本相同,建议同学们重点看下 splice()。

字符串对象

6.1 基本包装类型

为了方便操作基本数据类型,JavaScript 还提供了三个特殊的引用类型:String、Number和 Boolean。
基本包装类型就是把简单数据类型包装成为复杂数据类型,这样基本数据类型就有了属性和方法。

// 下面代码有什么问题?
var str = 'andy';
console.log(str.length);

按道理基本数据类型是没有属性和方法的,而对象才有属性和方法,但上面代码却可以执行,这是因为 js 会把基本数据类型包装为复杂数据类型,其执行过程如下 :

// 1. 生成临时变量,把简单类型包装为复杂数据类型
var temp = new String('andy');
// 2. 赋值给我们声明的字符变量
str = temp;
// 3. 销毁临时变量
temp = null;

6.2 字符串的不可变

指的是里面的值不可变,虽然看上去可以改变内容,但其实是地址变了,内存中新开辟了一个内存空间。

var str = 'abc';
str = 'hello';
// 当重新给 str 赋值的时候,常量'abc'不会被修改,依然在内存中
// 重新给字符串赋值,会重新在内存中开辟空间,这个特点就是字符串的不可变
// 由于字符串的不可变,在大量拼接字符串的时候会有效率问题
var str = '';
for (var i = 0; i < 100000; i++) {
 str += i;
}
console.log(str); // 这个结果需要花费大量时间来显示,因为需要不断的开辟新的空间

6.3 根据字符返回位置

字符串所有的方法,都不会修改字符串本身(字符串是不可变的),操作完成会返回一个新的字符串。
在这里插入图片描述

6.4 根据位置返回字符(重点)

在这里插入图片描述

6.5 字符串操作方法(重点)

在这里插入图片描述

6.6 replace()方法

replace() 方法用于在字符串中用一些字符替换另一些字符。
其使用格式如下:

replace(被替换的字符串, 要替换为的字符串)

6.7 split()方法

split()方法用于切分字符串,它可以将字符串切分为数组。在切分完毕之后,返回的是一个新数组。

var str = 'a,b,c,d';
console.log(str.split(',')); // 返回的是一个数组 [a, b, c, d]

简单数据类型和复杂数据类型

1.1介绍

简单类型又叫做基本数据类型或者值类型,复杂类型又叫做引用类型。
 值类型:简单数据类型/基本数据类型,在存储时变量中存储的是值本身,因此叫做值类型:string ,number,boolean,undefined,null
 引用类型:复杂数据类型,在存储时变量中存储的仅仅是地址(引用),因此叫做引用数据类型:通过 new 关键字创建的对象(系统对象、自定义对象),如 Object、Array、Date等

2.2 堆和栈

在这里插入图片描述

2.3简单类型的内存分配

在这里插入图片描述

2.4 复杂类型的内存分配

在这里插入图片描述

2.5 简单类型传参

函数的形参也可以看做是一个变量,当我们把一个值类型变量作为参数传给函数的形参时,其实是把变量在栈空间里的值复制了一份给形参,那么在方法内部对形参做任何修改,都不会影响到的外部变量。

function fn(a) {
 a++;
 console.log(a); 
}
var x = 10;
fn(x);
console.log(x)

2.6 复杂类型传参

函数的形参也可以看做是一个变量,当我们把引用类型变量传给形参时,其实是把变量在栈空间里保存的堆地址复制给了形参,形参和实参其实保存的是同一个堆地址,所以操作的是同一个对象。

function Person(name) {
 this.name = name;
}
function f1(x) { // x = p
 console.log(x.name); // 2. 这个输出什么 ? 
 x.name = "张学友";
 console.log(x.name); // 3. 这个输出什么 ? 
}
var p = new Person("刘德华");
console.log(p.name); // 1. 这个输出什么 ? 
f1(p);
console.log(p.name); // 4. 这个输出什么 ?

其实这个内容和Java中也差不多。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

在地球迷路的怪兽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值