首先,不可否认,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. 转:二十、java的抽象类

    http://blog.csdn.net/liujun13579/article/details/7737667 现实世界中,人们表征世界时,会把现实世界中的很多类具有相同特征的事物归为一个抽象类.比 ...

  2. git rebase实战

    在develop分支上rebase另外一个分支master,是将master作为本地,develop作为远端来处理的. 最后的效果是,develop分支看起来像是在master分支的最新的节点之后才进 ...

  3. Visual Studio统计有效代码行数

    在网上看到别人用的方法: 按CTRL+SHIFT+F (Find in files),勾上支持正则表达式,然后输入搜索内容: ^:b*[^:b#/]+.*$ 以上表达式的统计可做到:#开头和/开头或者 ...

  4. OA的一些概念

    今天的主题是OA的一些概念. 先来一段百度百科的定义: 办公自动化(Office Automation,简称OA)是将现代化办公和计算机网络功能结合起来的一种新型的办公方式. OA的目的是:通过实现办 ...

  5. 荷兰国旗问题 划分成3部分 leecode

    public class Solution { public void sortColors(int[] A) { int len=A.length; int beg=0; int end=len-1 ...

  6. sadfa

    2015/03/16         星期一 在Android平台下编写客户端程序,界面只有开关若干个. 代码更新与3.17号 mainActivity.java: package com.fan.m ...

  7. MySQL WorkBench中文教程

    在网上找到了一份MySQL WorkBench的教程,点此可以下载Work Bench教程(原文),为了便于学习和交流,请朋友帮忙翻译成了中文,点此可以下载Work Bench教程(中文翻译版). 具 ...

  8. iOS 更好用的打Log方式-显示文件名、行数

    单纯的NSLog方式打出的Log没有显示打印语句所在的文件名和行数,下面这种做法会很实用: #ifdef DEBUG # define DLog(fmt, ...) NSLog((@"%s ...

  9. 搭建Struts框架

    搭建Struts框架 新建项目 [file]-[new]-[web project] 在弹出的对话框中对项目进行命名,点击[finish] 新建项目-> 点击项目右键-> MyEclips ...

  10. ios9中 UIStackView的使用

    ios9中 UIStackView的使用 by 伍雪颖 UIStackView能够垂直或水平排布多个subview, 自己主动为每一个subview创建和加入Auto Layout constrain ...