导图社区 编程基础9:JavaScript基础语法-2
如果函数中还有函数,那么在这个作用域中就又可以诞生一个作用域;根据在 [内部函数可以访问外部函数变量] 的这种机制,用链式查找决定哪些数据能被内部函数访问,就称作 作用域链。
编辑于2022-12-01 20:11:13 四川省JavaScript基础语法-2
1:数组
一组数据的集合
每个数据被称作 元素
在数组中可以 存放任意类型的元素
创建数组
利用 new 创建数组
var 数组名 = new Array() ; var arr = new Array(); // 创建一个新的空数组
利用数组字面量创建数组
var 数组名 = [];
获取数组中的元素
索引 (下标) :用来访问数组元素的序号(数组下标从 0 开始)
数组可以通过索引来访问、设置、修改对应的数组元素
遍历数组
var arr = ['red','green', 'blue']; for(var i = 0; i < arr.length; i++){ console.log(arrStus[i]); }
数组的长度
数组名.length
数组元素的数量(数组长度)
数组中新增元素
数组[ 数组.length ] = 新数据;
2:函数
函数的概念
封装了一段可被重复调用执行的代码块
实现大量代码的重复使用
函数的使用
声明函数
自定义函数方式(命名函数)
function 函数名() {}
函数表达式方式(匿名函数)
var fn = function(){...};
function 是声明函数的关键字,必须小写
调用函数
// 调用函数 函数名(); // 通过调用函数名来执行函数体代码
声明函数本身并不会执行代码,只有调用函数时才会执行函数体代码
函数的参数
形参
形式上的参数 函数定义的时候传递的参数当前并不知道是什么
实参
实际上的参数 函数调用的时候传递的参数实参是传递给形参的
// 带参数的函数声明 function 函数名(形参1, 形参2 , 形参3...) { // 可以定义任意多的参数,用逗号分隔 // 函数体 } // 带参数的函数调用 函数名(实参1, 实参2, 实参3...);
函数可以带参数也可以不带参数
声明函数的时候,函数名括号里面的是形参,形参的默认值为 undefined
调用函数的时候,函数名括号里面的是实参
多个参数中间用逗号分隔
形参的个数可以和实参个数不匹配,但是结果不可预计,我们尽量要匹配
函数的返回值
return 语句
函数执行完成后可以通过return语句将指定数据返回
function 函数名(){ ... return 需要返回的值; }
在使用 return 语句时,函数会停止执行,并返回指定的值
如果函数没有 return ,返回的值是 undefined
arguments的使用
当不确定有多少个参数传递的时候,可以用 arguments 来获取
arguments 是当前函数的一个内置对象,存储了传递的所有实参
arguments 是一个伪数组,可以进行遍历
具有 length 属性
3:作用域
作用域概述
起作用的区域
JavaScript(es6前)中的作用域有两种
全局作用域
局部作用域(函数作用域)
全局作用域
作用于所有代码执行的环境(整个 script 标签内部)或者一个独立的 js 文件。
局部作用域
作用于函数内的代码环境,就是局部作用域。 因为跟函数有关系,所以也称为函数作用域。
变量的作用域
全局变量
在全局作用域下声明的变量叫做全局变量
全局变量在代码的任何位置都可以使用
在全局作用域下 var 声明的变量 是全局变量
特殊情况下,在函数内不使用 var 声明的变量也是全局变量(不建议使用)
局部变量
在局部作用域下声明的变量叫做局部变量
局部变量只能在该函数内部使用
在函数内部 var 声明的变量是局部变量
函数的形参实际上就是局部变量
全局变量和局部变量的区别
全局变量:在任何一个地方都可以使用,只有在浏览器关闭时才会被销毁,因此比较占内存
局部变量:只在函数内部使用,当其所在的代码块被执行时,会被初始化;当代码块运行结束后,就会被销毁,因此更节省内存空间
作用域链
如果函数中还有函数,那么在这个作用域中就又可以诞生一个作用域;根据在 [内部函数可以访问外部函数变量] 的这种机制,用链式查找决定哪些数据能被内部函数访问,就称作 作用域链
作用域链:采取就近原则的方式来查找变量最终的值。
4:预解析
概念
JavaScript 解析器在运行 JavaScript 代码的时候分为两步:预解析和代码执行。
预解析会把变量和函数的声明在代码执行之前执行完成
预解析:在当前作用域下, JS 代码执行之前,浏览器会默认把带有 var 和 function 声明的变量在内存中进行提前声明或者定义。
代码执行: 从上到下执行JS语句。
变量预解析
预解析也叫做变量、函数提升
声明会被提升到当前作用域的最上面,变量的赋值不会提升
函数预解析
函数的声明会被提升到当前作用域的最上面,但是不会调用函数
函数声明代表函数整体,所以函数提升后,函数名代表整个函数,但是函数并没有被调用
5:对象
概念
对象是一组无序的相关属性和方法的集合,所有的事物都是对象
对象是由属性和方法组成的。
属性:事物的特征,在对象中用属性来表示(常用名词)
方法:事物的行为,在对象中用方法来表示(常用动词)
创建对象的三种方式
使用对象字面量创建对象
{属性名:属性值,方法名:方法体}
var star = { name : 'pink', age : 18, sex : '男', sayHi : function(){ alert('大家好啊~'); } };
利用 new Object 创建对象
var andy = new Object();
Object() :第一个字母大写
构造函数创建对象
是一种特殊的函数,主要用来初始化对象,即为对象成员变量赋初始值,它总与 new 运算符一起使用
function 构造函数名(形参1,形参2,形参3) { this.属性名1 = 参数1; this.属性名2 = 参数2; this.属性名3 = 参数3; this.方法名 = 函数体; }
构造函数的调用格式 : var obj = new 构造函数名(实参1,实参2,实参3)
构造函数中 不需要 return 返回结果
必须用 new 来调用构造函数
new关键字的作用
1. 在构造函数代码开始执行之前,创建一个空对象;
2. 修改this的指向,把this指向创建出来的空对象;
3. 执行函数的代码
4. 在函数完成之后,返回this---即创建出来的对象
对象的使用
对象中存储 “具体数据" 的 "键值对"中的 "键"称为对象的属性,即对象中存储具体数据的项
对象中存储 函数 的 "键值对"中的 "键"称为对象的方法,即对象中存储函数的项
对象里面的属性调用 : 对象.属性名
对象里面属性的另一种调用方式 : 对象[‘属性名’],注意方括号里面的属性必须加引号
对象里面的方法调用:对象.方法名()
遍历对象
for...in 语句用于对数组或者对象的属性进行循环操作。
for (变量 in 对象名字) { // 在此执行代码 }
6:内置对象
概念
JavaScript 中的对象分为3种:自定义对象 、内置对象、 浏览器对象
JS 语言自带的一些对象,提供了一些常用的或是最基本而必要的功能
查文档
MDN: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects
w3school: https://www.w3school.com.cn/jsref/index.asp
Math对象
Math 对象不是构造函数,它拥有一些数学常数属性和数学函数方法
Math. Pl 圆周率
Math.floor() 向下取整
Math. ceil() 向上取整
Math. round() 四舍五入版就近取整注意-3.5结果是-3
Math. abs() 绝对值
Math.max() / Math. min() 求最大和最小值
Math. random 获取范围在[0,1)内的随机值
日期对象
需要自行创建实例对象
new Date(); new Date(value); new Date(dateString); new Date(year, monthIndex [, day [, hours [, minutes [, seconds [, milliseconds]]]]]);
getFullYear() 获取当年
getMonth() 获取当月(0-11)
getDate() 获取当天日期
getDay() 获取星期几(周日0到周六6)
getHours() 获取当前小时
getMinutes() 获取当前分钟
getSeconds() 获取当前秒钟
数组对象
push(参数) 末尾添加一个或多个元素,注意修改原数组 并返回新的长度
pop() 删除数组最后一个元素,把数组长度减1无参数、修改原数 返回它删除的元素的值
unshift(参数1)向数组的开头添加一个或更多元素,注意修改原数组 并返回新的长度
shift() 删除数组的第一个元素,数组长度减1无参数、修改原数组 并返回第一个元素的值
reverse() 颠倒数组中元素的顺序无参数,会改变原来的数组,返回新数组
sort() 对数组的元素进行排序,会改变原来的数组,返回新数组
indexof() 数组中查找给定元素的第一个索引,如果存在返回索引号,如果不存在,则返回-1
lastIndexof() 在数组中的最后一个的索引,如果存在返回索引号,如果不存在,则返回-1
tostring() 把数组转换成字符串,逗号分隔;返回一个字符串
join(分隔符) 用于把数组中的所有元素转换为一个字符串;返回一个字符串
concat() 连接两个或多个数组,不影响原数组;返回一个新的数组
slice(begin,end) 数组截取 返回被截取项目的新数组
splice(开始下标,要删除个数) 数组删除,返回被删除项目的新数组;会影响原数组
filter() 方法创建一个新数组, 其包含通过所提供函数实现的测试的所有元素
forEach() 方法对数组的每个元素执行一次给定的函数。
字符串对象
indexof() 字符串中查找给定字符的索引,如果存在返回索引号,如果不存在,则返回-1
lastIndexof() 从后往前找,只找第一个匹配的
charAt(index) 返回指定位置的字符 (index字符串的索引号)
charCodeAt(index) 获取指定位置处字符的Ascii码(index索引号)
str[index] 获取指定位置处字符
concat(str1,str 2,str3...) 用于连接两个或多个字符串。拼接字符串,等效于+
substr(start,length) star位置开始(索引号), length取的个数
slice(start, end) 从 start位置开始,截取到end位置,end取不到(他们俩都是索引号)
substring(start, end) 从 start位置开始,截取到end位置,end取不到;基本和slice相同但是不接受负值
replace(被替换的字符串, 要替换为的字符串) 用于在字符串中用一些字符替换另一些字符
split(“分隔符”) 用于切分字符串,将字符串切分为数组
7:简单数据类型和复杂数据类型
简单类型(基本数据类型、值类型)
在存储时变量中存储的是值本身
包括string ,number,boolean,undefined,null
复杂数据类型(引用类型)
变量中存储的仅仅是地址(引用)
Object、Array、Date等
堆栈
栈(操作系统)
由操作系统自动分配释放存放函数的参数值、局部变量的值等。
其操作方式类似于数据结构中的栈;
简单数据类型存放到栈里面
堆(操作系统)
存储复杂类型(对象),一般由程序员分配释放,若程序员不释放,由垃圾回收机制回收。
简单数据类型的存储方式:值类型变量的数据直接存放在变量(栈空间)中
复杂数据类型的存储方式
引用类型变量(栈空间)里存放的是地址,真正的对象实例存放在堆空间中
类型传参
简单类型传参
值类型变量作为参数传给函数的形参时,其实是把变量在栈空间里的值复制了一份给形参
在方法内部对形参做任何修改,都不会影响到的外部变量
操作自己拿到的 数据值 本身
复杂数据类型传参
引用类型变量传给形参时,其实是把变量在栈空间里保存的堆地址复制给了形参
形参和实参其实保存的是同一个堆地址,所以操作的是同一个数据
操作 相同空间中 的数据