这是我参与8月更文挑战的第7天,活动详情查看: 8月更文挑战
三、函数
作用域:起作用的范围
全局作用域:在函数外,使用var声明的变量,可以在任何的作用域下访问到,称为全局变量。
JS程序执行前,会将var声明的变量提升到所在作用域的最前边,赋值不提升。
函数作用域:在函数内,使用var声明的变量,只能在当前的作用域下访问到,称为局部变量。
JS程序执行前,会将function关键字创建的函数提升到所在作用域的最前边,会整体提升。
1.匿名函数
没有名字的函数
function (){}
1)创建函数
//函数声明 fn为函数名
function fn(){}
//函数表达式 fun为函数名
var fun=function(){}
//方法调用
fn();
fun();
函数表达式和函数声明区别
函数声明创建的函数整体会提升,可以先调用再创建
函数表达式创建的函数只存在变量的提升,必须先创建再调用
2)匿名函数调用
全局污染:全局变量的出现所造成的
解决:尽量避免使用全局变量,转为局部变量
( function(a){
//函数作用域
//放置每块功能代码
} )(1);
3)回调函数
function ran(daizi){
console.log('你好');
daizi();
}
function dong(){
console.log('我不好');
}
ran(dong);
/*
你好
我不好
*/
/*
ran(dong)使得两个function连在一起
ran(中间可以添加function)
*/
2.全局函数
Number()/parseInt()/parseFloat()
isNaN() 检测一个值是否为NaN,先隐式转换为数值,然后检测是-true 不是-false
isFinite() 检测一个值是否为有限值 是-true 不是-false
0做除数会出现无限值 Infinity
eval() 执行字符串中的表达式
3.对象
1)JS中的对象
自定义对象,用户创建的对象
内置对象,JS提供的对象
宿主对象,根据不同的执行环境划分
2)创建自定义对象
对象字面量
内置构造函数
自定义构造函数
3)使用对象字面量创建对象
使用大括号{}创建空对象,每个属性包含有属性名和属性值,之间用冒号隔开,多组属性之间用逗号隔开
var emp={ 属性名1:属性值1, 属性名2:属性值2 }
var emp={
name:'mike',
age:12,
from:'US'
}
console.log(emp);
//{ name: 'mike', age: 12, from: 'US' }
4)访问对象中的属性
对象.属性名
对象['属性名']
如果属性名不存在,则返回undefined
如果属性名中含有特殊字符只能使用中括号形式
var emp={
name:'mike',
age:12,
from:'US'
}
emp['age']:13;
console.log(emp);
//{ name: 'mike', age: 12, from: 12 }
5)使用内置构建函数创建对象
使用new Object();创建对象
var a=new Object();
a.name='mike';
a.age=12;
a.from='US';
//{ name: 'mike', age: 12, from: 'us' }
6)遍历属性
//遍历属性
//for in
for(var k in laptop){
//k代表每一个属性名
//laptop 要遍历的对象
console.log(k,laptop[k]);
}
4.对象查看
1)查看属性是否存在
对象.属性名===undefined 存在-false 不存在-true
对象.hasOwnProperty('属性名') 存在-true 不存在-false
var s={
name:1
}
console.log(s.name===undefined);//false
console.log(s.hasOwnProperty('name'));//true
2)对象中的方法
var person={
name:'然哥',
play: function(){
this.name// this 目前 指代当前所在的对象
}
}
//调用
person.play()
四、数组
1.数组的基本构造
1)使用字面量创建数组
[ 元素1,元素2... ]
var s=['特斯拉','法拉利','劳斯莱斯'];
console.log(s);//['特斯拉','法拉利','劳斯莱斯']
var a=[19,19,16,29,16];
console.log(a);//[19,19,16,29,16]
2)数组元素的访问
数组[下标]
下标是JS自动给每个元素添加的,从0开始的整数
var chengshi=['长沙','成都','上海','北京'];
console.log(chengshi);
chengshi[0]='杭州';
console.log(chengshi);
chengshi[5]='青岛';
console.log(chengshi);
/*
[ '长沙', '成都', '上海', '北京' ]
[ '杭州', '成都', '上海', '北京' ]
[ '杭州', '成都', '上海', '北京', <1 empty item>, '青岛' ]
*/
3)数组的长度
数组[下标]
下标是JS自动给每个元素添加的,从0开始的整数
数组[ 数组.length ]=值
var com=[];
com[com.length]='www.baidu.com';
com[com.length]='www.sougou.com';
console.log(com);
//[ 'www.baidu.com', 'www.sougou.com' ]
4)内置构造函数创建数组
new Array(初始长度);从0开始
var s=new Array(3);
console.log(s);
s[0]='com';
console.log(s);
s[2]='cn';
console.log(s);
var a=new Array('nice','com','ccna');
console.log(a);
/*
[ <3 empty items> ]
[ 'com', <2 empty items> ]
[ 'com', <1 empty item>, 'cn' ]
[ 'nice', 'com', 'ccna' ]
*/
5)数组的分类
变量名.[需要添加的标签]='需要加入的内容'
var arr=[1200];
arr['name']='bule';
arr['age']=12;
arr['sex']='woman';
console.log(arr);
//[ 1200, name: 'bule', age: 12, sex: 'woman' ]
var emp=[
{
eid:1,
name:'red'
},
{
eid:2,
name:'yellow'
}
];
console.log(emp);
//[ { eid: 1, name: 'red' }, { eid: 2, name: 'yellow' } ]
6)数组元素的遍历
循环访问数组中的每个元素
for-in
for(var k in 数组){
k 代表下标
数组[k] 代表元素
}
循环(推荐方法)
for(var i=0;i<数组.length;i++){
i 代表下标
数组[i] 代表元素
}
var emp=[
{
eid:1,
name:'red'
},
{
eid:2,
name:'yellow'
}
];
for(var k in emp){
console.log(emp[k]);
};
for(var i=0;i<emp.length;i++){
console.log(emp[i]);
};
/*
{ eid: 1, name: 'red' }
{ eid: 2, name: 'yellow' }
{ eid: 1, name: 'red' }
{ eid: 2, name: 'yellow' }
*/
使用for提取数组中的数,用if查找出小于20的数
var emp=[12,14,15,61,71];
for(var i=0;i<emp.length;i++){
if(emp[i]<20){
console.log(emp[i]);
}
};
/*
12
14
15
*/
2.API
reverse() 翻转数组中的元素,返回翻转后的数组,原数组会发生变化。
sort() 对数组元素排序,默认按照Unicode码从小到大;返回排序后的数组,原数组会发生变化。
concat(arr2,arr3...) 拼接多个数组,返回一个新数组,arr2,arr3表示要拼接的数组
slice(start,end) 截取数组中的元素,返回截取到的元素,start开始的下标,end结束的下标,不包含end;如果下标为负数表示倒数;如果end为空会截取到最后
splice(start, count, v1,v2...) 删除数组中的元素,start开始的下标,count删除长度,如果count为空表示删除到最后,如果下标为负数表示倒数,v1,v2表示删除后补充的元素,返回删除后的元素;原数组会发生变化。
push(v1,v2..) 往后组的末尾添加元素,v1,v2要添加的元素,返回数组的长度,原数组会发生变化
pop() 删除数组末尾的一个元素,返回删除的元素,原数组会发生变化
unshift(v1,v2) 往数组的开头添加元素,v1,v2要添加的元素,返回数组的长度,原数组会发生变化
shift() 删除数组开头的一个元素,返回删除的元素,原数组会发生变化
var s=[12,13,326,16];
var a=[131,13,3141,41]
var q=['李师傅','张师傅','宋师傅'];
//元素查找筛选
console.log(s.reverse());//反转数组中的元素
console.log(s.sort());//从小到大重新排序
console.log(q.concat(s,a));//两个数组并入一个数组中,从大到小重新排序
console.log(s.slice(1,3));//从1的位置开始取数,到3结束不取3
console.log(s.splice(1,2));//从1取到2
//元素添加和删除
console.log(q.push('兰氏副'));//4 在末尾添加一个元素
console.log(q);//[ '李师傅', '张师傅', '宋师傅', '兰氏副' ]
console.log(q.pop());//兰氏副 删除末尾的元素
console.log(q);[ '李师傅', '张师傅', '宋师傅' ]
console.log(q.shift());//李师傅 删除开头的元素
console.log(q);//[ '张师傅', '宋师傅' ]
console.log(q.unshift('龙师傅'));//3 在开头添加一个元素
console.log(q);//[ '龙师傅', '张师傅', '宋师傅' ]
1)二维数组
用于对数据进行二次分类,每个元素还是数组
var arr1=['河北','广东','江苏'];
var arr2=['石家庄','保定','廊坊','广州','深圳','珠海','惠州','苏州','南京','无锡','常州','扬州'];
//城市进行二次分类
//二维数组
var arr3=[
['石家庄','保定','廊坊'],
['广州','深圳','珠海','惠州'],
['苏州','南京','无锡','常州','扬州']
];
console.log( arr3[1][1], arr3[1][3],arr3[2][1] );//深圳 惠州 南京
3.字符串对象
JS中提供了3种包装对象:String Number Boolean
new String() 将任意数据转字符串,返回对象
String() 将任意数据转字符串,返回字符串
1)转义字符 \
转换字符本身的意义
\' 将引号转为普通字符
\n 将字符n转为换行符
\t 将字符t转为制表符(tab键,多个连续空格)
2)API
length 获取字符串的长度
charAt() 通过下标来找对应的字符,也可以使用数组的方式 字符串[下标]
indexOf( ) 查找某个字符串,返回满足条件的第一个的下标,找不到返回-1
lastIndexOf( ) 查找某个字符串,返回满足条件的最后一个的下标,找不到返回-1
toUpperCase() 英文字母转大写
toLowerCase() 英文字母转小写
slice(start, end) 截取字符串,start开始的下标,end结束的下标,不包含end,如果end为空截取到最后,如果下标是负数表示倒数
substr(start, count) 按照长度截取字符串,start开始的下标,count截取的长度,如果count为空截取到最后,如果下标是负数表示倒数
split( ) 按照指定的字符切割字符串为数组
var s='你好不好';
console.log(s.length);//4
console.log(s.charAt(1));//好
console.log(s.indexOf('好'));//1
console.log(s.lastIndexOf('好'));//3
console.log(english.toUpperCase());//HELLO
console.log(english.toLocaleLowerCase());//hello
console.log(s.slice(1,3));//好不
console.log(s.split());//[ '你好不好' ]
3)匹配模式
用于字符串的查找和替换
search( ) 查找匹配的第一个,返回下的下标,找不到返回-1 /ran/i
match( ) 查找匹配的所有的,返回一个数组 /ran/ig
replace( /ran/ig, '***' ) 查找并替换
/ / 之间可以写字符串,后期用于写查找规则
i ignore 忽略大小写
g global 全局查找
4.Math对象
数学对象,不需要使用new来创建,就可以直接使用API
Math.random() 获取随机数, 范围0~1之间 >=0 <1
floor() 向下取整
ceil() 向上取整
round() 四舍五入取整
max() 取一组数字最大值
min() 取一组数字最小值
abs() 取绝对值
PI 取圆周率
pow(x,y) x的y次方
random() 取随机数 范围0~1 >=0 <1