JS核心04:常用内建对象以及正则表达式
call和apply
这两个方法都是函数对象的方法,需要通过后函数对象来调用
当对函数调用call()和apply()都会调用函数执行
在调用call()和apply()可以将一个对象指定为一个参数,
此时这个对象将会成为函数执行时的this
<script>
function f() {
alert(this);
}
f(); //this为window
var obj={};
f.call(obj) //this为object
f.apply(obj); //this为object
</script>
- call和apply一致传入的参数作为this
<script>
var obj={
name: 'zzq',
age:25,
sayName:function () {
alert(this.name);
}
};
var obj1={
name: 'lxd',
age:25,
sayName:function () {
alert(this.name);
}
};
obj.sayName.call(obj1);
</script>
call()方法可以将实参在对象之后一次传递
apply()方法需要将实参封装到一个数组中同一传递
<script>
function f(a,b) {
alert(`a=${a},b=${b}`)
}
var obj={};
f.call(obj,5,6); //输出a=5,b=6
f.apply(obj,5,6);//报错Uncaught TypeError: CreateListFromArrayLike called on non-object
</script>
this的情况:
1、以函数形式调用时,this永远都是window
2、以方法的形式调用时,this是调用方法的对象
3、以构造函数的形式调用时,this是新创建的对象
4、使用call和apply调用时,this是指定的那个对象
arguments
在调用函数时,浏览器每次都会传递两个隐含的参数,
1、函数的上下文对象this
2、封装实参对象arguments: arguments是一个类数组对象,它也可以通过索引来操作数据,也可以获取长度, 在调用函数时,我们所传递的实参都会在arguments中保存,arguments.length可以获取实参的长度
我们即使不定义形参,也可以通过arguments来使用实参,只不过比较麻烦,arments[0]表示第一个实参,依次类推
它里边有一个属性叫做callee,这个属性对应一个属性,就是当前正在指向的函数的对象
<script>
function aa() {
alert(`a=${arguments[0]},b=${arguments[1]}`)
console.log(arguments.callee)
}
aa(5,6);
</script>
常用内建对象
常用的内建对象有Date、Math、String
Date
创建一个date
<script>
let date = new Date();
alert(date)
</script>
包装类
在JS中为我们提供了三个包装类,通过这三个包装类可以将基本数据类型转换为对象
String、Number、Boolean
String:可以将基本数据类型字符串转换为String对象
Number:可以将基本数据类型的数字转换为Number对象
Boolean:可以将基本数据类型的boolean值转换为Boolean
<script>
var a=new Number(25);
var b=new String('aaaa')
var c=new Boolean(true);
</script>
方法和属性只能添加给对象,不能添加给基本数据类型,当我们对一些基本数据类型的值去调用属性和方法时,浏览器会临时使用包装类将其转换为对象,然后在调用对象的属性和方法,调用完以后,在将其转换为基本数据类型
字符串相关方法
在底层字符串是以字符数组的形式保存的
- indexOf()
该方法可以检索一个字符串中是否含有指定内容,如果字符串中含有该内容,则会返回其第一次出现的索引,如果没有找到指定的内容,则返回-1,可以指定一个 第二个参数,指定开始查找的位置
<script>
var str='hello';
let number = str.indexOf('h',1); //-1 表示从第二位开始检索
alert(number);
</script>
正则表达式
正则表达式用于定义一些字符串的规则,计算机可以根据正则表达式,来检查一个字符串是否符合规则,获取将字符串中符合规则的内容提取出来
创建正则表达式对象
创建对象后用test()方法检查字符串是否符合正则表达式
<script>
//检查字符串中是否含有 'z'
var reg=new RegExp('z');
var str='z';
if (reg.test(str)) {
alert('ddd')
}
</script>
使用字面量来创建正则表达式
语法: var 变量=/正则表达式/匹配模式
创建一个正则表达式,检查一个字符串是否含有a或者b
使用|表示或者的意思
<script>
var reg=/a|b/;
var str='acd';
if (reg.test(str)) {
alert('成功');
}
</script>
创建一个正则表达式来检查一个字符串是否有字母
[]中的内容也是或的关系,a-z:表示任意小写字母,i:表示忽略大小写 ,g:表示不忽略大小写
<script>
var reg=new RegExp('[a-z]');
var str='abcd';
if (reg.test(str)) {
alert('成功');
}
</script>
创建一个正则表达式来检查一个字符串是否有字母,不忽略大小写
<script>
var reg=/[a-z]/g
var str='AB';
if (reg.test(str)) {
alert('成功');
}
</script>
检查一个字符串是否含有 ‘abc’ 'adc' 'aec'
<script>
var reg=/a[bde]c/;
var str='abc';
if (reg.test(str)) {
alert('成功');
}
</script>
[^]除了的意思
<script>
var reg=/[^ab]/;
var str='abd';
if (reg.test(str)) {
alert('成功');
}
</script>
字符串和正则相关的方法
- split
可以将字符串拆分为一个数组
方法中可以传递一个正则表达式作为参数,这样方法将会根据正则表达式去拆封字符串
可以根据任意字母来将字符串进行拆分
<script>
var str='1a2b3c4d5e6f';
var reg=/[A-z]/;
var resutl=str.split(reg);
alert(resutl);
</script>
- search
可以搜索字符串中是否含有指定内容
如果搜索到指定内容,则会返回第一次出现的索引,如果没有检索到则返回-1
它可以哦接收一个正则表达式作为参数,然后根据正则表达式去检索字符串
<script>
var str='hello abc hello aec afc';
//搜索字符串中是否含有abc或 aec 或者 afc
let number = str.search(/a[bef]c/);
alert(number);
</script>
- match
可以根据正则表达式,从一个字符串中将符合正则的内容提取出来
默认情况下我们的match只会找到第一个符合要求的内容,找到以后就停止检索,我们可以设置正则表达式为全局匹配模式
可以为一个正则表达式这是多个匹配模式且顺序无所谓
<script>
var str='1a2b3c4d5e6f';
//提取出字符串中的字母
let array = str.match(/[A-z]/gi);
</script>
- replace
replace()可以将字符串中指定内容替换为新的内容
默认只会替换第一个,所以使用全局模式
<script>
var str='1a2b3c4d5b6a';
//将字符串中指定内容替换为新的内容
let s = str.replace(/[a]/gi,'@@');
alert(s);
</script>
正则表达式语法01
- 量词
通过量词可以设置一个内容出现的次数
{n}正好出现n次,量词只对前面的一个内容起作用
{1,3}出现1到三次
{m,}m次以上
/ab+c/:至少一个,相当于{1,}
/ab*c:0个或多个,相当于{0,}/
/ab?c/: 0个或1个,相当于{0,1}
<script>
/**
* 创建一个正则表达式检查一个字符串中是否含有aaa
*/
var reg=/a{3}/;
var str='aaabbc';
if (reg.test(str)) {
alert('success');
}
</script>
- 检查一个字符串是否以a开头
^表示开头
<script>
/**
* 创建一个正则表达式检查一个字符串中是否以a开头
*/
var reg=/^a/;
var str='abc';
if (reg.test(str)) {
alert('success');
}
</script>
- 检查一个字符串是否以a结尾
$表示结尾
<script>
/**
* 创建一个正则表达式检查一个字符串中是否以a结尾
*/
var reg=/a$/;
var str='abca';
if (reg.test(str)) {
alert('success');
}
</script>
- 创建一个正则表达式来检查是否是有是一个手机号
<script>
/**
* 创建一个正则表达式检查手机号
*/
var reg=/^1[3-9]{1}[0-9]{9}$/;
var str='17361562673';
if (reg.test(str)) {
alert('success');
}
</script>
正则表达式语法02
.表示任意字符
在正则表达式中使用\作为转义字符 \.来表示
- 检查一个字符串中是否含有 .
<script>
/**
* 检查一个字符串中是否含有 .
* .表示任意字符,所以要进行转义
*/
var reg=/\./;
var str='a.';
if (reg.test(str)) {
alert('success');
}
</script>
使用够构造函数时,由于它的参数是一个字符串,而\是字符串中转义字符如果要使用\则需要使用\\来代替
\w:匹配任意字母、数字、_,相当于[A-z0-9]
<script>
var reg=/\w/;
var str='abc_123';
if (reg.test(str)) {
alert('success');
}
</script>
\W:除了字母、数字、_相当于[^A-z0-9]
\d任意的数字,相当于[0-9]
\D除了数字,相当于[^0-9]
\s:空格,
\S除了空格
<script>
var reg=/\S/;
var str=' ';
if (reg.test(str)) {
alert('success');
}
</script>
\b表示单词边界
<script>
/**
* 创建一个正则表达式检查一个字符串中是否含有单次child
*/
var reg=/\bchild\b/
var str='hello child';
if (reg.test(str)) {
alert('success');
}
</script>
- 去除字符串中的空格
<script>
/**
* 创建一个正则表达式去除字符串中的空格
*/
var reg=/^\s*|\s*$/g; //表示开头0个或多个空格
var str=' hello ';
let s = str.replace(reg,'');
console.log(str);
console.log(s);
</script>
- 电子邮件正则表达式
/** * 电子邮件 * hello .nihao @ abc .com.cn * \w{3,} (\.\w+)* @ [A-z0-9]+ (\.[A-z]{2,5}){1,2} * @type {RegExp} */
<script>
/**
* 电子邮件
* hello .nihao @ abc .com.cn
* \w{3,} (\.\w+)* @ [A-z0-9]+ (\.[A-z]{2,5}){1,2}
* @type {RegExp}
*/
var reg=/^\w{3,}(\.\w+)*@[A-z0-9]+(\.[A-z]{2,5}){1,2}$/
var str='17361562676@163.com';
if (reg.test(str)) {
alert('success');
}
</script>