文章目录
数组的概念:
数组是指一组数据的集合,其中的每个数据被称作元素,在数组中可以存放恩义类型的元素
创建数组:
js创建数组有两种方式:
//利用new创建数组
var arr=new Array();
//利用数组字面量创建数组
var array=[];
- 我们数组里面的数据一定用逗号隔开
- 数组中可以存放任意一种类型
获取数组元素:
- 索引:用来访问数组元素的序号(数组下标从0开始)
var array=[1,2,3,4];
console.log(array[0]) //1
console.log(array[4]) //没有这个数组元素,所以输出的结果是undefied
- 什么是遍历?
- 把数组中的元素从头到尾访问一次
- for里面的i是什么?当什么使用?for里面的数组元素怎么写?
- i是计数器,当索引号使用,arr[i]
求数组中的最大值:
var array=[2,6,1,77,52,25,7];
var max=array[0];
for(var i=1;i<array.length;i++){
if(array[i]<max){
max=array[i];
}
}
alert(max)
函数:
函数使用分为两步:
-
声明函数
-
function 函数名(){
//函数体
}
-
-
调用函数
- 函数名();
- function 声明函数的关键字 全部小写
- 函数是做某件事情,函数名一般是动词
- 函数不调用自己不执行
形参和实参:
- 在声明函数的小括号里面是 形参 (形式上的参数)
- function 函数名(形参1,形参2)
- 形参是接受实参的
- 在函数调用的小括号里面是 实参 (实际的参数)
- 函数名(实参1,实参2)
函数形参和实参个数不匹配问题:
- 实参个数等于形参个数 输出正确结果
- 实参个数多余形参个数 只取到形参的个数
- 实参个数小雨形参个数 多的形参定义为undefined,结果为NaN
return:
- return只能返回一个值,给多个值只返回最后一个值
- 返回多个值,可以用数组包含起来
我们的函数如果有return 则返回的是 return后面的值,如果函数没有 return则返回的是undefined
arguments:
-
只有函数才有arguments对象
-
里面存储了所有传递过来的实参
function fn(){
console.log(arguments);
}
fn(1,2,3);
//利用函数求任意个数的最大值
function fn(){
var aa = arguments[0];
for(var i=1;i<arguments.length;i++){
if(arguments[i]>aa){
aa=arguments[i]
}
}
return aa;
}
//8
alert( fn(1,5,7,8));
//20
alert(fn(1,8,9,3,20,5))
第二种函数声明方法:
- 匿名函数
- var 变量名 = function(){}
var fun=function(aru){
console.log(aru);
}
fun('666');
fun是变量名,不是函数名
函数表达式也可以进行传递参数
函数表达式声明方式跟声明变量差不多,只不过变量里面存的是值,而函数表达式里面存的是函数
作用域:
- js作用域:就是代码名字在某个范围内起作用和效果,目的是为了提高程序的可靠性
- 重要的是减少命名冲突
- 全局作用域:整个script标签 或者是一个单独的js文件
- 局部作用域,函数作用域,在函数内部就是局部作用域,代码的名字只在函数内部起效果和作用
全局变量:
- 在全局作用域中声明的变量
- 在函数中不用var 声明的变量:num=20;
局部变量:
- 在函数中使用var修饰的变量是局部变量
- 形参也是局部变量
- 全局变量:在任何一个地方都可以使用,只有在浏览器关闭才会被销毁,因此比较占内存
- 局部变量:只在函数内部使用,当其所在的代码块被执行时,会被初始化,当代码块运行结束后,就会被销毁,因此更节省内存空间
预解析:
我们js引擎运行js分为两步:预解析 代码执行
-
预解析: js引擎吧js里面所有的var 还有function提升到当前作用域的最前面
-
代码执行:按照代码书写的顺序从上往下执行
预解析分为:(函数提升)(变量提升)
- 变量预解析(变量提升)
- 变量提升 就是把所有的变量声明提升到当前的作用域最前面 不提升赋值操作
- 函数预解析(函数提升)
- 函数提升 就是把所有的函数声明提升到当前作用域的最前面 不调用函数
什么是对象:
js中,对象是一组无序的相关属性和方法的集合,所有的事物都是对象,例如:字符串,数值,数组,函数等
对象是由属性和方法组成的
创建对象(3种):
里面的属性或者方法我们采用键值对的形式 键 属性名:值 属性值
多个属性或者方法中间用逗号隔开的
方法冒号后面跟着是匿名函数
-
利用字面量创建对象{} var obj={ uname:'张三丰' sayHi:funtion(){ console.log('hi~'); } }
-
利用new Object 创建对象 var obj = new Object(); obj.uname = '张三丰'; obj.sayHi = funtion(){ console.log('hi~'); } 我们是利用 等号 = 赋值的方法 添加对象的属性和方法 每个属性和方法之间用 分号
-
我们一次创建一个对象,里面很多的属性和方法是大量相同的 我们只能赋值 因此我们可以利用函数的方法 重塑这些相同的代码 我们就把这个函数称为构造函数 又因为这个函数不一样 里面封装的不是普通代码 而是对象 构造函数 就是我们对象里面一些相同的属性和方法抽象出来封装到函数里面 构造函数语法格式: function 构造函数名(){ this.属性 = 值; this.方法 = function(){} } new 构造函数名(); 1.构造函数名字首字母要大写 2.构造函数不需要return 就可以返回结果 3.我们要用构造函数必须要new
function Star(uname,age,sex){ this.name = uname; this.age = age; this.sex = sex; } new Star('刘德华',18,'男'); ------ var idh=new Star('刘德华',18,'男');//返回的是一个对象 console.log(idh); console.log(idh.name);
使用对象:
- 调用对象的属性 我们采取 对象名.属性名
console.log(obj.uname);
- 调用属性还有一种方法 对象名[‘属性名’]
console.log(obj['uname']);
- 调用对象的方法 sayHi 对象名.方法名() 千万别忘记添加小括号
obj.sayHi();
变量 属性 函数 方法的区别:
- 变量和属性是相同的 他们都是用来存储数据的
- 变量 单独声明并赋值 使用的时候直接写变量名 单独存在
- 属性 在对象里面的不需要声明的 使用的时候必须是 对象.属性
var num = 10;
var obj = {
age:18,
fn:function(){
}
}
function fn(){
}
- 函数和方法的相同点 都是实现某种功能 做某件事
- 函数是单独声明 并且调用的 函数名() 单独存在的
- 方法 在对象里面 调用的时候 对象.方法()
- 对象:是一个具体的事物
- 构造函数:泛指的某一大类
- 我们利用构造函数创建出来的对象,称为对象的实例化
- 构造函数也可以创建对象
new 在指向时会做4件事:
- new构造函数可以在内存中创建了一个空的对象
- this就是指向刚才创建的空对象
- 执行构造函数里面的代码 给这个空对象添加属性和方法
- 返回这个对象
遍历对象:
for(变量 in 对象){}
var cu={
name:'zs',
sex:'男',
age:12
}
for(var a in cu){
alert(a) a变量 输出 得到的是 属性名
alert(cu[a]) cu[a] 得到是 属性值
}
内置对象:
js中的对象分为3中:自定义对象,内置对象,浏览器对象
内置对象:J就是指js语言自带的一些对象,这些对象供开发者使用,并提供了一些常用的或是基本而必要的功能
js中提供了多个内置对象:Math,Date,Array,String等
Math
数学对象,不是一个构造函数,所以我们不需要new 来调用,而是直接使用里面的属性和方法即可
console.log(Math.PI) //圆周率
console.log(Math.max(8,99,6)) //最大值
console.log(Math.random()) //[0 1) 随机数
Date:
var date=new Date();
常用写法,
var date=new Date(2019,10,1);
var date=new Date('2019-10-01 08:08:08');
//获取Date总毫秒(时间戳)
date.valueof()
date.getTime()
var date= +new Date();
//H5新增的
console.log(Date.now());不用new的,最简单
常用方法:
Array:
var arr1 = new Array(2); //这个2表示 数组的长度为2 里面有两个空数组元素
var arr1 = new Array(2,3); //等价于[2,3] 这样写表示 里面有两个数组元素,2和3
检测是否为数组:
//instanceof 运算符 他可以用来检测是否为数组
var arr= [];
var obj = {};
console.log(arr instanceof Array);//true
console.log(obj instanceof Array);//false
//(2)
console.log(Array.isArray(arr));//true
console.log(Array.isArray(obj));//false
添加删除数组元素方法:
.push() 在我们数组的末尾,添加一个或者多个数组元素
var arr = [1,2,3];
arr.push(4); //1,2,3,4
.unshift 在我们数组开头 添加一个或者多个数组元素
var arr = [1,2,3];
arr.unshift(4,5); //4,5,1,2,3
pop() 它可以删除数组最后一个元素
var arr = [1,2,3];
console.log(arr.pop()); //返回的是3,删除那个元素返回那个元素
//一次只能删除一个元素
//pop() 没有参数
shift() 它可以删除数组的第一个元素
var arr = [1,2,3];
console.log(arr.shift()); //返回的是1,删除那个元素返回那个元素
//一次只能删除一个元素
//pop() 没有参数
.reverse() 反转数组
var arr = [1,2,3];
arr.reverse();
console.log(arr);
.sort() 数组排序(冒泡排序)
var arr = [1,2,3];
arr.sort();
console.log(arr);
//降序
var arr = [1,2,9,8,7,5,3];
arr.sort(function (a,b){
return b-a;
});
console.log(arr);
数组索引方法:
.indexof() 从前往后找
.lastindexof() 从后往前找
//返回数组元素索婷号方法 indexof(数组元素) 作用就是返回该数组元素的索引号
//他只返回第一个满足条件的索引号
//没找到元素 直接返回-1
var arr = [1,2,3];
console.log(arr.indexof(2));
数组去重:
function aa(arr){
var arra=new Array();
for(var i=0;i<arr.length;i++){
if(arra.indexOf(arr[i])===-1){
arra.push(arr[i]);
}
}
return arra;
}
console.log(aa([8,8,9,7,5,6,2,8,6,6,5,1,8]));
数组转换为字符串:
toString() 将我们的数组转换为字符串
var arr = [1,2,3];
console.log(arr.toString());
join(分隔符)
var arr = [1,2,3];
console.log(arr.join('-'));
基本包装类型:
就是把 简单数据类型 包装成了 复杂数据类型
字符串:
charCodeAt(index) 返回相应索引号的字符ASCII值
str[index] 获取指定位置处字符
简单数据类型和内存分配:
-
简单数据类型的数据直接存放在变量(栈空间中)
-
简单数据类型直接存放栈里面,存放的是数值