SOURCE

function es6deconstruct(){
    let obj={
        x:1,
        y:2,
        z:3
    }
    const {x:a,y:b,z:c} = obj;
    console.log([a,b,c])
}
function arrDeconstruct(){
    const [a,b,c,d] = [1,2,3,4];
    const [e,,,f] = [1,2,3,4];
    console.log([a,b,c,d]);
    console.log([e,f]);
}
function exceptFirst2(){
    const originalArr = [1,2,3,4]
    const [,,...arr] = originalArr;
    console.log(arr); 
}
// es6deconstruct()//[1,2,3]
// arrDeconstruct()//[1,2,3,4] [1,4]
// exceptFirst2()//[3,4]


function templateStirng(){
    const person={
        name:"周子越",
        age:21
    };
    console.log(person.age)
    //注意这里字符串应该用反引号括起来,就是键盘左上角的那个
    const string = `hello my name is ${person.name},my age is ${person.age}`;
    console.log(string);
}
// templateStirng()//hello my name is 周子越,my age is 21

let es5construct=function(args){
    this.args = args;
}
class es6class{
    constructor(args){
        this.args = args;
    }
    get name(){
        return this._name;
        // return 2;
    }
    set name(name){
        this._name = 3;
    }
}
let es5obj = new es5construct("es5");
let es6obj = new es6class("es6");
// console.log(es5obj.args);
// console.log(es6obj.args);
// es6obj.name = 2;
// console.log(es6obj.name);

// let arr = [1,2,3,4]
// let a = [];
// a.push(...arr);
// console.log(a);


// function flatten(arr){
//     let newArr = [];
//     for(let i = 0;i<arr.length;i++){
//         if(Array.isArray(arr[i])){
//             newArr = newArr.concat(flatten(arr[i]));
//         }
//         else{
//             newArr = newArr.concat(arr[i]);
//         }
//     }
//     return newArr;
// }
// function flatten(arr){
//     return arr.toString().split(',').map(item=>{
//         return Number(item)
//     })
// }

// const a = [1, [2, [3, 4]]];
// console.log(flatten(a));
// function flatten(arr){
//     while(arr.some(item=>Array.isArray(item))){
//         arr = [].concat(...arr);
//     }
//     return arr 
// }
// const a = [1, [2, [3, 4]]];

// console.log(flatten(a));
// function flatten(arr) {
//   let result = [];

//   for (let i = 0; i < arr.length; i++) {
//     if (Array.isArray(arr[i])) {
//       result = result.concat(flatten(arr[i]));
//     } else {
//       result = result.concat(arr[i]);
//     }
//   }

//   return result;
// }

// const a = [1, [2, [3, 4]]];
// console.log(flatten(a));


// let arr = Array.from(new Set([11,55,6,1,1,1,5]))
// console.log(arr);//[11,55,6,1,5]
// let symbol1 = Symbol("aaa");
// let symbol2= Symbol("aaa");
// console.log(symbol1 == symbol2)

// function curryingAdd(x){
//     if(arguments.length == 2)return arguments[0]+arguments[1];
//     return function(y){
//         return x+y;
//     }
// }
// console.log(curryingAdd(1)(2));
// console.log(curryingAdd(3,5));
// function curry (fn, currArgs) {
//     return function() {
//         // let args = [...arguments];
//         let args = Array.prototype.slice.call(arguments);
//         // 首次调用时,若未提供最后一个参数currArgs,则不用进行args的拼接
//         if (currArgs !== undefined) {
//             args = args.concat(currArgs);
//         }
//         // 递归调用
//         // console.log(fn.length);
//         if (args.length < fn.length) {
//             return curry(fn, args);
//         }
//         // 递归出口
//         return fn.apply(null, args);
//     }
// }
// function sum(a, b, c) {
//     console.log(a + b + c);
// }

// const fn = curry(sum);

// fn(1, 2, 3); // 6
// fn(1, 2)(3); // 6
// fn(1)(2, 3); // 6
// fn(1)(2)(3); // 6


// function debounce(func,time){//防抖,指定时间内连续触发某个时间,事件会进行初始化
//     //先设定一个定时器,置为null
//     //查看当前是否有定时器,如果有就清除定时器,重新设置定时器。
//     let timer = null
//     return function(){
//         if(timer) clearTimeout(timer);
//         timer = setTimeout(function(){
//             func.apply(this,arguments);
//         },time)    
//     }
// }

// function throttle(func,time){//节流,指定时间内触发一个事件,只会执行首次
//     //设置标志位为true,如果触发事件,先看标志位决定是否执行,
//     //如果执行,就将标志位置为false,在time时间后再将标志位改成true
//     let canRun = true;
//     return function(){
//         if(!timer) return;
//         canRun = false;
//         timer = setTimeout(function(){
//             func.apply(this,arguments)
//             canRun = true;        
//         })
//     }
// }

// function deepCopy(obj){
//     let newObj;
//     if(typeof obj === "object"){
//         newObj = Array.isArray(obj)?[]:{};
//         for(let key in obj){
//             newObj[key] = typeof obj === "object"?deepCopy(obj[key]):obj[key];
//         }
//     }else{
//        newObj = obj;
//     }
//     return newObj;
// } 


           


// function deepCopy(obj){
//     JSON.parse(JSON.stringify(obj));
// }

// function arrayRandom(arr){
//     return arr.sort(()=>{
//         return Math.random()-0.5;
//     })
// }
// console.log(arrayRandom([1,2,3,4,5,6,7,8,9]));//[2,1,3,4,9,5,6,7,8]

// // 著名的Fisher–Yates(费舍尔耶茨) shuffle 洗牌算法
// function shuffle(arr) {
// 	let res = arr,
// 		m = arr.length;
// 	while(m > 1){
// 		let index = Math.random() * (m--);
// 		[res [m], res [index]] = [res [index], res [m]];
// 	}
// 	return res;
// }
// function shuffle(arr) {
//   for(let i = arr.length-1;i>1;i--){
//       let randomIndex = Math.floor(Math.random()*i);
//       [arr[i],arr[randomIndex]] = [arr[randomIndex],arr[i]]; 
//   }
//   return arr;
// }
// console.log(shuffle([1,2,3,4,5,6,7,8,9]));//[8,7,4,5,6,2,3,9,1]

// Function.prototype.myCall = function(context){
//     // if(typeof context === "undefined" || context === null){
//     //     context = window;
//     // }
//     context = context || window;//与上面的表达是等价的
//     context.fn = this;
//     const args = [...arguments].slice(1);//去掉第一个,因为第一个是上下文
//     const result = context.fn(...args);
//     delete context.fn;
//     return result;
// }
// Function.prototype.myCall = function(context) {
//     if (typeof context === "undefined" || context === null) {
//         context = window
//     }
//    //context=context||window  和上面的代码一样
//     context.fn = this
//     const args = [...arguments].slice(1)
//     const result = context.fn(...args)
//     delete context.fn
//     return result
// }

function test(){
    console.log(this.a);
}

var a = 40;
let obj = {
    a:1
}

Function.prototype.myBind=function(context){
    
}

// test.myCall(obj);//1
// test.call(undefined);//1


// Function.prototype.myApply = function(context){
//     context = context || window; 
//     context.fn = this;
//     let result = arguments[1]?context.fn(...arguments[1]):context.fn();
//     delete context.fn;
//     return result;
// }
// test.myApply(obj);//1
// test.myApply();//40



console 命令行工具 X clear

                    
>
console