日报_31

194 阅读4分钟

2020年6月3日 星期三

Everything goes back to the way it was.


今天呢主要学习了一个新的知识点:《lodash》:Lodash是一个一致性、模块化、高性能的 JavaScript 实用工具库。不需要引入其他第三方依赖。是一个意在提高开发者效率,提高JS原生方法性能的JS库。简单的说就是,很多方法lodash已经帮你写好了,直接调用就行,不用自己费尽心思去写了,而且可以统一方法的一致性。Lodash使用了一个简单的 _ 符号,就像Jquery的 $ 一样,十分简洁。 类似的还有Underscore.js和Lazy.js;还有momentjs的库

简单简绍一下lodash的安装以及使用:

安装

浏览器环境:

    <script src="lodash.js"></script>

通过 npm:

    $ npm i -g npm
    $ npm i --save lodash

通过CDN进行引入

<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.15/lodash.min.js"></script>

为什么选择lodash呢?

Lodash 通过降低 array、number、objects、string 等等的使用难度从而让 JavaScript 变得更简单。

Lodash 的模块化方法 非常适用于:

遍历 array、object 和 string

对值进行操作和检测

创建符合功能的函数

简绍一些lodash常用函数:

1.chunk,将数组进行切分。

    let arr = [1,2,3,4,5,6,7,8,9];
    _.chunk(arr,2);
    // 这个函数把数组按照一定的长度分开,返回新的数组。(片段化数组)

2.compact,去除假值。(将所有的空值,0,NaN过滤掉)

    _.compact(['1','2',' ',0]);
    // => ['1','2']

3.uniq,数组去重。(将数组中的对象去重,只能是数组去重,不能是对象去重。)

    _.uniq([1,1,3]);
    // => [1,3]

4、创建一个新数组,将array与任何数组 或 值连接在一起。

    const arr = [1,2,3,4,5,6,7,8,9];
    const arr1 = ['w','e','r'];
    
    // => [1, 2, 3, 4, 5, 6, 7, 8, 9, Array(3)]

5、创建一个具有唯一array值的数组,每个值不包含在其他给定的数组中。(数组去重);

    const = [3, 2, 1], [4, 2];
    _.difference([3, 2, 1], [4, 2]);
    // => [3, 1]

lodash官网:www.lodashjs.com/docs/lodash…


Moment的使用以及简绍

Moment 被设计为在浏览器和 Node.js 中都能工作,主要用于日期和时间处理;

所有的代码都应该在这两种环境中都可以工作,并且所有的单元测试都应该在这两种环境中运行。

CI 系统当前使用以下的浏览器:Windows XP 上的 Chrome,Windows 7 上的 IE 8、9 和 10,Windows 10 上的 IE 11,Linux 上最新的 Firefox,OSX 10.8 和 10.11 上最新的 Safari。

如果您想尝试以下的示例代码,则只需打开浏览器的控制台并输入即可。

安装方法

    npm install moment --save   # npm
    yarn add moment             # Yarn
    Install-Package Moment.js   # NuGet
    spm install moment --save   # spm
    meteor add momentjs:moment  # meteor
    bower install moment --save # bower (废弃)

浏览器

<script src="moment.js"></script>
<script>
    moment().format();
</script>

日期格式化

    moment().format('MMMM Do YYYY, h:mm:ss a'); // 六月 3日 2020, 9:42:23 晚上
    moment().format('dddd');                    // 星期三
    moment().format("MMM Do YY");               // 6月 3日 20
    moment().format('YYYY [escaped] YYYY');     // 2020 escaped 2020
    moment().format();                          // 2020-06-03T21:42:23+08:00

相对时间

    moment("20111031", "YYYYMMDD").fromNow(); // 9 年前
    moment("20120620", "YYYYMMDD").fromNow(); // 8 年前
    moment().startOf('day').fromNow();        // 1 天前
    moment().endOf('day').fromNow();          // 2 小时内
    moment().startOf('hour').fromNow();       // 42 分钟前

日历时间

    moment().subtract(10, 'days').calendar(); // 2020/05/24
    moment().subtract(6, 'days').calendar();  // 上星期四21:42
    moment().subtract(3, 'days').calendar();  // 上星期日21:42
    moment().subtract(1, 'days').calendar();  // 昨天21:42
    moment().calendar();                      // 今天21:42
    moment().add(1, 'days').calendar();       // 明天21:42
    moment().add(3, 'days').calendar();       // 下星期六21:42
    moment().add(10, 'days').calendar();      // 2020/06/13

moment官网: momentjs.cn/docs/


animate.css

animate.css  他是一款强大的预设css3动画库!

安装及使用

使用npm安装:

    $ npm install animate.css --save

使用with yarn安装:

    $ yarn add animate.css

或使用CDN将其直接添加到您的网页中:

  cdn网址: https://cdnjs.com/libraries/animate.css/
<head>
  <link rel="stylesheet"
    href="https://cdnjs.cloudflare.com/ajax/libs/animate.css/4.0.0/animate.min.css"
  />
</head>

案例演示

    <!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/animate.css/4.0.0/animate.min.css" />
    <style>
        * {
            margin: 0;
            padding: 0;
            list-style: none;
        }

        .box {
            width: 300px;
            height: 100px;
            background-color: darkgray;
            margin: 200px auto;
        }
    </style>
</head>

<body>
    <div class="box animate__animated animate__backInDown"></div>
</body>
</html>

js获取Dom的方法

获取id的方法:document.getElementById("");
    getElementById()括号中的不需要在前面加“#”,因为方法就决定了括号中的值是一个元素的id
    值。该方法返回一个DOM对象。

class获取的方法:document.getElementsByClassName();

通过标签名获取:document.getElementsByTagName("p");

通过name属性获取的方法: document.getElementsByName("");

    注意:只有含有name属性的元素(表单元素)才能通过name属性获取
    
通过querySelector获取的方法:document.querySelector("");

    注意:querySelector()方法括号中的值是元素的选择器,所以前面加了”#”符号,使用的是id
    选择器。此方法直接返回DOM对象本身。
通过querySelectorAll获取的方法:document.querySelectorAll("");
    
    注意:querySelector()和querySelectorAll()方法括号中的取值都是选择器,但从图中我们可
    以看出,两个方法是有区别的。当有多个class相同的元素时,使用querySelector()方法只能
    获取到第一个class为box的元素,而querySelectorAll()获取到了所有class为box的元素集合

深拷贝浅拷贝

如何区分深拷贝浅拷贝:如何区分深拷贝与浅拷贝,简单点来说,就是假设B复制了A,当修改A时,看B是否会发
生变化,如果B也跟着变了,说明这是浅拷贝,拿人手短,如果B没变,那就是深拷贝,自食其力。

浅拷贝例子:

    let a=[0,1,2,3,4],
    b=a;
    console.log(a===b);
    a[0]=1;
    console.log(a,b);

明明b复制了a,为啥修改数组a,数组b也跟着变了?????????????

面试常问,基本数据类型有哪些,number,string,boolean,null,undefined,symbol以及未来E
S10新增的BigInt(任意精度整数)七类。

引用数据类型(Object类)有常规名值对的无序对象{a:1},数组[1,2,3],以及函数等。
    
a.基本类型--名值存储在栈内存中,例如let a=1;

当你b=a复制时,栈内存会新开辟一个内存,例如这样:
    
    所以当你此时修改a=2,对b并不会造成影响,因为此时的b已自食其力,翅膀硬了,不受a的影
    响了。当然,let 
    a=1,b=a;虽然b不受a影响,但这也算不上深拷贝,因为深拷贝本身只针对较为复杂的object类型数据。
.引用数据类型--名存在栈内存中,值存在于堆内存中,但是栈内存会提供一个引用的地址指向堆内存中的值,
当b=a进行拷贝时,其实复制的是a的引用地址,而并非堆里面的值。
当b=a进行拷贝时,其实复制的是a的引用地址,而并非堆里面的值。
那,要是在堆内存中也开辟一个新的内存专门为b存放值,就像基本类型那样,岂不就达到深拷贝的效果了;

实现简单的深拷贝

    function deepClone(obj){
    let objClone = Array.isArray(obj)?[]:{};
    if(obj && typeof obj==="object"){
        for(key in obj){
            if(obj.hasOwnProperty(key)){
                //判断ojb子元素是否为对象,如果是,递归复制
                if(obj[key]&&typeof obj[key] ==="object"){
                    objClone[key] = deepClone(obj[key]);
                }else{
                    //如果不是,简单复制
                    objClone[key] = obj[key];
                }
            }
        }
    }
    return objClone;
}    
let a=[1,2,3,4],
    b=deepClone(a);
a[0]=2;
console.log(a,b);

这里分享一个链接讲述深拷贝浅拷贝: www.cnblogs.com/echolun/p/7…