• 谁说JavaScript容易?


    你尝试过给一组数字排序吗?

    Javascript的sort()方法默认用来给数字排序

    所以[1,2,5,10].sort()将会输出[1, 10, 2, 5].

    要正确的对数组进行排序的话,你可以使用[1,2,5,10].sort((a, b) => a — b)

    只要你一开始就知道这个坑的话,解决起来就很容易.

    new Date()很奇妙

    new Date()可以接受:

    • 没有参数就返回当前时间
    • 一个参数x就返回当前时间1970年1月1日,+ x毫秒,Unix的人知道为什么
    • new Date(1,1,1)返回1901年,2月1日.因为你知道,第一个1意思是1900年后的1年,第二个1是这一年的第二个月(因此二月) —— 二月的正确索引在索引表中为1 ,第三个1显然是这个月的第一天,所以是1 —— 因为有时索引确实从1开始。
    • 哦,还有new Date(2016年,1,1)不会从2016年追加到1900年。它仅仅表示2016年。

    Replace不替代

    我觉得这是件好事,因为我不喜欢函数去改变他输入的值,你应该也知道replace只会替换他第一个匹配:

    let s = "bob"
    const replaced = s.replace('b', 'l')
    replaced === "lob" // first match only
    s === "bob" // original string is remained unchanged
    

    如果你想替换所有,你可以使用带有/ g的正则表达式:

    "bob".replace(/b/g, 'l') === 'lol' // replace all occurences
    

    当心比较

    // These are ok
    'abc' === 'abc' // true
    1 === 1         // true
    // These are not
    [1,2,3] === [1,2,3] // false
    {a: 1} === {a: 1}   // false
    {} === {}           // false
    

    理由:[1,2,3][1,2,3]是两个单独的数组。它们恰好包含相同的值,但是它们有不同的引用,不能用全等===比较

    数组不是原始数据类型

    typeof {} === 'object'  // true
    typeof 'a' === 'string' // true
    typeof 1 === number     // true
    // But....
    typeof [] === 'object'  // true
    

    想知道你的是不是数组, 你仍然可以使用Array.isArray(myVar)来判断

    闭包

    这是一道有名的JavaScript面试题:

    const Greeters = []
    for (var i = 0 ; i < 10 ; i++) {
      Greeters.push(function () { return console.log(i) })
    }
    
    Greeters[0]() // 10
    Greeters[1]() // 10
    Greeters[2]() // 10
    

    你是不是期望它输出0,1,2 ...? 你知道为什么它却没有输出吗? 你会如何修改它?

    我们提出两个可能的解决方案:

    使用let 来替换var。 立马解决。

    "在letvar之间的差异是作用域,var i的作用域是最近的函数块,而let的作用域是最近的封闭块,封闭块可以小于函数块。(如果在任何块之外使用的话,letvar它们都是全局的) (source)

    其他方法:使用 bind:

    Greeters.push(console.log.bind(null, i))
    

    其实有很多种方法去解决,这是我推荐的2种方法.

    聊聊绑定

    你认为这个将会输出什么?

    class Foo {
      constructor (name) {
        this.name = name
      }
      greet () {
        console.log('hello, this is ', this.name)
      }
      someThingAsync () {
        return Promise.resolve()
      }
      asyncGreet () {
        this.someThingAsync()
        .then(this.greet)
      }
    }
    new Foo('dog').asyncGreet()
    

    理由:greet没有在正确的上下文运行,同样,是有很多方法可以解决。

    我个人比较喜欢

    asyncGreet () {
      this.someThingAsync()
      .then(this.greet.bind(this))
    }
    

    这样做可以确保greet可以被作为上下文的实例调用。

    如果你不希望greet在实例上下文外运行,你还可以在类的constructor函数中绑定它.

    class Foo {
      constructor (name) {
        this.name = name
        this.greet = this.greet.bind(this)
      }
    }
    

    你还应该知道箭头函数(=>)可以被用于保留上下文。它也可以这样使用:

    asyncGreet () {
      this.someThingAsync()
      .then(() => {
        this.greet()
      })
    }
  • 相关阅读:
    gateway调用Fegin失败问题解决
    JVM调试命令简介
    oracle10g登录em后,提示“java.lang.Exception: Exception in sending Request :: null”
    vs2019中让ashx 文件中折叠收起代码
    oracle多表视图不自动更新,手动刷新视图获得基本表的数据
    可以对表单中的隐藏字段进行操纵 问题参数 __VIEWSTATEGENERATOR
    SQL Server 检测到基于一致性的逻辑 I/O 错误 页撕裂
    WIN2016和WIN10关闭同步主机服务,节省磁盘频繁读取,并关闭自动维护
    IIS网站应用程序配置不继承网站.net框架版本
    c#web错误码CS0227,不安全代码只会在使用/unsafe编译情况下出现
  • 原文地址:https://www.cnblogs.com/wbxjiayou/p/6223008.html
Copyright © 2020-2023  润新知