02-JavaSeript基础二
1.1 ( 函数概述
1.1.1 什么是函数
函数就是可以重复执行的代码块。
1.1.2 为什么要用函数
因为一部分代码使用次数可能会很多,所以封装起来,需要的时候调用就可以了。
案例:求和;(总是求和)
1.2 函数的定义
关键字function。
function 函数名(){
程序
}
1.3 参数
参与运算的变量。
为什么要设置参数?为了增强函数的功能性,和程序员的交互性,和函数的可拓展行。所以我们增加了参数这个概念。
1.3.1 形参
形式上参与运算的变量,无实际值,为实参占位置,就像一个躯壳一样。(可以理解为函数的内部变量外部无法访问)
1.3.2 实参
实际参与运算的变量。形参为他占位置,真实参与运算的变量。
1.4 返回值
有return函数就有值;没有return函数就没值;
函数程序运行后的结果外部需要使用的时候,我们不能直接给与,需要通过return返回。
总结:函数内部,return后面的值就是返回值;
作用:函数执行后剩下结果就是返回值。
函数执行完毕,会不会留下点儿什么,取决于有没有返回值
var temp = 函数名()=(功能)+该函数的返回值;
1.4.1注意
1.p果函数没有显示的使用return语句,那么函数有
默认的返回值:undefined
2.如果函数使用return语句,那么在return后面的值,
就成了函数的返回值
3. 如果函数使用 retun语句,但是return后面没有任何
值,那么函数的返回值 也是:undefined
4.函数使用return语句后,这个函数会在执行完 return 语句之后停止并立即退出,也就是说return后面的所有其他代码都不会再执行。
1.5案例
1.求圆的周长和面积a. Math.Pl
2.求2个数中的最大值,求3个数中的最大值
3.求一组数中的最大值和最小值
4. 翻转数组,返回一个新数组
5. 对数组排序,从小到大
6.求阶乘
7.求1!+2!+3!+....+n!(求阶乘的和)
8.判断一个数是否是素数(一个数字只能被1和自己整除)
1.6 函数名、函数体和函数加载问题
(重点记忆)
1.函数名是什么
函数名==整个函数。
function fn() alert(1);
console.log(fn) ==
console. log(function fn()falert(1)});
2. 函数加载问题
JS加载的时候,只加载函数名,不加载函数体。所以如果想使用内部的成员变量,需要调用函数。
1.7 作业:
1.求斐波那契数列Fibonacci中的第n个数是多少?
1 1 2 3 5 8 13 21.
2.输入某年某月某日,判断这一天是这一年的第几天?(闰年)
(四年一国,百年不国,四百年在闰)
1.8 函数定义
1.8.1 西数声明(自定义声明)
function f(a,b){
return a + b
console.log(f(5, 6))
1.8.2函数表达式
var myFun = function (a,b){
return a +b
console.log(myFun(6, 7));
1.8.3 通过创建对象声明函数
var f = new
Function("console.log(789)");
f();
1.9 变量和作用域(隐式全局变量和变量声明提升)
1.9.1变量和作用域(函数中的变量需要函数执行后才能使用)
1.全局变量(成员变量)
哪里都可以访问到的变量。(进入script立即定义的变量和没有var的变量)
2.局部变量
函数内部的变量,只有函数内部可以访问到。(函数内部用var定义的变量和形参)
1.9.2
隐式全局变
隐式全局变量就是隐藏的全局变量不好被发现。
function fn()f
// b和c就是隐式全局变量
var a =b
注意:
function fn()f
Var
a = b = C = 1;
// b和c就是隐式全局变量(等号)var a=1;b=2;c= 3;
// b和c就是隐式全局变量(分号)
var a=1 , b= 2, c= 3;
// b和c就不是隐式全局变量(逗号)
1.9.3 变量声明提升(出现原因:预解析)
函数中,定义变量在使用变量之后。
只提升变量名,不提升变量值,容易出现undefined计算后形成NaN。
/提前看一眼
这个习惯叫什么呢? 预解析!
变量声明提升:在预解析的时候,成员变量和
函数,被提升到最高位置,方便其他程序访问。
变量声明提升特点:成员变量只提升变量名,不提升变量值。但是,函数是所有内容全部提升。(function直接定义的)
函数范围内照样会出现变量声明提升
什么情况容易出现变量声明提升:使用变量在定义变量之前。
面试题:
var num = 10fun();
fun()
function fun() (
console.log(num);
var num = 20;
var a= 18;
f1(
function f1()f
var b=9
console.log(a);
console.log(b);
var a= '123';
}
f2();
console.log(CC);
console.log(bb);
console.log(aa);
function f2()(
var aa = bb = cc = 9console.log(aa);
console.log(bb);
console.log(CC);
1.10小知识
函数不调用不执行
函数名就等于(整个函数)
加载函数的时候,只加载函数名,不加载函数
体
参数相当于局部变量
就近原则使用变量
两个平级的函数中的变量不会相互影响(可以
使用同样的形参名)
2函数高级
2.1匿名西数(了解)
定义:匿名函数就是没有名字的函数。
作用:
1.不需要定义函数名的时候。
2.书写起来更简便。
匿名函数的调用有三种方法:1. 直接调用或自调用。(function()falert(1)8)()2.事件绑定。
3. 定时器。
2.2 函数是一种类型(了解)
2.3 函数作为参数(了解)
执行函数就等于:函数名+();整个函数+();
2.4 递归(理解)
递归:就是函数自己调用自己。(懂得)必须有跳出条件。
练习:
用递归求1-100的和
3对象和面向对象
3.1JS中的对象(Object )什么是对象?
var obj = new Object()
obj.属性名=值
obj.方法名 = function ()
3.2构造函数(就是为了创建对象实例)
可以创建对象实例的函数。
区别与普通函数,首字母大写。
function Student(name){ //创建一个构造函数
this.name = name; //构造函数中的对象指的是this.
this.sayHi = function()"(
console.log(this.name+"说:
大家好!");
3.3创建自定义对象
3.3.1 This
this只出现在函数中。
谁调用函数,this就指的是谁。
new People();
被创建的对象实例。
3.3.2 new
开辟内存空间,存储新创建的对象( new Object());把this设置为当前对象;
执行内部代码,设置对象属性和方法;返回新创建的对象。
3.4 对象字面量和JSON
对象的字面量就是一个行
而里面的属性和方法是以:形式对应表现的。
var arr = [];
var obj ={aaa:1113};
var json ={"aaa":111};
var obj = {
sayHi :function (){ console.log(1);
对象和数组也可以作为其他对象的属性
对象字面量定义方法和json很像,只有一点不同,json的key要求必须加";
3.5 json组成
JSON:JS中一种对象的表现形式
var json = {"aaa":1, "bbb":2
,"ccc":3, "ddd":4}
json由得和key:value以及逗号组成,三部分。(只有一个键值对key;value时,可以没有逗号)
对象本身没有length, 所以不能用for循环遍历
3.6 for...in...遍历JSON
var json ={'aaa":1, "bbb":
2,"ccc":3, "ddd":4}
for(var key in json){
//key代表aaa, bbb.....等
//json [key]代表1, 2, 3....等
// json. key代表json这个对象的key属性
的值,并不是kev对应的变量值的属性。
console.log(json.key);
/ /json[key], 代表的是json这个对象中key
这个变量值对应的属性值
console.log(ison [key]);
练习:制作一个json,然后遍历
3.7 参数和传值问题
简单类型数据做参数,函数内部对参数的修改不应影响外部变量简单类型传数值。
复杂类型数据做参数,函数内部对参数的修改会应影响外部变量复杂类型传地址。
JS中是没有类这个概念的,在新标准中,出现了类的概念,JS中是不能用函数创建对象的,强类型语言中需要用类.
内置对象:js本身已经帮我们写好的对象。我们创建出
来以后直接是使用就可以。不需要定义了
内置对象例如:Date , Array, Math, RegExp, Error, String...学习内置对象,主要学习API, H5的方法,后期学到H5在说。
4数组高级API
4.1学习API的方法
4.1.1 侧重点(四点)
调用者:谁调用的。
参数:有无,几个。
返回值:有无,什么类型。功能:干什么用的。
4.1.2自学方法
1.离线
离线文档
2.在线
a. W3C (前端标准W3CSchool)
b. CMON (开发者网站)MDN Web Docs
c.百度/谷歌/搜狗。。。
4.2Array的内置方法数组,JS中的一个内置对象
4.2.1判断数组和转换数组。instanceof:是一个关键字。
判断A是否是B类型.
布尔类型值 = A instanceof
Array.isArray()
HTML5中新增 判断是不是数组
布尔类型值 = Array.isArray(变量)
toString()
把数组转换成字符串,每一项用,分割字符串 = 数组.toString();
valueOf()
返回数组对象本身
数组本身= 数组.valueof();
join
根据每个字符把数组元素连起来变成字符串
字符串= 数组.join(变量);我还想吃?
变量可以有可以没有。不写默认用返号分隔,无缝连接用空字特串。
4.2.2数组增制和换位置(原数组将被修改)
push()
在数组最后面插入项,返回数组的长度
数组1改后的长度=数组1.push(元素1);
pop()
取出数组中的最后一项,返回最后一项
被删除的元素=数组1.pop()
unshift()
在数组最前面插入项,返回数组的长度
数组1改后的长度1)=数组1.unshift(元素
shift()
取出数组中的第一个元素,返回第一项
被删除的元素=数组1.shift();
reverse()
翻转数组(原数组讲呗反转,返回值也是被反转后的数组)
反转后的数组=数组1.reverse();
sort()
给数组排序,返回排序后的数组。如何排序看参数。
从小到大排序后的数组 = 数组
1.sort(function(a, b)f return a-b;
无参:按照数组元素的首字符对应的Unicode编码值从小到大排列数组元素。
带参:必须为函数(回调函数--callback)。
o 函数中带有两个参数,代表数组中的前后元素
o 如果计算后(a-b),返回值为负数,a排b前面。
O 等于0不动。
O 返回值为正数,a排6后面。
4.2.3了解方法
concat()
//把参数拼接到当前数组
新数组=数组1.concat(数组2);
slice() 1/从当前数组中截取一个新的数组,不影响原来的数组,参数start从0开始,end从1开始
新数组 = 数组1.slice(索引1,索引2);
splice()//删除或替换当前数组的某些项目,
参数start, deleteCount, options(要替换的项目)
新数组 =数组1.splice(起始索引,个数,替换内容);
indexof()、lastIndexOf() 1/0果没找到返回-1
索引值 = 数组indexof/lastIndexOf(数组中的元素);
//迭代方法 不会修改原数组
every()、filter()、forEach()、
map()、some()
数组/boolean/无 =数
组.every/filter/forEach/map/ some(function(element, index, arr)(1/程序和返回值;
//对数组中每一项运行以下函数,如果都返回true, every返回true,如果有一项返回false, 则停止遍历 every返回false;不写默认返回false
array.every(function(item, index, arr
//对数组中每一项运行以下函数,该函数返回结果是true的项组成的新数组
var arr=
array.filter(function(item, index, arr)));
console.log(arr);
//遍历数组
array.forEach(function(item, index, a rr)));
//对数组中每一项运行以下函数,返回该函数的结果组成的新数组
var arr =
array.map(function(item, index, arr)
13 return "\"" + item + "\
//对数组中每一项运行以下函数,如果该函数对某一项返回true, 则some返回true
var b =
array.some(function(item, index, arr){}
if (item == “w")f
return true
return false;
4.2.4
清空数组
var array = [1, 2,3, 4, 5, 6];
array.splice(O, array.length);1/刪除
数组中所有项目
array.length = 0;//length属性可以赋值,其它语言中length是只读
array = [] //推荐
4.2.5 练习
1.将一个字符串数组输出为|分割的形式,比如”刘备I
张飞1关羽”。使用两种方式实现
2.将一个字符串数组的元素的顺序进行反转。
["a,"b” "c", "d"] ["d" "c", "b","a]。使用两种种方式
实现。提示:第i个和第length-i-1个进行交换
3.找到数组中每个字母出现的次数["c","a"."z", "a"."a"]
(对象)
4.工资的数组[1500, 1200, 2000, 2100, 1800],把工资超过
2000的刪除