对象
对象
对象是一个具体的事物
在JavaScript中,对象是一组无序的相关属性和方法的集合,所有的事物都是对象,例如字符串,数值,数组,函数等
对象由属性和方法组成的
- 属性:事物的特征,在对象中用属性来表示(常用名词)
- 方法:事物的行为,在对象中用方法来表示(常用动词)
保存一个值时,可以使用变量,保存多个值(一组值)时,可以使用数组.
为什么使用对象?
对象的结构相比于数组更加清晰和简单
对象的特点
- 对象属于复杂数据类型,即引用数据类型
- 在存储变量时,存储时,变量中存储的仅仅是地址,放在堆中;其具体的值放在栈中,并指向堆中的变量
- 传参过程是把堆地址传给不同的参数
创建对象的三种方式
利用字面量创建对象
对象字面量:就是花括号{}里面包含了表达这个具体事物(对象)的属性和方法
对象里面还可以放对象,对象里面还可以放方法
//利用字面量创建对象
var obj = {}; //空对象
var obj = {
uname: '张三丰',
age: 18,
sex: '男',
sayHi: function () {
console.log('hi~');
}
}
//(1)里面的属性或者方法我们采取键值对的形式 键 属性: 值(属性值)
//(2)多个属性或者方法用逗号隔开
//(3)方法冒号后面跟的是一个匿名函数
调用对象的属性
//采取 对象名.属性名
console.log(obj.sex);
//对象名['属性名']
console.log(obj['age']);
调用对象的方法
//对象名.方法名();
obj.sayHi();
变量和属性的异同
相同点:都是用来存储数据
区别:
变量 | 属性 |
---|---|
单独声明并赋值,使用的时候直接写变量名,单独存在 | 在对象里面的称为属性,不需要声明,使用的时候必须是对象.属性 |
函数是单独声明的,并且调用的 函数名() 单独存在
方法在对象里面调用的时候 对象.方法()
利用new Object创建对象
var obj = new Object(); //创建一个空对象
obj.name = 'q';
obj.age = 18;
obj.sex = '男';
obj.sayHi = function() {
console.log('sayHi~');
};
console.log(obj);
利用构造函数创建对象
优点在于可以利用方法批量创建某一类对象
因为我们前面两种创建对象的方式一次只能创建一个对象
构造函数:是一种特殊的函数,主要用来初始化对象,即为对象成员变量赋初始值,它总与 new 运算符一起使用。我们可以把对象中一些公共的属性和方法抽取出来,然后封装到这个函数里面。
构造函数用于创建某一类对象,其首字母要大写
构造函数要和new一起使用才有意义
//声明构造函数
function 构造函数名() {
this.属性 = 值;
this.方法 = function() {};
}
new 构造函数名();
-----------------------------------------------
function Star(name, age, sex) {
this.name = name;
this.age = age;
this.sex = sex;
this.sing = function(song) {
console.log(song);
};
}
var ldh = new Star('刘德华', 18, '男');
ldh.sing('冰雨');
console.log(ldh.name);
1.构造函数名字首字母必须要大写字母
2.构造函数不需要return就可以返回结果
3.调用构造函数必须使用new
4.只要 new
new关键字
- 在内存中创建一个新的空对象
- 让 this 指向这个新的对象
- 执行构造函数里面的代码,给这个新对象添加属性和方法
- 返回这个新对象(所以构造函数里面不需要return)
遍历对象属性
for…in 语句用于对数组或者对象的属性进行循环操作。
for (变量 in 对象名字) {
// 在此执行代码
}
var obj = {
name : 'pink',
age : 18,
sex : '男'
}
for (var k in obj ) {
console.log(k);//属性名
console.log(obj[k]);//obj[k]是属性值
}
语法中的变量是自定义的,它需要符合命名规范,通常我们会将这个变量写为 k 或者 key
案例
/*
创建一个电脑对象
有颜色(color)、重量(weight)、品牌(brand)、型号(type)等属性,
有看电影(watch)、听音乐(listen)、打游戏(play)和敲代码(coding)等方法。
题目描述:
颜色、重量、品牌、型号是属性;看电影、听音乐、打游戏、敲代码是方法,在调用方法时分别打印 “我在看电影/听音乐/打游戏/敲代码”
*/
//函数创建方法
function Computer(color, weight, brand, type) {
this.color = color;
this.weight = weight;
this.brand = brand;
this.type = type;
this.fn = function () {
console.log('我在看电影');
console.log('我在听音乐');
console.log('我在打游戏');
console.log('我在敲代码');
};
}
var c = new Computer('red', 180, 'abc', 1);
console.log(c);
c.fn(); //console.log(c.fn()); 会显示undefined
//字面量
var c = {
color: 'red',
weight: 180,
brand: 'abc',
type: 1,
fn: function () {
console.log('我在看电影');
console.log('我在听音乐');
console.log('我在打游戏');
console.log('我在敲代码');
}
}
console.log(c);
c.fn();
//new object
var c = new Object();
c.color = 'red';
c.weight = 180;
c.brand = 'abc';
c.type = 1;
c.fn = function () {
console.log('我在看电影');
console.log('我在听音乐');
console.log('我在打游戏');
console.log('我在敲代码');
};
console.log(c);
c.fn();
//遍历下面对象
var dog = {
dName:"coco",
type:"阿拉斯加犬",
age:"5岁",
color:"棕红色"
};
//遍历对象
for (var k in dog) {
console.log(dog[k]);
}
//请描述下面代码的输出结果以及运行原因
var num = 1;
function demo(){
console.log(num);
function demoSon(){
console.log(num);
num = 3;
console.log(num);
}
var num = 2
demoSon();
}
demo();
//变量提升 函数提升 局部变量 全局变量 作用域链 变量定义
var num; //变量提升
function demo() { //函数提升
var num; //变量提升
function demoSon() { //函数提升
console.log(num); //2 2
num = 3; //全局变量
console.log(num); //3 3
}
console.log(num); // undefined 1
num = 2;
demoSon();
}
num = 1;
demo();
//输出结果 undefined 2 3
/*
请使用arguments完成函数getResult,实现得到输入的所有的数值中的最小值、最大值、平均数、总和等功能
作业描述:
函数名:getResult
函数调用方式:getResult(数值1,数值2,数值3,数值4.....)
函数功能:返回值是一个对象,这个对象有sum, max, min, averages等属性,分别表示实参的总和、最大值、最小值、平均数等
*/
function getResult() {
var sum = arguments[0];
//计算sum
for (var i = 1; i < arguments.length; i++) { //遍历数组,存入数值
sum += arguments[i];
}
//计算max
var max = arguments[0];
for (var i = 1; i < arguments.length; i++) {
if (arguments[i] > max) {
max = arguments[i];
}
}
//计算min
var min = arguments[0];
for (var i = 1; i < arguments.length; i++) {
if (arguments[i] < min) {
min = arguments[i];
}
}
//计算avg
avg = sum / arguments.length;
//创建对象
function Obj(sum, max, min, avg) {
this.sum = sum;
this.max = max;
this.min = min;
this.avg = avg;
}
//传入属性值给对象
var arr = new Obj(sum, max, min, avg);
return console.log(arr);
}
getResult(100, 2, 31, 42, 15, 56);
/*
以下有两个数组,一个数组arr是班级里所有的学员的名称,一个数组currentArr是提交了每日反馈的学员名单,请创建一种算法,把未提交每日反馈的学员筛选出来
*/
var arr = ["张瑞淑", "徐海涛", "谢岗岗", "薛鹏", "魏明杨", "党婷", "熊飞", "郑翠翠", "李航卫", "屈涛", "汪孝双", "代攀飞", "武志钰", "王亚龙", "周芙榕", "李涛", "郝颖", "文冲洋", "王旭拯", "胡佳豪", "寇晓丽", "马晓晗","王思聪", "张绿", "李德", "郑萍", "张凯", "张嘉成", "葛云侠", "杨磊", "任变", "景德", "高卷林", "刘益凡", "赵娜", "陈章鸣", "张荣召", "赵凯旋", "程倩倩", "脱朝平", "刘吉利", "郭苗苗", "马建峰", "潘瑞", "闫翔", "马晨", "李轩轩", "黄红梅", "刘书彬", "罗强", "刘东","王可可" "陈泽文", "李嘉琪", "段佳琦", "黄燕", "邱淑鸿", "宋翔宇", "王波", "樊琳", "王兆国", "许成", "李兴"];
var currentArr = ["张瑞淑", "徐海涛", "谢岗岗", "薛鹏", "魏明杨", "党婷", "熊飞", "郑翠翠", "李航卫", "屈涛", "汪孝双", "代攀飞", "武志钰", "王亚龙", "周芙榕", "李涛", "郝颖", "文冲洋", "王旭拯", "胡佳豪", "寇晓丽", "马晓晗", "张绿", "李德","郑萍", "张凯", "张嘉成", "葛云侠", "杨磊", "任变", "景德", "高卷林", "刘益凡", "赵娜", "陈章鸣", "张荣召", "赵凯旋", "程倩倩", "脱朝平", "刘吉利", "郭苗苗", "马建峰", "潘瑞", "闫翔", "马晨", "李轩轩", "黄红梅", "刘书彬", "罗强", "刘东", "陈泽文", "李嘉琪", "段佳琦", "黄燕", "邱淑鸿", "宋翔宇", "王波", "樊琳", "王兆国", "许成", "李兴"];
function arrMath(arr, currentArr) {
var newArr = [];//创建新数组
var type = false;//默认为false,如果匹配不到则为true
for (var i = 0; i < arr.length; i++) {
for (var m = 0; m < currentArr.length; m++) {
if (arr[i] == currentArr[m]) { //将arr和currentArr里面的每一个值进行比较
type = false;//如果currentArr里面有值匹配,则输出false
break;//如果匹配到,则跳出循环
} else {
type = true;
}
}
if (type == true) {//循环完成后,将值还为true的,拿出来创建新数组
newArr[newArr.length] = arr[i];
}
}
return newArr;
}
var re = arrMath(arr, currentArr);
console.log(re);