美文网首页
饿了么Node.js进阶教程系列之JS基础问题

饿了么Node.js进阶教程系列之JS基础问题

作者: 2f1b6dfcc208 | 来源:发表于2017-10-31 15:57 被阅读24次

    在Node.js中,除了SSR/爬虫之外,我们很少会操作DOM、BOM,而是直面服务器,更多的是偏向内存方面(文件操作,网络I/O等),所以编写安全可靠的JS代码非常重要,因此,需要掌握扎实的JS基础,甚至一些JS的奇淫技巧。(我个人非常推荐使用TypeScript,Type + ES.next,如果在编译期间甚至代码编写时就能发现一些错误,这将大大提高代码的可靠性)。下面是本小节的目录(然而简书的Markdown编辑器并不支持页内的目录跳转...)

    类型判断

    JS中目前有7种数据类型,其中undefined、null、string、number、boolean、symbol是六种基本类型,object是复杂(引用)类型。一般情况下使用typeof判断值的类型,使用instanceof判断某个对象是否是某构造函数的实例。
    但是有一些bug:

    typeof null  //object
    
    let fn = function(){};
    typeof fn  //function
    

    在判断两个值是否相等时,==只要求值相等,当类型不同时会自动进行类型转换;===为严格相等,要求类型和值都相同才为true.

    undefined==false //true
    null==false      //true
    0==false         //true
    NaN==false       //true
    ''==false        //true
    

    上面的五种情况都为true,这是JS中所有自动转换为boolean类型后值为false的情况,其它情况皆转换为true。

    undefined==null //true
    NaN==NaN        //false
    

    上面是两个特例,当不同类型的值使用==比较时,隐式转换规则如下(按下列优先级):

    如果任一值是undefined或null,它们互相相等,但与其它的值都不相等

    undefined==null   //true
    undefined==false  //false
    undefined==0      //false
    

    如果任一值是数字类型,则将与之比较的值转换为数字

    1==false //false
    2==true  //false
    0==[]    //true , 由Number([])可得结果为0
    1==[1]   //true
    12==[1,2] //false  右侧转换为数字为NaN
    1=='1'    //true
    1=='1a'   //false  右侧转换为数字为NaN
    

    如果任一值是boolean类型,则将与之比较的值转换为boolean类型,这里有些特殊情况*

    []==false   //true
    {}==false   //false
    Boolean([]) //true
    Boolean({}) //true
    /*此处应该将第一行理解为[]转换为数字0,false也转换为数字0,所以值相等*/
    
    !{}==false //true
    ![]==false  //true
    /*!优先级比==高,先将[]转换为布尔值true,所以![]的值为false*/
    
    ![]==[]    //true
    

    除去上面四种数据类型,只剩下string、object、symbol三种数据类型了,其中symbol类型的值有些特殊,除了自身以外,不与任何值相等,虽然它使用Boolean()转换为布尔值为true,但它与true并不相等

    const s=Symbol('s')
    const y=Symbol('s')
    s==s  //true
    s==y  //false
    Boolean(s) //true
    s==true //false
    

    当字符串与对象比较时,对象会转换成字符串,再进行比较

    '1'==[1]  //true
    

    当对象与对象比较时,除非是相同的引用,否则为false。

    const a={},b={}
    a==b  //false
    a=={}  //false
    b=={}  //false
    const c=a;
    c==a  //true
    

    因此,除去symbol,undefined,null以后,number类型的优先级最高,也可以理解为隐式类型的转换最后都是数值的比较。但是在实际代码编写中,极不推荐使用==,哪怕你和我一样也对这些转换规则铭记于心 ☋ ☋ ☋ ,总之最好是全部使用===来判断两个值是否相等,不过在使用===时也有两个特殊情况:

    NaN===NaN  //false
    +0===-0    //true
    

    现在ES6中提供了一个新的方法Object.is(value1,value2)用来判断两个值是否相同,修复了===的两个bug

    Object.is(NaN,NaN)  //true
    Object.is(+0,-0)  //false
    

    补充:对于引用类型的深拷贝,可以使用JSON.parse和JSON.stringify,如数组:

    let obj={name:'ht'};
    
    let arr1=[1,2,obj],arr2;
    
    arr2=JSON.parse(JSON.stringify(arr1))
    arr2[2].name='wt';
    
    console.log(arr1)  //[1,2,{name:'ht'}
    console.log(arr2)  //[1,2,{name:'wt'}
    
    作用域
    引用传递
    • js中什么类型是引用传递,什么类型是值传递?如何将值类型的变量以引用的方式传递?
      答:简单点说,对象是引用传递,基础类型是值传递,通过将基础类型包装可以以引用的方式传递。其实严格来说JS中没有引用传递,只是传递引用。
    内存释放
    ES6新特性

    相关文章

      网友评论

          本文标题:饿了么Node.js进阶教程系列之JS基础问题

          本文链接:https://www.haomeiwen.com/subject/qwpvpxtx.html