集合

一个标识符(集合),可以存储多个数据, 数据不能重复。

集合与数组的区别
集合的内容具有唯一性 ( 全等匹配) 去重复。

// 声明集合  构造函数
let F70 = new Set();
//集合赋值
F70.add(1);
F70.add(2);
F70.add(1);
F70.add("1");
//使用集合
console.log(F70);//Set { 1, 2, '1' }  可以看出集合有去重复。
//数组去重
let F71 = [];
F71.push(123);
F71.push(234);
F71.push(234);
console.log(F71);//[ 123, 234, 234 ]

let F70 = new Set(F71);
F71 = [...F70];
console.log(F71);//[ 123,234 ]


//集合的方法和属性
/**
 * 属性size 
 * 书写格式: 集合.size
 * 功能:输出集合存储数据的个数
 */
let F70 = new Set([1, 2, 3])
console.log(F70.size);//3
 /**
  * 集合的方法
  * 
  * 链式调用
  * 一行代码连续书写多个方法。
  * 由于add方法的返回值是集合
  * 因此可以在add后面继续添加add
  */
 let F70 = new Set();
F70.add("A").add("B").add("C");
console.log(F70);//Set { 'A', 'B', 'C' }
 //删除集合里的内容
F70.delete("A"); //小括号里删除的内容
console.log(F70); //Set { 'B', 'C' }
//集合的键值对(键值就是键名)
//清空集合
F70.clear();
console.log(F70);//Set {}

let F70 = new Set([1, 2, 3]);
//查找
console.log(F70.has(1)); //true

//集合遍历
for (let item of F70.keys()) { //键名
    console.log(item);//1 2 3
}

for (let item of F70.values()) { //键值
    console.log(item);//1 2 3
}

for (let item of F70.entries()) { //键名和键值
    console.log(item); // [1,1] [2,2] [3,3]
}

Object 对象

数据结构:存储多个数据

一切事物皆对象!!!

声明对象

字面量声明
书写格式: 关键字 标示符 赋值符号 大括号 分号
let F70 = {} ;

let F70 = {};
 console.log(F70, typeof F70);//{} object

构造函数
书写格式: 关键字 标示符 赋值符号 new Object();
let F70 = new Object();
let F70 = new Object();

/**
 * 【对象的初始化】
 * {
 *    属性名1 : 属性值1,
 *    属性名2 : 属性值2,
 *    ...
 *    属性名n : 属性值n,
 * 
 *    方法名1  : function (){代码块},
 *    方法名2  : function (){代码块},
 *    ...
 *    方法名n  : function (){代码块} 
 * }
 * 
 */
 let zhuozhuo = {
    eyes: 2,
     legs: 2,
    length: 100,
     life: 100,
     money: 1000,
    suidashi: function() {
         console.log(`sui!!!`);
         this.life--;
        this.money += 1000;
    },
     dabaojian: function() {
        this.life++;
         this.money -= 999;
    }
 }
console.log(zhuozhuo.eyes);//2
console.log(zhuozhuo.length);//100
//使用对象的方法
zhuozhuo.suidashi();
console.log(shexiaoguo.life);//99
console.log(shexiaoguo.money);//2000
zhuozhuo.dabaojian();
console.log(shexiaoguo.life);//100
console.log(shexiaoguo.money);//1001
/**
 * 当使用对象不存在的属性,会得到undefined
 * 原因:使用之前,JS会在对象中添加此属性,并赋值undefined
 */
 let F72 = {};
console.log(F72.length); //undefined
console.log(F72.yangfan); //undefined


//对象属性和方法的添加
let f70 = {
    money: 100,
    work: function() {
        this.money += 100;
    },
    shopping: function(payMoney) {
        money -= payMoney;
    }
};


f70.gf = "guoguo";
f70.bf = "xiaoxiao";
f70.money = 0;
console.log(f70);//{
 // money: 0,
 // work: [Function: work],
 // shopping: [Function: shopping],
 // gf: 'guoguo',
 // bf: 'xiaoxiao'
}

console.log(f70.gf);//guoguo
f70.cry = function() {
    this.money += 1000;
}
f70.cry();
console.log(f70.money);//1000

//我们发现若添加一个存在的属性,会把原有的属性进行覆盖。
// 为了解决这个问题,会声明一个Symbol类型的变量。
// 声明Symbol变量
//注:1、小括号里的内容是Symbol变量的注释
//2、声明是不要添加new
 let money = Symbol();
// 给Symbol变量赋值(需要告知给哪个对象添加)
 f70[money] = 0;
 console.log(f70.money); //1000
// 使用方式:属性名[symbol变量]
 console.log(f70[money]); //0


//属性和方法的删除
//删除属性的格式: delete 对象名.属性名 ;
delete f70.money;
console.log(f70.money);//undefined
// 使用被删除的属性,会等到undefined
// 调用被删除的方法,会报错(对象没有这个方法)

//删除方法的格式: delete 对象名.方法名;
//注:方法名后不加小括号
// delete huangmiliang.work;

//遍历对象
 let f71 = {
     name: "WLM",
     age: "18",
    gender: "male"
 };
//遍历对象的键名
 for (let item of Object.keys(f71)) {
     console.log(`键名:${item}`);//键名:name 键名:age 键名:gender
 }
//遍历对象的键值
 for (let item of Object.values(wulinmeng)) {
     console.log(`键值:${item}`);//键值:WLM 键值:18 键值:male
 }
//遍历对象的键值对
 for (let item of Object.entries(wulinmeng)) {
     console.log(`键值对:${item}`);//键值对:name,WLM 键值对:age,18 键值对:gender,male
 }
 //判断对象中是否存在要查找的键名
console.log("name" in f71);//true
console.log("123" in f71);//false

//对象的嵌套

 let f73 = {
     name: "WLM",
     age: "18",
     gender: "male",
    gf: {
        name: "xiaohua1",
        age: 18,
         song: function() {
            console.log(`酒醉的蝴蝶!!!`);
         },
         dance: function() {
             console.log(`动词打次!!!`);
        }
     }
 };

 console.log(wulinmeng.gf.name);//xiaohua1