// 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