本周学习总结(原生+Echarts地图)

本周主要想完成工作中大屏地图相关的知识,所以学习的时间不是很长

dsa.js(数据结构)

拖了两个星期还没看,等啥时候继续研究算法和数据结构再看源码

GoJS

有时间要好好研究下
https://github.com/NorthwoodsSoftware/GoJS

sketchjs 画图

http://soulwire.github.io/sketch.js/

发现一个api直接看怎么实现的

https://collect.js.org/api

JavaScript 语言精髓

https://lxchuan12.github.io/js-book/#array

对象

属性名可以是包括空字符串在内的所有字符串

属性值可以是除了undefined值之外的任意值

检索.[]

推荐点`.`表示法,尝试从undefined的成员属性中取值将会导致TypeError异常
`更新` 如果属性名已经存在对象里,那么属性的值会被替换,如果之前没有这个属性名,就会将该属性将被扩展到对象里
`引用` 对象通过引用来传递,他们永远不会被复制
`原型` 所有通过对象字面量创建的对象都链接到`Object.prototype` 创建新对象时,可以选择某个对象作为它的原型
原型连接只有在检索值得时候才被用到,如果尝试去获取对象某个属性值,但对象没有此属性名,那么就会从原型中获取属性值,如果那么原型对象也没有该原型中寻找,只要最后达到Object.prototype,
如果想要得属性完全不存在原型链中,那么结果就是`undefined`值,这个过程称为委托

underscore源码解读

https://github.com/lessfish/underscore-analysis

https://yoyoyohamapi.gitbooks.io/undersercore-analysis/content/base/%E7%BB%93%E6%9E%84.html

void 0 代替undefined

1.   低版本IE中能被重写,但是undefined在ES5已经是全局对象的一个只读属性了,他不能被重写,但是在局部作用域中,还是可以被重写的
    const add=()=>{
      let undefined=3;
      console.log(undefined)
    }
    add();//3

2. void运算符能对给定的表达式求值,然后返回undefined,
    也就是void后面随便跟上一个表达式,返回的都是undefined
其中   void 0 最短
void 1      //undefined
void (1+1)   //undefined
void (new Date())  //undefined
为了节省字段,很多代码压缩工具,正是将undefined用 void 0 替换

 
0.._    你也可以用这个(这个更短)    其实的意思就是 0['_']

使用 == 还是有一定的风险
console.log(undefined == null) //true
console.log(undefined !== null) //true

call 和apply 的异同

相同点

  1. 都是改变this的指向

  2. 都可以只传递一个参数

    function doSth(){
      console.log(this);
    }
    console.log(doSth.apply('0'))//[String: '0']
    console.log(doSth.call(true))//[Boolean: true]
    

不同点

apply只接收两个参数,第二个参数可以是数组也可以是类数组,其实也可以是对象,后序参数忽略不计

function doSth(a,b){
  console.log(this);
  console.log([a, b])
}
console.log(doSth.apply('0',[1,2]))
// [String: '0']  [1,2]
console.log(doSth.call(true,1,2))
//[Boolean: true]  [1,2]

函数的第一个参数 thisArg值被指定为nullundefined 时,this 值会自动替换为指定全局对象,原始值则会自动包装,也就是new Object()

判断对象

把类型为function 和Object 变量都算做对象,而且去除掉null

const isObject = obj => {
  let val = typeof obj;
  return val === 'function' || val === 'object' && !!val
}
//简写
const isObject = obj =>
  (val => val === 'function' || val === 'object'&&!!val)(typeof obj)

判断其他类型

'Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp', 'Error' 这些类型的判断

const _ = {};
['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp', 'Error'].forEach(val => {
  _['is' + val] = obj => Object.prototype.toString.call(obj) === '[object ' + val + ']'
})

判断NaN

const isNaNs=val=>typeof val==='number'&&val!==val;

判断元素是否是DOM元素

const isElement = type => !!(type && type.nodeType === 1)

判断两个数是否相等

const eq = (a, b) => a === b && (a !== 0 || 1 / a === 1 / b)

位运算

num & 1   相当于  num%2

js-base64

https://github.com/dankogai/js-base64/blob/master/base64.js

打印编码表
var b64chars
  = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
//b64tab 是编码好的一个对象
var b64tab = function(bin) {
  var t = {};
  for (var i = 0, l = bin.length; i < l; i++) t[bin.charAt(i)] = i;
  return t;
}(b64chars);

//简化
let b64 = (()=>
    'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.
    split('').reduce((acc, val,index) => {
        acc[val]=index;
        return acc
    },{})
)()

原生技巧

const isInt=x=>x%1===0;
const isObject=obj=>Object.prototype.toString.apply(obj)==='[object Object]';

查某个字符在字符串的重复次数
const count = (str, substr) => {
  let count = 0;
  let pos = str.indexOf(substr)
  while (pos >= 0) {
    count++
    pos = str.indexOf(substr, pos + 1)
  }
  return count
}

let jStat = {}

function extend(obj) {
    let i, j
    if (arguments.length === 1) {
        for (j in obj) {
            jStat[j] = obj[j]
        }
        return this
    }
    for (i = 1; i < arguments.length; i++) {
        for (j in arguments[i]) {
            obj[j] = arguments[i][j]
        }
    }
    return obj
}
extend({name:'age',age:'xxx',aa:'vvv'})
console.log(jStat)
//{ name: 'age', age: 'xxx', aa: 'vvv' }

//简化
const extend = (...obj) => {
    obj.forEach(val => {
        Object.keys(val).forEach(item => {
            jStat[item] = val[item]
        })
    })
    return jStat
}


console.log(extend({name: 'age'},{age:'xxx'}))
//{ name: 'age', age: 'xxx' }

const min = arr => {
  let i = 0,
    low = arr[0];
  while (++i < arr.length) {
    if (arr[i] < low) {// max   arr[i]>low
      low = arr[i]
    }
  }
  return low
}

const sum = arr => {
  let sum = 0;
  let i = arr.length;
  while (--i >= 0) {
    sum += arr[i]
  }
  return sum
}

中位数
先排序
偶数  8    4,5位数的和除以2
奇数  就是中间的那个数

互斥

xor(true, true);   // false
xor(true, false);  // true
xor(false, true);  // true
xor(false, false); // false

const xor = (...args) => args.reduce((a, b) => !(a && b) && !(!a && !b));

解构

let o = {
  name: 'aaa',
  age: 'bbb',
  xxx:'ccc'
};
let {name, age} = o;
console.log(name, age);
//'aaa'   'bbb'

for (let item in o) {
  console.log(item);//name age
}

let {name,...args}=o;
console.log(name); //aaa
console.log(args);//{ age: 'bbb', xxx: 'ccc' }

一道有趣的面试题

let a={name:'xxx'}
let c={key:'xxx'}
let b={};
b[a]=123;// 属性的a 从对象转成字符串 [object Object]
b[c]=345;// c 同上
console.log(b)//{ '[object Object]': 345 }

模板字符串(标签模板)

它可以紧跟在函数后面,该函数将调用来处理这个模板字符串,称为"标签模板"
//也就是第一个参数是字符串切割的数组,第二个参数是一个迭代的类数组,也就是变量
const template=(strings,...keys)=>{
    console.log(strings) //[ 'wo shi', 'yige sha ', '' ]
    console.log(keys) //[ '我', '傻' ]
    return keys  //可以用return 返回自己需要的
}
let a='我'
let b='傻'
let c=template`wo shi${a}yige sha ${b}`
console.log(c) //[ '我', '傻' ]

angular8的时候你发现使用@ViewChild编辑器报错

父组件拿到子组件的ID
  @ViewChild('unable',{static:true}) whose!: ElementRef;

Echarts 地图相关知识

 let seriesA=[
                    {
                        type:'lines', //攻击线的球
                        zlevel:2,  //Canvas 分层,大的在小的上面
                        effect:{ // 线特效的配置
                            show:true,//显示特效
                            period:2,//箭头指向速度,值越小速度越快
                            trailLength: 0.01, //特效尾迹长度[0,1]值越大,尾迹越长重
                            symbol: 'arrow', //箭头图标
                            symbolSize: 5, //图标大小
                        },
                        lineStyle:{
                            normal:{//正常的模式
                                width: 1, //尾迹线条宽度
                                opacity: 1, //尾迹线条透明度
                                curveness: .3 //尾迹线条曲直度
                                color:'颜色'
                            }
                        },
                         data:[
                            [
                                {coord:[127.9688,45.368],value:0.88}, //起点
                                {coord:[126.9688,45.868]}//终点
                            ],
                             ...
                        ]
                    },
                   // 涟漪
                    {
                        type: 'effectScatter', //涟漪特效,就是地址的波纹
                        coordinateSystem: 'geo',//坐标系:使用地理坐标系
                        zlevel: 2,// 分层,小的图新会被大的图形覆盖
                        rippleEffect: { //涟漪特效
                            period: 4, //动画时间,值越小速度越快
                            brushType: 'stroke', //波纹绘制方式两种 stroke, fill
                            scale: 4 //波纹圆环最大限制,值越大波纹越大,就是半径
                        },
                        label: {//图形的标签
                            normal: {//默认模式
                                show: true,//显示标签(文字)
                                position: 'right', //显示位置
                                offset: [5, 0], //偏移设置,[x,y]
                                formatter: function(params) { //圆环显示文字;标签内容格式器
                                    return params.data.name;
                                },
                                fontSize: 13
                            },
                            // emphasis: {// 高亮的标签和图形样式,就是鼠标附上去,标签的变化
                            //     show: true
                            // },
     				   },
                        symbol: 'circle',//起点:标记的图形
                        // symbolSize:8,  默认为10
     			       data:[
                              {name:'黑龙江',value:[127.9688,45.368,0.88]},
                                ...
                            ]
                    },
                        //被攻击点 ,跟攻击点的属性类似
                        //type:'scatter' //气泡图
                        //symbol: 'pin',
                ]
 let seriesA=[
                    {
                        type:'lines', //攻击线的球
                        zlevel:2,  //Canvas 分层,大的在小的上面
                        effect:{ // 线特效的配置
                            show:true,//显示特效
                            period:2,//箭头指向速度,值越小速度越快
                            trailLength: 0.01, //特效尾迹长度[0,1]值越大,尾迹越长重
                            symbol: 'arrow', //箭头图标
                            symbolSize: 5, //图标大小
                        },
                        lineStyle:{
                            normal:{//正常的模式
                                width: 1, //尾迹线条宽度
                                opacity: 1, //尾迹线条透明度
                                curveness: .3 //尾迹线条曲直度
                                color:'颜色'
                            }
                        },
                         data:[
                            [
                                {coord:[127.9688,45.368],value:0.88}, //起点
                                {coord:[126.9688,45.868]}//终点
                            ],
                             ...
                        ]
                    },
                   // 涟漪
                    {
                        type: 'effectScatter', //涟漪特效,就是地址的波纹
                        coordinateSystem: 'geo',//坐标系:使用地理坐标系
                        zlevel: 2,// 分层,小的图新会被大的图形覆盖
                        rippleEffect: { //涟漪特效
                            period: 4, //动画时间,值越小速度越快
                            brushType: 'stroke', //波纹绘制方式两种 stroke, fill
                            scale: 4 //波纹圆环最大限制,值越大波纹越大,就是半径
                        },
                        label: {//图形的标签
                            normal: {//默认模式
                                show: true,//显示标签(文字)
                                position: 'right', //显示位置
                                offset: [5, 0], //偏移设置,[x,y]
                                formatter: function(params) { //圆环显示文字;标签内容格式器
                                    return params.data.name;
                                },
                                fontSize: 13
                            },
                            // emphasis: {// 高亮的标签和图形样式,就是鼠标附上去,标签的变化
                            //     show: true
                            // },
     				   },
                        symbol: 'circle',//起点:标记的图形
                        // symbolSize:8,  默认为10
     			       data:[
                              {name:'黑龙江',value:[127.9688,45.368,0.88]},
                                ...
                            ]
                    },
                        //被攻击点 ,跟攻击点的属性类似
                        //type:'scatter' //气泡图
                        //symbol: 'pin',
                ]
posted @ 2019-08-25 18:04  猫神甜辣酱  阅读(798)  评论(0编辑  收藏  举报