当前位置: 首页 > news >正文

Javascript 正确用法 二

好的,废话不多说,接着上篇来.

变量(variables)

始终使用 var keyword来定义变量,假设不这样将会导致 变量全局化,造成污染.

//bad

superPower = new SuperPower();

//good

var superPower = new SuperPower();

使用 一个 varkeyword来定义多个变量...而且每一个变量一行..

    // bad
    var items = getItems();
    var goSportsTeam = true;
    var dragonball = 'z';

    // good
    var items = getItems(),
        goSportsTeam = true,
        dragonball = 'z';

//我个人更喜欢以下这样的定义方法.

    var items = getItems()
        ,   goSportsTeam = true
        ,   dragonball = 'z';


将未赋值的变量放在后面...

    // bad
    var i, len, dragonball,
        items = getItems(),
        goSportsTeam = true;

    // bad
    var i, items = getItems(),
        dragonball,
        goSportsTeam = true,
        len;

    // good
    var items = getItems(),
        goSportsTeam = true,
        dragonball,
        length,
        i;

将变量的定义和赋值放在 作用域的顶部,这样能避免 变量提升相关的问题..

    // bad
    function() {
      test();
      console.log('doing stuff..');

      //..other stuff..

      var name = getName();

      if (name === 'test') {
        return false;
      }

      return name;
    }

    // good
    function() {
      var name = getName();

      test();
      console.log('doing stuff..');

      //..other stuff..

      if (name === 'test') {
        return false;
      }

      return name;
    }


    // bad
    function() {
      var name = getName();

      if (!arguments.length) {
        return false;
      }

      return true;
    }

    // good
    function() {
      if (!arguments.length) {
        return false;
      }

      var name = getName();

      return true;
    }

//上面这个样例我感觉这么奇葩呢...这个name根本没有起到不论什么作用啊...


Hoisting (国内书籍翻译为 提升)

变量的定义会得到提升,也就是移动到作用域的顶部 ,可是 赋值并没有得到提升..

举个简单的样例..对于简单的 var a = 10;

事实上经历的是两个过程,

① var a;

② a = 10;

恩,,变量提升仅仅是提升的第一部分,而第二部分并没有得到提升...

    function example() {
      console.log(declaredButNotAssigned); // => undefined
      var declaredButNotAssigned = true;
    }


    function example() {
      var declaredButNotAssigned;
      console.log(declaredButNotAssigned); // => undefined
      declaredButNotAssigned = true;
    }


匿名函数表达式提升的仅仅是变量的名称,而不是函数的定义..

    function example() {
      console.log(anonymous); // => undefined

      anonymous(); // => TypeError anonymous is not a function

      var anonymous = function() {
        console.log('anonymous function expression');
      };
    }


命名函数提升的相同是变量的名称,而不是函数的名称.或者是函数体..

    function example() {
      console.log(named); // => undefined //变量名得到提升..

      named(); // => TypeError named is not a function //函数体没有得到提升..

      superPower(); // => ReferenceError superPower is not defined //函数名没有得到提升..

      var named = function superPower() {
        console.log('Flying');
      };
    }


函数定义同一时候提升他们的名称和函数体..

    function example() {
      superPower(); // => Flying

      function superPower() {
        console.log('Flying');
      }
    }

//这也就是为什么我们在我们代码的底部通过这样的方式可以訪问,可是依照之前的方式定义函数无法訪问的原因了..

//如今大家明确了吧..


Contional Expressions & Equality  条件表达式和 等式..

条件表达式会通过 类型转换 来对括号内的内容进行评估来返回 Boolean值..

转换会遵循下面规则:

1,对象返回 true

2,underfined 返回false

3, Null 返回false

4, Booleans类型就返回自己.

5, +0,0,-0,NaN 返回false ,其它返回true

6, 空字符返回false..//注意注意,假设你的字符串里面有 空格,则相同会返回true


if([0]) {

  //true

  //这个array 是我们之前提过的,是通过字面量来进行数组的创建.... 当然返回true,不要被 0 迷惑了..

}

    // bad
    if (name !== '') {
      // ...stuff...
    }

    // good
    if (name) {
      // ...stuff...
    }

    // bad
    if (collection.length > 0) {
      // ...stuff...
    }

    // good
    if (collection.length) {
      // ...stuff...
    }


代码块..

    // bad
    if (test)
      return false;

    // good
    if (test) return false;

    // good
    if (test) {
      return false;
    }

    // bad
    function() { return false; }

    // good
    function() {
      return false;
    }

    // bad
    var x=y+5;

    // good
    var x = y + 5;


相关文章:

  • 广州Uber优步司机奖励政策(1月25日~1月31日)
  • 6.Java基础知识--IO
  • fiddler+jmeter联合使用
  • 解决包含已存在的php文件,但提示就是找不到的问题
  • 2016第4周六
  • JNI学习
  • Opencv中直线的表示方法
  • Grok debugger
  • ubuntu git 简单入门【转】
  • python selenium ---键盘事件
  • Getting started with Chrome Dev Editor
  • 五月份小结
  • VmWare5.5主机Citrix桌面实施方案(四)
  • Redis官方中文翻译系列 - Redis支持
  • 【BZOJ 1066】[SCOI2007]蜥蜴
  • [译]如何构建服务器端web组件,为何要构建?
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • gf框架之分页模块(五) - 自定义分页
  • JAVA并发编程--1.基础概念
  • orm2 中文文档 3.1 模型属性
  • overflow: hidden IE7无效
  • Promise面试题,控制异步流程
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • TCP拥塞控制
  • web标准化(下)
  • 阿里云前端周刊 - 第 26 期
  • 代理模式
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 将回调地狱按在地上摩擦的Promise
  • 数组大概知多少
  • 一些关于Rust在2019年的思考
  • MyCAT水平分库
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • ​如何防止网络攻击?
  • #1014 : Trie树
  • #stm32驱动外设模块总结w5500模块
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (一)u-boot-nand.bin的下载
  • (转)负载均衡,回话保持,cookie
  • (转)可以带来幸福的一本书
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • .net 反编译_.net反编译的相关问题
  • .net 生成二级域名
  • .NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况
  • .netcore如何运行环境安装到Linux服务器
  • .NET简谈设计模式之(单件模式)
  • .net实现客户区延伸至至非客户区
  • [51nod1610]路径计数
  • [AIGC] SQL中的数据添加和操作:数据类型介绍
  • [Ariticle] 厚黑之道 一 小狐狸听故事
  • [AutoSAR系列] 1.3 AutoSar 架构
  • [C#7] 1.Tuples(元组)
  • [C++]模板与STL简介
  • [CF407E]k-d-sequence