• js糟粕


    正在看《javascript语言精粹》,遇到明显的特点就记录下来,以防看了白看(噗噗~)

    为了不误导,形成错误印象,文中 ‘错误设计‘ 写成 ‘现有设计’,’正确设计‘ 写成 ’期待设计‘。然而期待只能是期待,因为他已经被使用的太广泛了。。。不能说改就改了

    1.js中this指向:

      函数调用有四种模式,方法调用、函数调用、构造器调用和apply调用模式。

      现有设计:其中函数调用模式与其他不同,this被绑定到全局对象。

      期待设计:绑到外部函数的this。

    2.参数arguments并不是一个真正的数组

      (ps:就像一个男人被阉割了一样---有心无力---有心无力,它只是一个拥有length属性的array-like对象,并没有数组方法)

    3.作用域

      js木有块级作用域,,,所以最好在函数开头部分声明所有用到的变量。

    4.全局变量

      糟糕之中的战斗鸡!如果全局变量名称碰巧和子程序中的变量名相同,那他们将会相互冲突导致程序无法运行,通常还难以调试。

      全局变量声明有三种方式:①不在任何函数内 var foo = value;②全局对象window下 window.foo = value;③直接使用未声明变量 foo = value;

    5.自动插入分号

      哎,,,本来一片好心却变成画蛇添足了。。。你如果这样写代码: 

    return
        {
            status: true  //会在行末加一个分号;
        }
    

      注意啊,为了避免,只能这样写了:囧~

    return {
            status: true
        }
    

    6.保留字

      占着茅坑不拉屎,搞了那么多保留字但大多数并没有在语言中使用,保留字不能命名变量、参数。当其被用作对象的键值时,他们必须被括号引起来,所以只能用[]表示法。

    var class;    //非法
    
    object = {case: value};    //非法
    
    object['case'] = value;      //ok
    
    object.case = value;        //非法
    

    7.Unicode

      设计javascript的时候,作者预计 Unicode 最多只会有 65536 个字符,他没想到人们这么有情趣,从那以后它的容量慢慢增长到了1百万个字符~

    8.typeof(识别运算数类型,返回类型字符串)

      typeof   null  //返回 'object' 而不是 'null'

      value  ===  null  //检测null的好方法

      另外检测对象的值时,null可能混淆,typeof不能分辨,所以利用null为假,对象为真来实现:

    if (value  &&  typeof  value  ===  'object') {
      //value 值为对象或者数组。
    }
    
    typeof    /a/    //正则在最新浏览器下返回 'object' ,旧版可能返回'function'

    9.parseInt 将字符转为整数。

    parseInt('16');
    > 16
    
    parseInt('16df');
    > 16
    
    parseInt('011');    //0开头的字符串按,十进制
    > 11
    
    parseInt(011);    //0开头的数字按,八进制了
    > 9
    
    parseInt('0x11');    //0x开头的字符串和数字都按16进制
    > 17
    
    parseInt(0x11);
    > 17
    
    //有木有乱了啊,,,所以第一个带上引号,再带上基数参数就不用怕了,默认为10进制
    parseInt('011', 8);
    > 9
    
    parseInt('0x11', 16);
    > 17
    

    10. +

      书中说‘+’ 号也是糟粕,原因如下

    1 + 2 + ''
    "3"
    1 + '' + 2 + 4 + ''
    "124"

    11. 浮点数

      这是遵循浮点数算数标准(IEEE 754)而有意导致的结果,浮点数中整数运算是正确的,所以小数表现出来的错误可以通过指定精度来避免。我只知道有个toFixed()函数。你还可以乘以100,运算完毕再降结果除以100,就相当于精确到了两位。。。同理

      0.1 + 0.2  !==  0.3

    0.1 + 0.2
    0.30000000000000004
    
    .1 + .2
    0.30000000000000004
    

    12.  NaN 一个特殊的数量值,并不是一个数字。

    typeof NaN
    > "number"    //即使返回 'number' ,它也不是个数字
    
    + '1'
    > 1                //即使试图把非数字转为数字,它还不是个数字
    
    + 'oops'
    > NaN            //即使。。。它不是数字
    

      这样一来也就有个定理:如果产生了NaN的结果,你至少有一个输入项为NaN或者某个地方产生了NaN 

    NaN === NaN
    false
    
    NaN !== NaN
    true
    
    //只分辨数字和NaN
    isNaN(NaN)
    > true
    isNaN('a')
    > true
    isNaN(1)
    > false
    

      但是当你希望判断一个值是否为数字时,怎么能让NaN不混淆你呢?

    //完美了。
    function isNumber(val) {
        return typeof val === 'number' && isFinite(val);
    }
    
    //世界上最短的。。刚看到一篇博客来补充下
    function isNumber(val) {    
        return val === +val;    //不能被转为数字的val为false,其余为数字。。。
    }
    
    isNumber(1)
    > true
    
    isNumber(NaN)
    > false
    
    isNumber('1')
    > false
    

      

    13.伪数组

      

     

       

  • 相关阅读:
    Django搭建开发‘学习笔记’项目二(创建应用程序)
    Django搭建开发‘学习笔记’项目一(建立项目)
    WEB渗透 --- 常见问题总结
    ConstraintLayout使用手册
    Java源码分析(1):二分查找 + 循环递归实现
    小黄衫买家秀
    Android权限申请完全解析(一):Android自带的权限申请
    个人作业——软件工程实践总结作业
    beta阶段学习博客(一) js交互
    个人作业——软件产品案例分析
  • 原文地址:https://www.cnblogs.com/luckythan/p/4801322.html
Copyright © 2020-2023  润新知