zoukankan      html  css  js  c++  java
  • (五)我的JavaScript系列:JavaScript的糟粕

    泪眼问花花不语,乱红飞过秋千去。

    JavaScript的糟粕

    JavaScript语言是一门集精华与糟粕于一体的语言。在JavaScript: the good parts中,便集中讨论了关于精华与糟粕的主题。有兴趣的同学可以读读这本书,真的不错。基础不错的可以跳过前面的章节,直接进入附录的糟粕鸡肋的部分。我呢,就先在这本书里列举几个我感兴趣的糟粕部分与大家分享:

    全局变量

    这恐怕是JavaScript当中最坑的部分了。先且不论全局变量的种种坏处了。在JavaScript中,定义一个全局变量是很轻松的一件事,可以通过下面的三种方式:

    1. 在函数外通过var定义:

      var foo = value;

    2. 绑定到全局对象window:

      window.foo = value;

    3. 在任何地方不通过var定义变量:

      foo = value;

    这里的准则就是一般不要在函数外定义变量(即便是通过var),定义变量时一定不能忘记var(但忘记var又是件很常见的错误)。

    作用域

    JavaScript中的只有全局作用域和函数作用域两种,没有块作用域。同一个函数内的所有变量属于同一个作用域。例如下面的代码,foo的作用域不是if块,而是函数foo,所以在if块之外依然可以访问foo。

    function f() {
      if(true) {
         var foo = 'foo';
      }
      console.log(foo); //依然可以访问foo
    }
    

    所以一种推荐的方式是在函数的顶部声明变量,就像C语言那样做。整个函数看上去就像下面的形式:

    function f() {
      var a, b, c; //在函数顶部声明函数内使用的所有变量
    
      a = b = c = 2; //然后再使用变量
    }
    

    不过,像这样编程是一种很烦的方式。

    自动插入分号机制

    JavaScript会在每行末尾自动插入一个分号,只要语法允许。例如下面的代码

    return
    { 
       status: true
    };
    

    会被转化为:

    return;
    { 
       status: true
    };
    

    但下面的代码却不会(因为插入分号语法上不允许):

    return {
       status: true
    }
    

    所以为了避免理解上的歧义,JavaScript最佳实践建议手动加上分号,而不要依赖语言的自动插入分号机制。不过,现代语言(Ruby、Python等)基本都去掉分号行为了,每行代码都要加上个分号也是个烦人的事。

    保留字

    JavaScript上定义了很多但压根没用上的保留字,例如:abstract, boolean, byte, int

    typeof

    JavaScript的typeof往往文不对题,例如:

    typeof null === 'object'
    

    所以,用到typeof时,往往要多加小心。

    浮点数

    JavaScript中的数字没有整数类型,只有浮点数类型(实际为IEEE 754,即C语言的double类型)。众所周知,浮点数得到的结果是不精确的。不过好在浮点数表示的整数,它们之间的运算是精确的。

    False值

    JavaScript中,有很多值能够表示假值:

    1. 0
    2. NaN (非数)
    3. ‘’ (空字符串)
    4. false
    5. null
    6. undefined

    所以,在使用if条件判断的时候,要适当注意下。

    ==

    在JavaScript中,有两种形式的等号操作符:=====。其中==存在坑的地方。它在比较前,会先尝试进行类型转化再去比较。这里的问题在于,类型转化的规则太过复杂了,很难掌握。例如

    '' == '0'    //false 
    0 == ''      //true
    0 == '0'    //true
    

    ===在比较的时候不会进行类型转化,只有类型相同和值相等的两个对象才会返回true。

    缺少块符号的语句

    块符号,即{}。在JavaScript中,ifwhilefor内部的语句需要用大括号括起来。例外的情况是它们下面只有一条语句的时候。

    if(ok)
      t = true;
    

    不过这不是建议的方式。JavaScript最佳实践要求无论何种情况都要加上大括号,除非它们写在同一行。要么

    if(ok) {
      t = true;
    }
    

    要么

    if(ok) t = true;
    

    第二种明显不怎么易看。

    new语句

    JavaScript的构造器函数需要通过new新建对象。如果忘记new,那它就是一个普通的函数调用,this被绑定到全局对象window。此时是非常危险的。

    function Dog(name) {
      this.name = name;
    }
    
    Dog.prototype.bark = function() {
      return 'I am ' + this.name;
    }
    

    当调用构造器函数时,千万别漏掉new。JavaScript最佳实践甚至建议不要使用构造器函数,也就是不要通过new来新建对象。它的意思大概是像下面这样新建对象:

    function dog(name) {
      var dog = {};
      dog.bark = function() {
         return 'I am ' + name;
      }
      return dog;
    }
    

    这是我以前经常用的一种方式。这里利用闭包的特性将name化为私有变量。一个很明显的缺点是bark函数被定义了多次。

    就该被遗忘的特性

    下面的一些特性我从来没接触过,据说是坑人的特性。既然这样,我也不要去学习它们了。大家直接忽略它们就可以了。

    1. with语句
    2. eval函数
    3. ++ -- (不要a++,用a+=1替代)
    4. 位运算符 (& | ^ ~ >> <<)

    相关资源

    一些推荐的JavaScript学习教程

  • 相关阅读:
    使用Eclipse创建Maven的JSP项目
    MySQL远程访问
    IDEA创建web工程,不用Archetype(超简单)
    IDEA创建web工程(超简单)
    共享软件
    C语言讲义——链表完整代码
    base64图片显示问题
    JAVA 判断一个字符串是否是合法的日期格式?
    SpringBoot配置本地文件映射路径
    SpringBoot读取资源目录下的文件
  • 原文地址:https://www.cnblogs.com/starstone/p/4861354.html
Copyright © 2011-2022 走看看