《js语言精粹》附录B+C:糟粕+JSLintの笔记

153 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第9天,点击查看活动详情

阅读《JavaScript语言精粹》(修订版)的笔记记录,这章讲的是js一些有问题特性,我们有必要知道这些问题并避免它们。

  • ==,会转换类型去判断,===只有类型相同值相同返回true。 弱等于转换的规则复杂。作者建议不要使用弱等于,下面是一些例子。

    ''==0 false
    0=='' true
    false==undefinded   false
    false==null false
    null==undefinded true
    详细规则参考:https://juejin.cn/post/6844903904480591880
    
  • with,结果可能有时不可预料,应该避免使用。

    with(obj){
        a=b
    }
    先判断有没有obj.a,有则赋值obj.a = obj.b||b,没有就赋值给a。
    这种方式很奇怪,但是在vue源码中模板解构可以看到有用到,很巧妙。
    
  • eval,传递字符串给编译器去执行。因为需要运行编译器,性能降低。安全性也被减弱。 定时器可以传函数也可以传字符串,要避免用字符串。

  • continue,作者说有性能问题
  • switch穿越,容易出问题,有时候很难找到问题所在
  • if,while等语句最好通通使用代码块包裹代码、避免错误
  • 位运算符,它需要把数字运算符转化成整数,执行运算,再转换回去,运算比较慢,且js执行环境一般不是硬件处理。
  • function语句和表达式,因为变量提升的原因,作者建议写成表达式的形式,避免逻辑混乱。
  • 建议{}不用new Object,因为多了个valueOf属性会让人困惑,作者真挑啊
  • new,构造函数使用的时候忘记用new,会导致对象属性声明到全局上。
  • void,没什么用,避免使用。

JSlint

一个代码质量工具。检查语法和代码风格的问题。

  • 检测拼写错误和被遗忘的var声明
  • 检测对面属性名是否拼写正确
  • JSLint在运行时接受一个选项对象作为参数,比如eviltrue表示允许使用eval
  • 要求在for等语句之外的语句都要加分号
  • 自动换行
  • 清除多余的逗号
  • if后面必须加代码块
  • switch里每个case后面加break/return/throw
  • var,只能声明一次且在使用前声明,函数也是,参数不用声明。
  • 不用with
  • if里面不要有赋值语句
  • 尽量不用==,判断的时候可以用感叹号。
  • 标签。不认识
  • 不可达代码(return/break/continue/throw)后面加 }/case/default
  • 不要出现三个 +/-
  • ++、eval、位运算这些都可以关
  • void不应该出现
  • 查找正则可能的错误
  • 要求构造函数首字母大写,不要出现new Number、String、Object
  • 也检查html,标签要求小写,有结束标签,嵌套正确。
  • 检查JSON格式
  • JSON完成扫描,会给每个函数列出很多东西,闭包,变量啥的。