JavaScript,第二天

184 阅读4分钟

这是我参与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