SOURCE

// const node = {
//   loc: {
//     start: {
//       line: 1,
//       column: 5
//     }
//   }
// };

// let { loc, loc: { start }, loc: { start: { line }} } = node;
// console.log(line)
// console.log(loc)
// console.log(start)
// console.log(node)

// [({ p: a }), { x: c }] = [{}, {}];

// function example() {
//   return [1, 2, 3];
// }
// let [a, b, c] = example();
// console.log(a)
// console.log(b)
// console.log(c)

// let x = 1;
// let y = 2;
// [x, y] = [y, x];
// console.log(x)
// console.log(y)

// let msg = `Hello, ${'place'}`;
// let msg1 = `Hello, ${place}`; // place是变量

// console.log('abbc'.replaceAll('b', '$&'))
// console.log('abbc'.replaceAll('b', '$`'))
// console.log('abbc'.replaceAll('b', `$'`))
// console.log('abbc'.replaceAll(/(ab)(bc)/g, '$2$1'))
// console.log('abc'.replaceAll('b', '$$$'))
// console.log('aabbcc'.replaceAll('b', () => '~'))

// console.log(Number.MAX_SAFE_INTEGER === Math.pow(2, 53) - 1)
// console.log(Math.sign(-5)) 
// console.log(Math.sign(5))
// console.log(Math.sign(0))
// console.log(Math.sign(-0))
// console.log(Math.sign(NaN))
// console.log(Math.hypot(3, 4, 5))

// var x = 1;
// function foo(x, y = function() { x = 2; }) {
// //   var x = 3;
//   x = 3;
//   y();
//   console.log(x);
// }
// foo()
// console.log(x)


// // 箭头函数的this
// function foo() {
//   setTimeout(() => {
//     console.log('id:', this.id);
//   }, 100);
// }

// var id = 21;
// foo();
// foo.call({id: 42});

// function Timer() {
//   this.s1 = 0;
//   this.s2 = 0;
//   // 箭头函数
//   setInterval(() => this.s1++, 1000);
//   // 普通函数
//   setInterval(function () {
//     this.s2++;
//   }, 1000);
// }
// var timer = new Timer();
// setTimeout(() => console.log('s1: ', timer.s1), 3100);
// setTimeout(() => console.log('s1: ', timer.s2), 3100);

// // 箭头函数this的指向问题
// // function foo() {
// //   return () => {
// //     return () => {
// //       return () => {
// //         console.log('id:', this.id);
// //       };
// //     };
// //   };
// // }
// function foo() {
//     return function() {
//         // console.log('id: ', this.id)
//         return function() {
//             // console.log('id: ', this.id)
//             return function() {
//                 console.log('id: ', this.id)
//             }
//         }
//     }
// }

// var f = foo.call({id: 1});

// var t1 = f.call({id: 2})()(); 
// var t2 = f().call({id: 3})(); 
// var t3 = f()().call({id: 4}); 

// console.log((function() {
//   return [
//     (() => this.x).bind({ x: 'inner' })()
//   ];
// }).call({ x: 'outer' }));

// const cat = {
//   lives: 9,
//   jumps: () => {
//     this.lives--;
//   }
// }
// console.log(cat.jumps())

// globalThis.s = 21;
// const obj = {
//   s: 42,
//   m: () => console.log(this.s)
// };
// obj.m() // 21

// // 1.  静态的this,始终指向函数声明时所在的作用域下的this
// function getName() {
//     console.log(this.name)
// }
// let getName2 = () => {
//     console.log(this.name)
// }
// window.name = '刘能'
// const person = {
//     name: "宋小宝"
// }
// getName();
// getName2();

// getName.call(person);
// getName2.call(person);

// // 2. 不能作为构造函数实例化对象
// let Person  = (name, age) => {
//     this.name = name
//     this.age = age
// }
// let p = new Person()
// console.log(p)

// // 3. 不能使用argumnets变量
// let fn = () => {
//     console.log(arguments)
// }
// fn(1, 2, 3)

// // symbol
// let game = {
//     name: '帝国时代',
//     [Symbol('fazhan')]: function (){
//         console.log('赶快发展');
//     },
//     [Symbol('jingong')]: function() {
//         console.log('扩展地盘')
//     }
// }
// console.log(game)

// let arr = [1, 2, 3]
// let arr2 = [4, 5, 6]
// arr2[Symbol.isConcatSpreadable] = false // 不展开
// console.log(arr.concat(arr2))


// // 迭代器
// const banji = {
//     name: '终极一班',
//     stus: [
//         'xiaoming',
//         'xaiozhang',
//         'xiaohong',
//         'xiaobai'
//     ],
//     [Symbol.iterator]() {
//         let index = 0;
//         let _this = this;
//         return {
//             next: function() {
//                 if (index < _this.stus.length) {
//                     const result = {value: _this.stus[index], done: false}
//                     index++;
//                     return result
//                 } else {
//                     return {value: undefined, done: true}
//                 }
//             }
//         };
//     }
// }
// for (let v of banji) {
//     console.log(v)
// }

// // 生成器
// function * gen() {
//     // console.log('xixihaha')
//     // console.log(111)
//     yield '一只没有眼睛'
//     // console.log(222)
//     yield '一只没有尾巴'
//     // console.log(333)
//     yield '真奇怪'
//     // console.log(444)
// }
// let iterator = gen();
// // console.log(iterator)
// console.log(iterator.next());
// console.log(iterator.next());
// console.log(iterator.next());
// console.log(iterator.next());

// // for (let c of gen()) {
// //     console.log(c)
// // }

// // 生成器
// function * gen(arg) {
//     console.log(arg)
//      let one = yield '一只没有眼睛'
//     console.log(one)
//     let two = yield '一只没有尾巴'
//     console.log(two)
//     let three = yield '真奇怪'
//     console.log(three)
// }
// let iterator = gen('AAA');
// console.log(iterator.next());
// console.log(iterator.next('BBB'));
// console.log(iterator.next('CCC-'));
// console.log(iterator.next('DDD'));

// // 生成器实例
// function getUsers() {
//     setTimeout(() => {
//         let data = '用户数据'
//         iterator.next(data);
//     }, 1000)
// }
// function getOrders() {
//     setTimeout(() => {
//         let data = '订单数据'
//         iterator.next(data);
//     }, 1000)
// }
// function getGoods() {
//     setTimeout(() => {
//         let data = '商品数据'
//         iterator.next(data)
//     }, 1000)
// }

// function * gen() {
//     let users = yield getUsers();
//     console.log(users);
//     let orders = yield getOrders();
//     console.log(orders);
//     let goods = yield getGoods();
//     console.log(goods);
// }
// let iterator = gen();
// iterator.next()

// // Promise
// const promise = new Promise((resolve, reject) => {
//   resolve('ok');
//   throw new Error('test');
// });
// promise
//   .then(value => console.log(value) )
//   .catch(error => console.log(error) );

// // Set
// const s = new Set(['大事', '小事', '天下事', '都是我的事'])
// console.log('第一个输出 ' + s)
// console.log('第二个输出 ' + s.size)
// s.add('国家大事')
// console.log('第三个输出 ' + s.size)
// s.delete('都是我的事')
// console.log('第四个输出 ' + s.size)
// console.log('第五个输出 ' + s.has('国家大事'))
// console.log('第五个输出 ' + s.has('国家事'))
// for (let v of s) {
//     console.log(v)
// }

// set实践
// let arr = [1, 2, 3, 4, 5, 4, 3, 2, 1]
// // 数组去重
// let result = [...new Set(arr)] // 将object转化为array
// console.log(result)
// // 交集
// let arr2 = [4, 5, 6, 5, 4]
// // let result2 = [...new Set(arr)].filter(item => {
// //     let s = new Set(arr2)
// //     if (s.has(item)) {
// //         return 1
// //     } else {
// //         return 0
// //     }
// // })
// let result2 = [...new Set(arr)].filter(item => new Set(arr2).has(item))
// console.log(result2)
// // 并集
// let union = [...new Set([...arr, ...arr2])]
// console.log(union)
// // 差集
// let diff = [...new Set(arr)].filter(item => !(new Set(arr2).has(item)));
// console.log(diff)

// // Map
// let m = new Map()
// m.set('name', '老刘')
// m.set('change', function() {
//     console.log('我是函数')
// })
// let key = {
//     work: 'boss'
// }
// m.set(key, ['北京', '上海', '深圳'])
// console.log(m.size)

// // class
// // ES5
// function Phone(brand, price) {
//     this.brand = brand;
//     this.price = price;
// }
// Phone.prototype.call = function() {
//     console.log('我手机信号贼好')
// }
// let Huawei = new Phone('华为meta', 4999);
// Huawei.call();
// console.log(Huawei)
// // ES6
// class shouji {
//     constructor(brand, price) {
//         this.brand = brand;
//         this.price = price;
//     }
//     call() {
//         console.log('手机真不错')
//     }
// }
// let nova = new shouji('nova', 1999)
// console.log(nova)

// 继承
// ES5
function Phone(brand, price) {
    this.brand = brand;
    this.price = price;
}
Phone.prototype.call = function() {
    console.log('我可以打电话')
}
function smartPhone(brand, price, color, size) {
    Phone.call(this, brand, price);
    this.color = color;
    this.size = size;
}
smartPhone.prototype.photo = function() {
    console.log('我可以拍照');
}

smartPhone.prototype.playGame = function() {
    console.log('我可以玩游戏')
}
let xiaomi = new smartPhone('小米', 3999, '白色', '5.5英寸');
console.log(xiaomi)
// ES6
class shouji {
    constructor(brand, price) {
        this.brand = brand;
        this.price = price;
    }
    call() {
        console.log('我可以打电话')
    }
}
class smartShouji extends shouji {
    constructor(brand, price, color, size) {
        super(brand, price)
        this.color = color;
        this.size = size;
    }
    photo() {
        console.log('我可以拍照');
    }
    playGame() {
        console.log('我可以玩游戏')
    }
}
let metaPro = new smartShouji('华为', 4399,  '蓝色', '6.0英寸')
console.log(metaPro)
metaPro.call();
metaPro.photo();
metaPro.playGame();
console 命令行工具 X clear

                    
>
console