首先,不可否认,js是一门具有许多优秀特性的弱类型语言,但是这门语言在设计之初就投入了工程实践,没有经历严格的实验室测试,以致力于它是如此的粗糙,在相当长的一段时间很不受开发者待见,被视为一门玩具性的语言,而且有些特性确实设计的很糟糕,今天就这些糟糕的特性我就具体谈一谈。

  1.js当中首要的最糟糕的特性应该要数它对全局变量的依赖性。什么是全局变量?也就是对所有域都开放,能在任意时间、任意部分对其进行修改,这极大地降低了程序的可靠性。其次对于大型项目而言,随着业务拓展,代码量的增加,程序越来越庞大,子程序当中的变量命名很有可能与全局变量出现命名冲突,这很有可能导致程序无法正常运行。最理想的设计就是整个程序只有一个全局变量,这一点可以利用闭包来实现。

  2.作用域。js没有块级作用域,只有函数作用域,,在变量声明的不符合一般习惯,当然这里也可以利用闭包来模拟块级作用域。

  3.保留字。js里面有许多不会使用但会保留的单词,如class,它们不能被命名成变量或参数,用作对象声明的属性名时必须加引号,以保留字做对象属性的名字,不能通过点表示法来访问,只能通过括号表示法来访问。

  var a;//正确

  var class;//错误,不能以保留字做变量

  var person={

  name:"aaa"

  }//正确

  var person={

  class:"ren";

  }//错误,保留字作对象属性名必须加引号

  var person={

  "class":"ren"

  }//正确

  person.class//错误,不能通过点表示法访问保留字做属性名的对象

  person['class']//正确

  4.typeof运算符。typeof运算符用于返回一个对象所属的基本类型,如:typeof 1返回number,但是很可惜在typeof null中返回的是object,而我们更期望它返回的是null,因为返回object毫无意义。

  5.浮点数。二进制浮点数不能正确地处理十进制小数,如0.1+0.2的结果绝不可能是0.3。这是遵循二进制浮点数算术标准造成的,这有点不合我们一直所学的数学知识,如果不了解个中原因会造成一定的误导,不过对于整数的处理倒是精确的。

  6.NaN.这表示一个特殊的数量值,但它不是一个数字,尽管typeof NaN==="number"(在这里又要吐槽一下typeof了,太坑了)。要注意NaN并不等于它本身,即NaN!==NaN(这是true。切记!!!)。NaN的产生主要是你想要将一个非数字的字符串转化成数字而产生。

  7.伪数组。严格意义上来说,JavaScript上没有真正的数组,它里面的数组实际上是一个属性名为整数,且具有一个length属性的对象,在运行效率上比不上真正的数组,但是我们不必担心发生越界错误。通过typeof无法判断数组和对象。一个看起来比较可靠的判断一个值是数组的程序可能是这样:

  if(value&&typeof value==="object"&&value.constructor===Array){//value是数组},但是在不同帧或窗口创建的数组会得到false,下面的程序是我所知最可靠的检测数组的程序,下面分享给大家,代码如下:

  if(value&&typeof value==="object"&&typeof value.length==="number"&&typeof value.splice==="function"&&!(value.propertyIsEnumerable("length"))){//value是一个数组};

  当然JavaScript糟糕的特性还不止上面这些,比如还有自动插入分号导致return换行以后返回值是undefined,Unicode字符,parseInt函数,连接符"+",假值等等。上面所述的是主要的糟糕特性,当然小伙伴们有不同见解也可分享。

关于js当中一些糟糕的特性的更多相关文章

  1. 介绍Ext JS 4.2的新特性的《深入浅出Ext JS》上市

    以用户为中心的时代,应用的界面外观变得越来越重要.然而,很多程序员都缺乏美术功底,要开发出界面美观的应用实属不易.Ext JS的出现,为广大程序员解决了这一难题.它有丰富多彩的界面和强大的功能,是开发 ...

  2. Atitit js版本es5 es6新特性

    Atitit js版本es5 es6新特性 Es5( es5 其实就是adobe action script的标准化)1 es6新特性1 Es5( es5 其实就是adobe action scrip ...

  3. atitit.js 各版本 and 新特性跟浏览器支持报告

    atitit.js 各版本 and 新特性跟浏览器支持报告 一个完整的JavaScript实现是由以下3个不同部分组成的 •核心(ECMAScript)--JavaScript的核心ECMAScrip ...

  4. 【译】 Node.js v0.12的新特性 -- Cluster模式采用Round-Robin负载均衡

    原文:https://strongloop.com/strongblog/whats-new-in-node-js-v0-12-cluster-round-robin-load-balancing 本 ...

  5. js中对象的一些特性,JSON,scroll家族

    一.js中对象的一些特性 对象的动态特性 1.当对象有这个属性时,会对属性的值重写 2.当对象没有这个属性时,会为对象创建一个新属性,并赋值 获得对象的属性的方式 为元素设置DOM0级事件 二.JSO ...

  6. atitit.atiOrm.js v2 q61 版本新特性.docx

    atitit.atiOrm.js v2 q61 版本新特性.docx 1. V1新特性如下1 1.1. V2规划,直接生成sql在js端1 2. Orm设计框架图1 2.1. atiOrm.js的原理 ...

  7. Atitit.js模块化 atiImport 的新特性javascript import

    Atitit.js模块化 atiImport 的新特性javascript import 1. 常见的js import规范amd ,cmd ,umd1 1.1. Require更多流行3 2. at ...

  8. js当中mouseover和mouseout多次触发(非冒泡)

    JS当中,mouseover和mouseout多次触发事件,不光是冒泡会产生,就是不冒泡,在一定条件下 ,也会产生多次触发事件: 例如下面的结构的情况下,我在class="ceng_up f ...

  9. node.js当中的http模块与url模块的简单介绍

    一.http模块的简单介绍 node.js当中的http内置模块可以用于创建http服务器与http客户端. 1.引包 const http = require('http'); 2.创建http服务 ...

随机推荐

  1. 开发的时候,一定要及时控制CPU使用率以及使用内存大小等三个问题(一个星期检查一次)

    一直专注于功能的开发,没注意CPU和内存.昨天无意中发现两个问题: 1. 程序启动后,什么都没干,CPU就50%了(单核).现在想找原因降低使用率,感觉无从下手,要是平时就注意这个问题就好了. 2. ...

  2. SpringMVC源码解析 - HandlerMethod

    HandlerMethod及子类主要用于封装方法调用相关信息,子类还提供调用,参数准备和返回值处理的职责. 分析下各个类的职责吧(顺便做分析目录): HandlerMethod 封装方法定义相关的信息 ...

  3. java.lang.String内部结构的变化

    原文:http://java-performance.info/changes-to-string-java-1-7-0_06/ 作者:Mikhail Vorontsov IMPORTANT: Jav ...

  4. 解决ASP.NET MVC AllowAnonymous属性无效导致无法匿名访问控制器的问题

    在ASP.NET MVC项目中,一般都要使用身份验证和权限控制,但总有部分网页是可以匿名访问的.使用AllowAnonymous属性就可以指定需要匿名访问的控制器,从而跳过身份验证. 但是今天却遇到一 ...

  5. Unity3D之Character Controller(CC)与GameObject的碰撞方法

    先来一部分网上常见的内容(略整理): --------------------分隔线---------------------- Unity3d中参与碰撞的物体分2种类型: 一.发起碰撞的物体. 二. ...

  6. android学习——eclipse的svn的搭建

    一.svn 的在线安装 下面为在线安装SVN插件. 以下是一些关键步骤: 其中http://subclipse.tigris.org/update_1.8.x是SVN插件的下载站点[subclipse ...

  7. Eclipse插件Subclipse各版本插件下载地址以及与Subverison的对应关系

    Subclipse 1.4.x includes and requires Subversion 1.5.x client features and working copy format. Subc ...

  8. 浅谈pageobject模式

    先来看两段代码 代码1: package com.zlshuo.selenium.nonaming.pageobject; /** * @author leshuo * @version 2014年5 ...

  9. JavaScript高级程序设计37.pdf

    用DOM范围实现简单选择 selectNode()和selectNodeContents()它们都接收一个DOM节点参数,然后使用该节点中的信息来填充范围,其中selectNode()方法选择整个节点 ...

  10. 5 weekend01、02、03、04、05、06、07的分布式集群的HA测试 + hdfs--动态增加节点和副本数量管理 + HA的java api访问要点

    weekend01.02.03.04.05.06.07的分布式集群的HA测试 1)  weekend01.02的hdfs的HA测试 2)  weekend03.04的yarn的HA测试 1)  wee ...