当前位置: 首页 >  谷歌优化

12种不宜使用的Javascript语法

发布日期:2020-05-10

这几天,我在读《Javascript语言精粹》。

这本书很薄,100多页,正好假日里翻翻。

该书的作者是Douglas Crockford,他是目前世界上最精通Javascript的人之一,也是Json格式的创造者。

他认为Javascript有很多┊┋糟粕。因为1995年Brendan Eich设计这种语言△的时候,只用了三个月,很多〗语言特′性没有经过深思熟虑,就推向了市场。结果等到人们意识到这些问题的时候,已经有100万程序员在使用它了,不可能再大幅修改语言本身了。所以,Douglas Crockford决定,他要告诉大家,Javascript中哪些部分是精粹,哪些部分是糟粕和鸡肋。

这个想法非常好,但是我不得不说,这本书写得不够好,不适合新手阅读。原因如下┗:1)Douglas Crockford叙述得不清晰,更像与同行讨论问题,而不是由浅入深地讲解问题。这本书的重点不是解释,所以读完后,我觉得Javascript好像变得更复杂了。2)他固执地使用铁路图(railroad diagram)解释每一条语句。全世界似乎只有他一个人使用这种比Javascript更难看懂的图。3)该书基本上是一本简化的Javascript语法手册,缺乏足够的新内容。4)该书举例过少,而且在最难的函数和对象部分,使用的例子都是环环相套、层层递进的例子,导致阅读起来很吃力。

该书最有价值的内容不是正文,反而是附录。在附录B中,Douglas Croc♠kford列出了12种应该避免使用的Javascript语法,我觉得▌非常值得推广。

==============================

1. ==

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

请尽量不要使用前一组,永远只使用===和!==。因为==默认会进行类型转换√,规则十分难记。如果你不相信的话,请回答下面五个判断式۩的值是t¥rue还是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运行。

4. continue

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

5. switch 贯穿

switch结└构中的case语句,默认是顺序执行,除非遇到break,return和throw。有的程序员喜欢利用这个特点,比如

 ÷ switch(n) {
    case 1:
    ca◐se 2:
      break;
  }

这样写容易出错,而且难以发现。因此▽建议避免switch贯穿,凡是有case的地方,一律加上break。

  switch(n) {
    case 1:
      break;
    case 2:
      break;
  }

6. 单行的块结构

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

  if (ok) t = true;

甚至写成

  if (ok)
   ◣ t = true;

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

  if (ok){
    t = true;
  }

7. ++和--

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

8. 位运算符

Jav◇ascript完全套用了Jaωva的位运算符,包括按位与&、按位或|、按位异或^、按位非~、左移和用0补足的右移>>>。

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

9. function语句

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

  function foo() { }

  var foo = fu№nction () { }

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

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

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

  new StrΨing("Hello World");

  new Number(2000);

  new Boolean(false);

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

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

11. new语句

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

类是这样定义的:

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

然后,再生成一个对象

  var myCat = 〾new Cat('mimi');

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

Douglas Crockford给出了一个函数:

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

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

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

  var myCat = ObjeИct.beget(Cat);

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

  myCat.name = 'mimi';

12. void

在大多数语言中,void都是一种类型,表示没有值。但是在Javascri√pt中,void是一个运算符,接受一个运算数,并返回undef●ined。

  voΘid 0; // undefined

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

(完)

  • 谷歌手势控制黑科技新进展...

    谷歌公司获得了美国监管部门的批准,可部署一款基于雷达的动作感应设备,也就是外界熟悉的Project Soli项目。美国联邦通信委员会(FCC)在周一晚间公布的命令中称,同意授予谷歌一项豁免,以高于目前允许的功率水平运行Soli传感器。FCC称,这种传感器还可以运行在飞机上。谷歌FCC称,这一决定是出于公众利益考虑,通过免触摸的手势技术提供创新设备控制功能。FCC表示,Soli传感器能够使用雷达射束...

  • CBNData:纸尿裤行...

    报告下载:添加199IT官方微信【i199it】,回复关键词【纸尿裤行业研究报告】即可 消费者画像-性别和年龄 消费者方面,和母婴行业整体情况一样,购买纸尿裤的消费者也是女性居多,并且仍在逐年增加 购买纸尿裤的主力是29-35岁年龄人群,并且这个人群的比例远高于整个母婴行业;23-28岁年轻人群的比例逐年增加 消费者画像-网购深度和消费档...

  • 小米:2017年Q2小米...

    7 月 7 日,雷军发表内部信称,小米手机第二季度出货量 2316 万台,环比增长 70%,是小米手机问世七年以来创造的最高季度手机出货量纪录。 根据 IDC 的数据,2017 年第一季度,小米手机的出货量还不及华为的一半,在中国市场排名第五。雷军把过去一年小米手机销量不理想的原因归结为「两次长达几个月的严重缺货」。而在内部信中,雷军把第...

  • 3成女性,竟因为这个原因...

    16-25岁的女性,每周花在自拍上的时间,超过5个小时;当她们自拍时,她们在想些什么?

  • 毕马威 | 资本寒冬下投...

    199IT数据中心微信账户:i199IT 日前,顶尖会计师事务所界中的“四大”之一的毕马威(KPMG)公布了2015年第四季度全球VC风险投资报告。作为收官之作,其不仅详细阐述了世界“热钱”的流向和流量,也指明了未来创新创业的风口所在。 对于全球范围的创业者和风投机构来说,持续半年多的资本寒冬所带来的影响似乎仍然在持续。然而即便如此,就...

  • 北京大学&安世...

    近期,安世联合(中国)与北京大学“中国居民出境旅游风险研究”项目组联合发布《中国居民出境旅游风险报告》,对海外旅游市场进行了解读,对中国出境旅游风险进行了详细的分析。 中国居民出境旅游市场分析 报告从中国居民出境旅游人次、旅游目的地分布和旅游消费渠道三个方面,回顾了过去十年(2007-2016)中国居民出境旅游市场,并对2017至2020...

  • 2017年大数据十大发展...

    大数据市场将会继续增长这一点毋庸置疑,但企业应该如何应用大数据呢?目前还没有一个清楚的答案。新的大数据技术正在进入市场,而一些旧技术的使用还在继续增长。本文涵盖大数据未来发展的十大趋势,这些趋势可能对2017年及以后的大数据市场产生极大影响。 专家预计,机器学习、预测分析、物联网和边缘计算将对2017年及以后的大数据项目产生深远影响。 ...

  • 这几个因素会影响到网站优...

        其中一些因素将影响网站优化的作用。许多SEO的搜索者仍仅停留在排名阶段,而朋友链很难改变。那么百度搜索引擎的关键字排名又如何呢??如何提高您网站的排名?网站的内容和搜索关键词的相关性,网站的相同主题和内容将被百度认可,甚至您的网站减少也会使用户感到不满。网...

  • 如何分析付费用户,第一部...

    付费用户就是为我们的产品带来收入的人。了解付费用户行为的细微差别是很重要的:比如他们都买了什么,付费频率是怎样,花了多少钱等等。了解用户在上述行为中的感受是很重要的,用户投资了我们的产品是否让他们感到满意。实际上,在F2P网络游戏中玩家的每次付费都是投资:在一开始的时候玩家的付费,会在最后得到一个投资回报率(ROI),可以用货币化的方式衡量玩家体验的情绪。因此我们应该了解用户,即使他们是少数的.....

  • 【网络广告销售技巧】设计...

        一个好的营销网站是企业24个小时的推销员,很难在规划上是不合理的,客户能够付出,假如做到了,那就是你的主动东西每天赚24个小时。横幅直奔主题,中心卖点是买卖网站最重要的网站之一。一个好的横幅可能是规划的中心。         直奔主题,...

  • Ponemon Inst...

    根据Ponemon Institute周三公布的网络犯罪报告显示,对美国大公司的网络攻击导致这些大公司今年损失1270万美元,同比增长9.7个百分点。该报告显示,网络犯罪给大公司造成的损失当中,业务中断和信息丢失占了近四分之三。 研究还证实,将安全置于优先考虑的公司,年内和安全事件相关的成本更低,使用安全技术防止关键系统被入侵的公司...

  • 今日头条:AI助力用户推...

    在上篇中主要讲了AI助力实现智能推荐的原理流程和方法,在下篇中笔者将通过上手操作,来讨论具体落地的方法。 本篇笔者选择今日头条中的13个类别的信息作为上手对象,如:时尚、旅游、美食、育儿、财经、图片、探索、娱乐、搞笑、直播、体育、科学等,分别通过抽取粉丝数超过百万以上的用户最近的文章、用户标签和分享的图像,最终在13个类别上获取了353个用户的I...