难受就摸头盖骨

es6

对象的计算属性名
以前对象的属性是不允许动态修改的,es6支持属性赋值,如:
以前:
let obj1= {
    name: '熊二', 
    age: 18,
    sec: '女'
};


现在可以:
let nameStr = 'name';
let ageStr = 'age';
let obj1 = {
    [nameStr]: '熊二',
    [`${ageStr}`]: 18,
    ['sec']: '女'
}
console.log(obj1)   // {     name: '熊二',      age: 18,     sec: '女' };


Object.assign(target,source) 对象合并
Object.assign方法用于对象的合并,将源对象(source)的所有可枚举属性,复制到目标对象(target)。第一个参数是目标对象,后面的参数都是源对象。
注意,如果目标对象与源对象有同名属性,或多个源对象有同名属性,则后面的属性会覆盖前面的属性。
var target = { a: 1, b: 1 };
var source1 = { b: 2, c: 2 };
var source2 = { c: 3 };

Object.assign(target, source1, source2);
target // {a:1, b:2, c:3}
Object.assign方法实行的是浅拷贝,而不是深拷贝。也就是说,如果源对象某个属性的值是对象,那么目标对象拷贝得到的是这个对象的引用。
var obj1 = {a: {b: 1}};
var obj2 = Object.assign({}, obj1);

obj1.a.b = 2;
obj2.a.b // 2
上面代码中,源对象obj1的a属性的值是一个对象,Object.assign拷贝得到的是这个对象的引用。这个对象的任何变化,都会反映到目标对象上面。
Object.assign 应用
(3)克隆对象
function clone(origin) {
  return Object.assign({}, origin);
}
上面代码将原始对象拷贝到一个空对象,就得到了原始对象的克隆。
不过,采用这种方法克隆,只能克隆原始对象自身的值,不能克隆它继承的值。如果想要保持继承链,可以采用下面的代码。
function clone(origin) {
  let originProto = Object.getPrototypeOf(origin);
  return Object.assign(Object.create(originProto), origin);
}
(4)合并多个对象
     将多个对象合并到某个对象。
const merge =
  (target, ...sources) => Object.assign(target, ...sources);
如果希望合并后返回一个新对象,可以改写上面函数,对一个空对象合并。
const merge =
  (...sources) => Object.assign({}, ...sources);


函数的参数默认值:
funtion ( a = ' $ ' ) {   }      
在形参位置可以传默认值,意思为:不穿参数默认使用 a = ' $ ' 

forEach和map的区别
let arr = [
    {
        id:1,
        name:'小一'
    },
    {
        id:2,
        name:'小二'
    },
    {
        id:3,
        name:'小三'
    }
]
let newArr1 = arr.filter((item)=>{
    return item.id ===1;
})
console.log(newArr1) // [{id:1,name:'小一'}]
let newArr0 = arr.filter((item)=>{
    return item.id;
})
console.log('filter', newArr0) // [{id:1,name:'小一'},{id:2,name:'小二'},{id:3,name:'小三'}]

let newArr2 = arr.map((item)=>{
 return item.id;
})
console.log(newArr2)// [1,2,3]

共同点:都是返回一个新的数组
Map
Map是一组键值对的结构,具有极快的查找速度。具有以下方法:
let m = new Map();
 m.set('xiaoming',{name:'小明',age:16});
 m.set('xiaohuang',{name:'小黄',age:18});
 m.get('xiaoming')     //{name:'小明',age:16}
 m.has('xiaohuang')    //true
 m.delete('xiaoming');
 m.has('xiaoming')     //true

应用:

//获取xiaomhuang对应的成绩
let nameArr = ['xiaoming', 'xiaolan', 'xiaohaung']
let numberArr = [80, 90, 76]
numberArr.forEach((numberItem) => {
    nameArr.forEach((itemName, itemNameIndex) => {
        if(itemName === 'xiaohaung') {
            numberArr[itemNameIndex] // 76
        };
    })
})

//使用Map
let m = new Map([
    ['xiaoming', 80],
    ['xiaolan', 90],
    ['xioahuang', 76]
]);
m.get('xioahuang') // 76

 

Set
let s = new Set();
 console.log('初始',s) //{}
 s.add(1);
 console.log(s) // {1}
 s.add('1') 
 console.log(s) // {1,'1'}
 s.add(1);
 console.log(s) // {1,'1'}
 s.delete('1') 
 console.log(s) // {1}
 
 let arr = [1,2,3,1];
 let newSet = new Set(arr);
 console.log('去重',newSet );

proxy(代理对象)
es5中,我们可以使用 Object.defineProperty和Object.defineProperty来实现对对象的监听。
Proxy 代理的作用,好处是将 条件 和 对象 隔离开,利于后期代码维护


let obj = {
    name: "猿跑跑",
    age: 28
}

let p = new Proxy(obj, {
    get: function(target, key) {   // 获取的拦截函数(获取时执行)
        if(key in target) {
            console.log(target[key])
        } else {
            console.log("对象没有此属性");
        }
    },
    set: function(target, key, value) {   //设置的拦截函数(值设置时执行)
        target[key] = value;
        console.log("设置成功,值为:",target[key]);
    },
    has: function (target,key) { // 是否存在某个属性
        if (key in target) { // 判断obj对象中是否存在key属性
            console.log('存在');
        } else {
            console.log('不存在');
        };
    }
});

p.age = 22;    // 设置
p.age; // 22
p.height;  // 对象没有此属性
'age' in p; // 存在
'weight' in p; // 不存在


一、filterfilter 是`过滤`的意思,所以这个方法的作用就是返回一个匹配过滤条件的新数组,
let arr = ['a','b','a','c'];
let newArr = arr.fillter((item)=>{
    return item === 'a';
})
console.log(newArr) //['a','a']

场景:数组去重、取交集 
var a = [1, 2, 3, 4] 
var b = [3, 4, 5, 6] 
let intersection = a.filter(v => b.includes(v)) 
let difference = a.concat(b).filter(v => !a.includes(v) || !b.includes(v)) 
console.log('交集', intersection) 
console.log('去重', difference)


求数组的最小值
var arr = [23, 45, 40, 30, 12];
var iMin = Math.min(...arr);
console.log(iMin);

文件导出:
    //  es5的导出
    module.exports = 'bmw7';

    //  es6的导出(带默认接口)
    export default {
       str:'bmw6'
    }

文件导入:
    //  es5导入模块
    var modeA = require('./mod/a.js');

    //  es6导入模块
    import modeA from './mod/a.js'

模块化
es6:
如果:导出为
     export default  obj
那么:引入为
     import modeA from './mod/a.js'

如果:导出为
     export const str = aaa
那么:引入为
     import { str } from './mod/a.js'

const getDate = () => {
    let d = new Date();
    return d.getFullYear() + '-' + (d.getMonth() + 1) + '-' + d.getDate();
};

export { getDate };


module.js导出:
a.js导入:
这两者的区别是,export {<变量>}导出的是一个变量的引用,export default导出的是一个值
什么意思呢,就是说在a.js中使用import导入这2个变量的后,在module.js中因为某些原因x变量被改变了,那么会立刻反映到a.js,而module.js中的y变量改变后,a.js中的y还是原来的值
链接:https://juejin.im/post/5c6234f16fb9a049a81fcca5

箭头函数的简写:
函数: 有大括号并有返回值时。this指向创建它的作用域,而我们通常说的运行环境。

(a)=>{
   return  'b'
}
es6可写成 :
      a => 'b'

复制(延展)数组:(只能复制一层,不能复制嵌套很多层 ,不能深度 复制) ver  arr  =  [ 'a'  ,  'b'  ] ...arr     ===    'a'  ,  'b'            将arr数据拿出来 [ ...arr ]    ===   复制数组 (将arr数据拿出来,放到一个新的数组) 对象的延展 let obj1 = {     name: '李四',     age: 6 } let obj2 = {     ...obj1,     height: 160 } console.log('扩展后', obj2);

 

posted @ 2019-08-20 13:34  longpanda_怪怪哉  阅读(227)  评论(0编辑  收藏  举报
下定决心了,要把写不出代码就摸后脑勺的习惯给改了! 如果可以~单身待解救~~