关于js当中一些糟糕的特性

  首先,不可否认,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函数,连接符"+",假值等等。上面所述的是主要的糟糕特性,当然小伙伴们有不同见解也可分享。

时间: 2025-01-02 17:47:44

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

js当中的声明和初始化的顺序

if(!("a" in window)) { var a=1; } alert(a); 这里的alert出来undefined 这句话就相当于 var a; if(!(“a” in window)) { a=1; } alert(a); if块不是作用域 因此var a(变量的声明)会先执行,if当中的条件语句很清楚就是判断a是否是window的属性,由于是if代码段的代码不执行,因为a=1 也就是a的初始化不会执行,因此下面alert的结果会是undefined. js当中的声明和初

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

原文:https://strongloop.com/strongblog/whats-new-in-node-js-v0-12-cluster-round-robin-load-balancing Node.js v0.12的新特性 -- Cluster采用轮询调度算法来进行负载均衡 November 19, 2013 by Ben Noordhuis 欢迎来到由Node的核心提交者 Ben Noordhuis 和 Bert Belder撰写的系列博文的第一篇.本系列可能由7-8篇构成,主要涵盖

js当中CommonJS 和es6的模块化引入方案以及比较

js当中CommonJS 和es6的模块化引入方案以及比较:https://blog.csdn.net/jackTesla/article/details/80796936 在es6之前,对于模块化方案主要是CommonJS和AMD两种.咱们这次说一下ES6和CommonJS的区别. 它们有两个重大差异: CommonJS 模块输出的是一个值的拷贝,ES6 模块输出的是值的引用.CommonJS 模块是运行时加载,ES6 模块是编译时输出接口.    第一个差异:    CommonJS 模块输

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

1. V1新特性如下1 1.1. V2规划,直接生成sql在js端1 2. Orm设计框架图1 2.1. atiOrm.js的原理1 3. atiorm.js调用2 3.1. 查询数据2 3.2. 编辑数据(更新与新增)2 4. code2 1.1. V2新特性 对insert做优化测试.. 2. V1新特性如下 初步实现 2.1. V2规划,直接生成sql在js端 目前是在后端生成sql,前端以orm方式调用 多table的支持,一个form对应多个table,form的字段包括在多个tabl

KoaHub.js:使用ES6/7特性开发Node.js框架(2)

    }       isLogin() {         console.log('base isLogin');     } }   //index controller, admin/controller/index.controller.js import base from "./base.controller"; export default class extends base{       constructor() {         super();      

KoaHub.js:使用ES6/7特性开发Node.js框架

KoaHub.js -- 基于 Koa.js 平台的 Node.js web 快速开发框架.可以直接在项目里使用 ES6/7(Generator Function, Class, Async & Await)等特性,借助 Babel 编译,可稳定运行在 Node.js 环境上. 介绍 KoaHub.js -- 基于 Koa.js 平台的 Node.js web 快速开发框架.可以直接在项目里使用 ES6/7(Generator Function, Class, Async & Await)

利用JS和CSS的覆盖特性来解决文件冲突问题

随着项目规模的增大,协作开发也越来越长见,协作开发时间久了就会遇到一个恶心的文件冲突问题. 假设一个HTML文件引用了两个外部JS文件,而这两个外部JS文件你没有修改的权限,你只有HTML文件的修改权限, 两个外部JS文件都定义了window.onload事件.代码假设如下: <script type="text/javascript" src="a.js"></script> <script type="text/javas

[JS] JavaScript由浅入深(1) 基本特性

1.全局变量的特性: 在函数体内直接写的变量(未用var标志)自动升级为全局变量. (function func() { i = 100; }()); alert(i); 非常不建议不写var. var num = 1; (function func() { i = 100; }()); delete i; delete num; if (typeof i != "undefined") alert(i); if (typeof num != "undefined"

js当中mouseover和mouseout多次触发解决办法

问题描述 我希望当鼠标移动到id1上的时候,id2显示,当鼠标离开id1的时候,id2显示.问题如下: 1.当鼠标从id1上移动到id2上的时候,id由有显示变为不显示,然后变为显示 2.当鼠标从id2上移动到id1上的时候, id2有显示变为不显示,然后变为显示 我希望的是当鼠标在id1或者id2上移动的时候,id2一直显示,不发生变化. <script type="text/javascript" src="https://code.jquery.com/jquer