`
fregen
  • 浏览: 4427 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

蝴蝶书的一些看法

阅读更多

最近翻了一下蝴蝶书,但我和阮一峰的看法有点不一样;
这本书确实不适合没有任何编程经验的新手,但如果已经熟悉了一种程序语言,这本书正合适。这本书没有任何DOM内容(用作者的话说,DOM中没有任何“好的部分”),配合Jquery库,可以避开那些复杂的(很多即将过时的)内容,快速入门。
但本书有些说法过于绝对了,比如12种应该避免使用的Javascript语法

引用
1. ==

Javascript有两组相等运算符,一组是==和!=,另一组是===和!==。前者只比较值的相等,后者除了值以外,还比较类型是否相同。

请尽量不要使用前一组,永远只使用===和!==。因为==默认会进行类型转换,规则十分难记。如果你不相信的话,请回答下面五个判断式的值是 true还是false:

  false == 'false'

  false == undefined

  false == null

  null == undefined

  0 == ''

前三个是false,后两个是true。


也就这几个难记,有时候==更方便。

引用
2. with

with的本意是减少键盘输入。比如

  obj.a = obj.b;

  obj.c = obj.d;

可以简写成

  with(obj) {
    a = b;
    c = d;
  }

但是,在实际运行时,解释器会首先判断obj.b和obj.d是否存在,如果不存在的话,再判断全局变量b和d是否存在。这样就导致了低效率,而且可能会导致意外,因此最好不要使用with语句。


完全同意。

引用
3. eval

eval用来直接执行一个字符串。这条语句也是不应该使用的,因为它有性能和安全性的问题,并且使得代码更难阅读。

eval能够做到的事情,不用它也能做到。比如

  eval("myValue = myObject." + myKey + ";");

可以直接写成

  myValue = myObject[myKey];

至于ajax操作返回的json字符串,可以使用官方网站提供的解析器json_parse.js运行。


eval的价值在于它就是javascript解释器。

引用
4. continue

这条命令的作用是返回到循环的头部,但是循环本来就会返回到头部。所以通过适当的构造,完全可以避免使用这条命令,使得效率得到改善。


在一些条件语句中用continue更简洁。

引用
5. switch 贯穿
switch结构中的case语句,默认是顺序执行,除非遇到break,return和throw。有的程序员喜欢利用这个特点,比如
  switch(n) {
    case 1:
    case 2:
      break;
  }
这样写容易出错,而且难以发现。因此建议避免switch贯穿,凡是有case的地方,一律加上break。
  switch(n) {
    case 1:
      break;
    case 2:
      break;
  }


这个确实容易引起隐晦的错误,更合理的设计是只在空case时才贯穿,但现实是所有我知道的语言都是如此设计,一律加上break太过了,在空case时(也就是多个值完全一样处理)不应如此。

引用
6. 单行的块结构

if、while、do和for,都是块结构语句,但是也可以接受单行命令。比如

  if (ok) t = true;

甚至写成

  if (ok)
    t = true;

这样不利于阅读代码,而且将来添加语句时非常容易出错。建议不管是否只有一行命令,都一律加上大括号。

  if (ok){
    t = true;
  }


这个看个人习惯。

引用
7. ++和--
递增运算符++和递减运算符--,直接来自C语言,表面上可以让代码变得很紧凑,但是实际上会让代码看上去更复杂和更晦涩。因此为了代码的整洁性和易读性,不用为好。


简单的i++不会有什么问题。

引用
8. 位运算符

Javascript完全套用了Java的位运算符,包括按位与&、按位或|、按位异或^、按位非~、左移<<、带符号的右移>>和用0补足的右移>>>。

这套运算符针对的是整数,所以对Javascript完全无用,因为Javascript内部,所有数字都保存为双精度浮点数。如果使用它们的话,Javascript不得不将运算数先转为整数,然后再进行运算,这样就降低了速度。而且“按位与运算符”&同“逻辑与运算符”&&,很容易混淆。


javascript一般用不到这么底层的东西。

引用
9. function语句

在Javascript中定义一个函数,有两种写法:

  function foo() { }



  var foo = function () { }

两种写法完全等价。但是在解析的时候,前一种写法会被解析器自动提升到代码的头部,因此违背了函数应该先定义后使用的要求,所以建议定义函数时,全部采用后一种写法。


赞同。

引用
10. 基本数据类型的包装对象

Javascript的基本数据类型包括字符串、数字、布尔值,它们都有对应的包装对象String、Number和Boolean。所以,有人会这样定义相关值:

  new String("Hello World");

  new Number(2000);

  new Boolean(false);

这样写完全没有必要,而且非常费解,因此建议不要使用。

另外,new Object和new Array也不建议使用,可以用{}和[]代替。


赞同。

引用
11. new语句

Javascript是世界上第一个被大量使用的支持Lambda函数的语言,本质上属于与Lisp同类的函数式编程语言。但是当前世界,90%以上的程序员都是使用面向对象编程。为了靠近主流,Javascript做出了妥协,采纳了类的概念,允许根据类生成对象。

类是这样定义的:

  var Cat = function (name) {
    this.name = name;
    this.saying = 'meow' ;
  }

然后,再生成一个对象

  var myCat = new Cat('mimi');

这种利用函数生成类、利用new生成对象的语法,其实非常奇怪,一点都不符合直觉。而且,使用的时候,很容易忘记加上new,就会变成执行函数,然后莫名其妙多出几个全局变量。所以,建议不要这样创建对象,而采用一种变通方法。

Douglas Crockford给出了一个函数:

  Object.beget = function (o) {
    var F = function (o) {};
    F.prototype = o ;
    return new F;
  };

创建对象时就利用这个函数,对原型对象进行操作:

  var Cat = {
    name:'',
    saying:'meow'
  };

  var myCat = Object.beget(Cat);

对象生成后,可以自行对相关属性进行赋值:

  myCat.name = 'mimi';


需要复杂的初始化时还是要构造函数。

引用
12. void

在大多数语言中,void都是一种类型,表示没有值。但是在Javascript中,void是一个运算符,接受一个运算数,并返回 undefined。

  void 0; // undefined

这个命令没什么用,而且很令人困惑,建议避免使用。


在bookmarklet中很常用。

 

1
0
分享到:
评论
1 楼 yuantong 2010-01-24  
蝴蝶书确实不错,讲的很精

目前还没看完

相关推荐

    蝴蝶指标及教材_半自动ea_蝴蝶ea_ea_蝴蝶指标_蝴蝶_

    与全自动EA不同,半自动EA不会完全独立地进行买卖决策,而是需要交易者根据市场情况设定一些规则和参数。一旦满足这些条件,EA就会自动执行交易指令。这种方式允许交易者保持对交易过程的控制,同时减少了盯盘的时间...

    蝴蝶ZUP_v82.zip_ZUP_zup_v83指标_蝴蝶_蝴蝶指标._蝴蝶指标ZUP

    《蝴蝶指标ZUP:探索交易市场的视觉艺术与技术分析》 在金融交易的世界里,技术分析工具犹如航海者的罗盘,指引着投资者在市场海洋中寻找潜在的交易机会。其中,“蝴蝶指标ZUP”因其独特性和高效性,在交易者中备受...

    完美蝴蝶指标_mt4_蝴蝶指标_指标_

    【完美蝴蝶指标_MT4_蝴蝶指标_指标】是一种在金融市场交易分析中广泛使用的技术分析工具,尤其在MetaTrader 4(MT4)平台上。MT4是全球最受欢迎的外汇交易平台之一,它提供了丰富的图表分析功能以及自定义指标的能力...

    缎蝴蝶鸟优化器缎蝴蝶鸟优化器 缎蝴蝶鸟优化器缎蝴蝶鸟优化器缎蝴蝶鸟优化器缎蝴蝶鸟优化器缎蝴蝶鸟优化器

    缎蝴蝶鸟优化器缎蝴蝶鸟优化器缎蝴蝶鸟优化器缎蝴蝶鸟优化器缎蝴蝶鸟优化器缎蝴蝶鸟优化器缎蝴蝶鸟优化器缎蝴蝶鸟优化器缎蝴蝶鸟优化器缎蝴蝶鸟优化器缎蝴蝶鸟优化器缎蝴蝶鸟优化器缎蝴蝶鸟优化器缎蝴蝶鸟优化器缎...

    蝴蝶识别数据集.zip

    《深度学习驱动的蝴蝶识别:理解与应用》 在当今的科技时代,人工智能(AI)已经深入到我们生活的各个领域,其中图像识别是其重要应用之一。本篇将重点探讨一个具体的实例——“蝴蝶识别数据集”,这个数据集是深度...

    html5 canvas飞舞的蝴蝶动画特效

    JavaScript可能还会包含一些定时器(如`setInterval()`),以定期更新蝴蝶的位置,实现动画的连续播放。此外,可能还会有函数来处理用户与动画的交互,例如鼠标点击事件,使蝴蝶在特定位置出现或者改变飞行方向。 ...

    《JavaScript语言精粹[修订版]》高清版_2012.09_【蝴蝶书】_172页完整版

    《JavaScript语言精粹[修订版]》高清版_2012.09_【蝴蝶书】_172页 内容简介  JavaScript 曾是“世界上误解的语言”,因为它担负太多的特性,包括糟糕的交互和失败的设计,但随着Ajax 的到来,JavaScript“从受...

    冰山客蝴蝶指标内附教材

    在金融交易领域,技术分析是投资者预测市场走势的重要工具,其中“蝴蝶指标”是一种独特的交易技术,它基于谐波形态理论。本资源包名为“冰山客蝴蝶指标内附教材”,旨在为用户提供深入理解并应用蝴蝶指标进行交易的...

    20类蝴蝶的图片数据集.zip

    《深度学习中的蝴蝶图像分类:20类蝴蝶图片数据集详解》 在人工智能领域,特别是计算机视觉部分,数据集起着至关重要的作用。本篇将详细介绍一个特别的数据集——"20类蝴蝶的图片数据集.zip",它专门用于训练和测试...

    HTML5 SVG 3D蝴蝶飞舞动画 逼真超酷

    此外,JavaScript可以用来添加更复杂的交互性,比如蝴蝶的随机飞行路径、碰撞检测,或者用户与蝴蝶的互动,如点击蝴蝶使其飞走等。JavaScript库,如Three.js,可以简化3D图形编程,提供丰富的功能和优化性能。 在...

    mt4平台蝴蝶指标

    mt4平台蝴蝶指标.ex4

    16台湾蝴蝶甲天下.ppt

    首先,我们要了解一些关于蝴蝶的专业术语。例如,“逆光”是指光线从观察者的背面照射过来,使物体边缘呈现出明亮的轮廓,对于蝴蝶而言,这可能意味着在特定光照条件下,蝴蝶的翅膀能展现出独特的光泽和色彩。"迁徙...

    python画图(蝴蝶动画).rar

    在本项目中,作者利用Python的turtle库创建了一个生动的蝴蝶动画。turtle库是Python标准库中的一个模块,主要用于教学目的,它提供了一个简单的图形绘制功能,用户可以通过控制虚拟的“turtle”(海龟)在屏幕上移动...

    蝴蝶优化算法及其对应原文

    蝴蝶优化算法(Butterfly Optimization Algorithm,BOA)是一种新兴的智能优化算法,它受到了自然界中蝴蝶觅食行为的启发,旨在解决复杂优化问题。在机器学习和人工智能领域,优化算法是至关重要的,它们用于寻找...

    流星蝴蝶剑全教程.zip

    《流星蝴蝶剑全教程》是一个综合性的资源集合,包含了流星蝴蝶剑游戏的多个MOD和相关技术教程。这个压缩包旨在为玩家提供一个全面了解和学习流星蝴蝶剑游戏修改技术的基础平台,适合新手入门和进阶者参考。在这个...

    蝴蝶形态教程 MT4必备

    Gartley在1935年出版的《股市利润》一书中提出的形态分析,其中的核心是Gartley 222形态。Scott M. Carney在其著作《和谐的交易》中进一步发展和完善了这一理论,提出了蝴蝶形态,包括牛市和熊市两种情况。 蝴蝶...

    蝴蝶指标。亲测

    蝴蝶指标的最新版 非常好用 亲测

    HTML5制作逼真蝴蝶天空飞舞动画特效

    在这个案例中,Canvas被用来绘制蝴蝶的图像,并通过JavaScript控制它们在屏幕上的运动,模拟出蝴蝶在天空中飞舞的逼真效果。开发者可能使用了requestAnimationFrame()方法来平滑地更新蝴蝶的位置,创建出流畅的动画...

Global site tag (gtag.js) - Google Analytics