首先,不可否认,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. Navicate使用注意事项

    2.      Navicat如何连接数据库:点击连接——>输入连接名,然后如果是本机不用更改localhost,如果是别的主机,要将对方 的ip地址输入,端口号3306不变,用户名root,密 ...

  2. CF 370

    A:http://codeforces.com/problemset/problem/370/A #include<stdio.h> #include<string.h> #i ...

  3. devi into python 笔记(五)异常 文件操作 sys os glob模块简单实用

    异常: Java异常: try catch块处理异常,throw引发异常. Python异常: try except块处理异常,raise引发异常. 异常如果不主动处理,则会交给Python中的缺省处 ...

  4. php--常用的时间处理函数

    天地四方曰宇,往古来今曰宙 时间是世界的重要组成部分,不论花开花落,还是云卷云舒都有它的影子. 但它源起何处?又将去向何方?没人知道答案,也不需要答案,我们需要的只是一个相对的起点来标识时间,现今世界 ...

  5. Linux学习笔记31——网络信息

    一 主机数据库函数 #include <netdb.h> struct hostent *gethostbyaddr(const void *addr, //地址 size_t len, ...

  6. Java中Map遍历的四种方案

    在Java中如何遍历Map对象 方式一 这是最常见的并且在大多数情况下也是最可取的遍历方式.在键值都需要时使用. Map<Integer, Integer> map = new HashM ...

  7. [ZETCODE]wxWidgets教程八:组件专题1

    本教程原文链接:http://zetcode.com/gui/wxwidgets/widgets/ 翻译:瓶哥 日期:2013年12月12日星期四 邮箱:414236069@qq.com 主页:htt ...

  8. 运行.class文件提示找不到或者无法加载主类原因

    在Java初学之时,用文本文件写了一个“hello world”的简单程序.在dos环境下使用命令javac -test1.java 进行编译. 编译出名称为test1.class的Java运行文件. ...

  9. ganglia 无数据问题解决

    用ambari安装了HDP版本的hadoop,dashboard中ganglia的CPU.内存.网络等监控没有数据,找了很多原因,最后发现是因为rrdcache的时间问题导致的. gmetad的deb ...

  10. 用C++的类做三种优先队列的实现

    学过数据结构的都知道优先队列这种东西,普通的队列是依据入队顺序,先入队的先出队,而优先队列则是依照键值,键值越大(或越小),就越先出队. 所以,优先队列基本支持push,pop,empty,size, ...