call apply bind
// call apply bind 更改方法里面this的指向
let obj1 = {
name:'李现',
age:30,
sayHi(a,b){
console.log(`Hi!我叫${this.name},今年${this.age}岁。${a}-${b}`);
}
}
let obj2 = {
name:'彭于晏',
age:32
}
// 使用call()改变方法里面,this的指向
// call()方法的第一个参数必须是指定的对象,方法的原有参数,挨个放在后面
obj1.sayHi.call(obj2,200,100)
let obj3 = {
name:'胡歌',
age:35
}
// 使用apply(),也可以改变方法里面this的指向,第一个参是指定的对象,方法的原有参数,统一放到第二个数组参数中
obj1.sayHi.apply(obj3,[200,100])
let obj4 = {
name:'胡军',
age:40
}
// 使用bind(),也可以改变方法里面this的指向,用法给call()一样
// call()是直接运行方法,bind()是返回新的方法,然后再重新调用。
obj1.sayHi.bind(obj4,200,100)()
将一个对象转为字符串
//定义一个对象
let obj1 = {}
//给对象添加属性有两种方式:
obj1.name = '张三'
console.log(obj1);
obj1['age'] = 20
console.log(obj1);
console.log('----------------------------------');
//定义一个手机对象
let phone = {
name: "小米10",
color: '红色',
size: '1000*200*500',
price: '2999'
}
//转成下面的字符串
//"name=小米10&color=红色&size=1000*200*500&price=2999"
// for in 循环,可以遍历出对象的所有key(key就是属性名称)
//方式一:
let arr = [] // 定义一个空数组
for(let key in phone){
//获取对象的属性值,可以通过['属性名']
arr.push(key+'='+phone[key])
}
let str = arr.join('&')
console.log(str);
//方式二:
// Object.keys方法,用于返回对象的所有属性名,返回值是一个数组
let keys = Object.keys(phone)
// Object.values,用于返回对象的所有属性值,返回值是一个数组
// let values = Object.values(phone)
let arr2 = keys.map(function(k){
return [k,phone[k]].join('=')
})
let str2 = arr2.join('&')
console.log(str2);
//方法二:简化写法
let str3 = Object.keys(phone).map(k=>[k,phone[k]].join('=')).join('&')
console.log(str3);
统计字符串中每个字符串出现的次数
//字符串
let str = "fasdfsadfsegsageqwgersfdhrhdfsergterwhefweteqheq"
//对象
let obj = {}
// 循环字符串中的所有的字符串
for(let i=0;i<str.length;i++){
//根据字符的名称,查找对象中,有没有对应的属性
if(obj[str[i]]){
//如果有,对应的属性值加1
obj[str[i]]++
}else{
//如果没有,添加这个属性,属性值赋为1
obj[str[i]] = 1
}
}
console.log(obj);
console.log('-----------------------');
//定义一个出现次数最多的字符对象
let max = {
name:'',
count:0
}
Object.keys(obj).forEach(k=>{
//判断是否有别的字符串大于max
if(obj[k]>max.count){
max.name = k
max.count = obj[k]
}
})
console.log(max);
结果为:
对象数组
//定义数组
let arr1 = [11,22,33,44,55]
console.log(arr1);
//定义对象
let obj1 = {
name:'张三',
age:20,
sayHi:function(){
console.log(`Hi!我叫${this.name},今年${this.age}岁`);
}
}
console.log(obj1);
obj1.sayHi()
obj1.name = '李四'
obj1.age = 30
obj1.sayHi()
console.log('------------------------------');
// 对象数组,指的是数组里面存放的是对象
let arr2 = [
{
name:'张三',
age:20
},
{
name:'李四',
age:22
},
{
name:'王五',
age:24
}
]
console.log(arr2);
综合案例:学生管理系统
// 定义一个学生管理对象
let studentManager = {
//定义一个学生数组
students:[
{
no:'1001',
name:'张三',
age:22,
sex:'男'
},
{
no:'1002',
name:'李四',
age:24,
sex:'女'
},
{
no:'1003',
name:'王五',
age:26,
sex:'男'
}
],
//显示所有学生信息的方法
show:function(){
let str = "学号 姓名 年龄 性别\n"
// 循环出所有的学生信息,并拼接到str中
this.students.forEach(s=>{
str+=`${s.no} ${s.name} ${s.age} ${s.sex}\n`
})
alert(str)
},
//添加学生信息的方法
add:function(){
//输入学生的基本信息
let no = prompt('请输入学号:')
//判断学号是否重复
let index = this.students.findIndex(r=>r.no===no)
while(index!==-1){
no = prompt('学号重复!请重新输入学号:')
index = this.students.findIndex(r=>r.no===no)
}
let name = prompt('请输入姓名:')
let age = parseInt(prompt('请输入年龄:'))
let sex = prompt('请输入性别:')
// 创建学生对象
let stu = {
no:no,
name:name,
age:age,
sex:sex
}
// 将学生对象添加到数组中(学号不能重复)
this.students.push(stu)
alert('添加成功!')
},
//修改学生信息的方法
update:function(){
//输入学生的基本信息
let no = prompt('请输入学号:')
//根据学号,到数组中查找并返回指定的学生对象
let stu = this.students.find(r=>r.no===no)
//根据学号判断,有没有找到该学生,找到了修改该学生的其他信息,没有找到提示学号不存在
while(!stu){
no = prompt('您输入的学号不存在,请重新输入:')
stu = this.students.find(r=>r.no===no)
}
stu.name = prompt('请重新输入该学生的姓名:')
stu.age = parseInt(prompt('请重新输入该学生的年龄:'))
stu.sex = prompt('请重新输入该学生的性别:')
alert('修改成功!')
},
//删除学生信息的方法
delete:function(){
//输入学生的基本信息
let no = prompt('请输入学号:')
//查找该学生在数组中的位置
let index = this.students.findIndex(r=>r.no===no)
while(index===-1){
no = prompt('学号不存在!请重新输入学号:')
index = this.students.findIndex(r=>r.no===no)
}
this.students.splice(index,1)
alert('删除成功!')
},
//系统主菜单方法
menu:function(){
//接收用户的输入
let no = prompt('*****学生管理系统*****\n1.查询学生 2.添加学生 3.修改学生 4.删除学生 0.退出系统')
//判断用户输入的是什么
switch(no){
case '1':
//调用显示所有学生信息的方法
this.show()
break;
case '2':
//调用添加学生信息的方法
this.add()
break;
case '3':
//调用修改学生信息的方法
this.update()
break;
case '4':
//调用删除学生信息的方法
this.delete()
break;
default:
alert('成功退出系统!欢迎下次使用!')
return //跳转整个方法
}
// 再次调用自身方法(递归)
this.menu()
}
}
// 使用学生管理对象,调用menu方法
studentManager.menu()