javascript诟病,JavaScript缺点

javascript

JavaScript基础之对象

创新新互联,凭借10余年的网站设计、成都网站制作经验,本着真心·诚心服务的企业理念服务于成都中小企业设计网站有近千家案例。做网站建设,选创新互联。

从2004年下半年开始学习Web编程至今3年有余。从HTML,asp开始到现在的VS2008一路学过来,其中学的最多的还是服务器端编程,对客户端编程的学习还是不成系统。虽然在很多个系统里面应用过脚本,有些还起到了比较重要的作用。但一直是只知其然不知其所以然,用的是小心翼翼。现在脚本编程从以前的"雕虫小技"变成了一个Web开发不可或缺的元素,其地位大大提高了,特别是Ajax兴起之后它更是"炙手可热"了。鉴于此种情况及自己对脚本编程的热爱,于是就系统地学习一下脚本。

学习是理解和记忆的过程。在理解和记忆的过程中必不可少地就需要一些辅助的记录,于是我就将自己的学习记录写成随笔。一来是帮助自己理解和记忆,二来也给其它热爱脚本的同志一些参考。

1 JavaScript对象

ECMA-262将对象(object)定义为"属性的无序集合,每个属性存放一个原始值、对象或函数"(unordered collection of properties each of which contains a primitive value, object, or function)。这意味着对象是无特定顺序的值的数组。在ECMAScript中,对象由特性(Attribute)构成,特性可以是原始值,也可以是引用值。如果特性存放的是函数,它将被看作对象的方法(Method),否则该特性被看作属性(Property)。

2 对象的废除

ECMAScript有无用存储单元收集程序(就像C#的垃圾收集器),意味着不必专门销毁对象来释放内存。当再没有对对象的引用时,该对象就被废除了。运行无用存储单元收集程序时,所有废除的对象都会被销毁。每当函数执行完它的代码,无用存储单元收集程序都会运行,释放所有的局部变量,还有在一些其它不可预知的情况下,无用存储单元收集程序也会运行。

把对象的所有引用都设置为null,可以强制性的废除对象。例如:

Var oObject=new Object();

// 程序逻辑

oObject=null;

当变量oObject设置为null后,对第一个创建的对象的引用就不存在了。这意味着下次运行无用存储单元收集程序时,该对象将被销毁。

每用完一个对象后,就将其废除,来释放内存,这是个好习惯。这样还确保不再使用已经不能访问的对象,从而防止程序设计错误的出现。此外,旧的浏览器(如IE)没有完全的无用存储单元收集程序,所以卸载页面时,对象可能不能被正确地销毁。以前IE6就有这样的诟病,当页面被关闭后对象还是没有被释放,所以总是会导致内存溢出的错误。废除对象和它所有的特性是确保内存正确使用的最好方法。

3 对象的类型

JavaScript中对象分为:本地对象(native object)、内置对象(built-in object)、宿主对象(host object)。其中本地对象和宿主对象大家一般用的比较多,比较熟。这里我就重点说明一下内置对象。

ECMA-262把内置对象定义为"由ECMAScript实现提供的、独立于宿主环境的所有对象,在ECMAScript程序开始执行时出现"(any object supplied by an ECMAScript implementation, independent of the host environment, which is present at the start of the execution of an ECMAScript program.)。这意味着开发者不必明确实例化内置对象,它已经被实例化了。但ECMAScript只定义了两个内置对象:

3.1 Math对象

Math对象就是解决数学问题的所有公式。这个在各种编程语言中都有类似的实现,就不做介绍了。

3.2 Global对象

园子里很多搞ASP.net的,相信大家对其中的Global.asax非常熟悉了。但这个对象在ECMAScript中却比较特殊。因为它实际上根本就不存在。如果尝试编写下面的代码去实例化它,将得到错误:

Var _global=new Global();

错误消息显示Global不是对象,但上文却说Global是一个内置对象,这不就自相矛盾了吗?不矛盾。这里需要理解的主要概念是,在ECMAScript中,不存在独立的函数,所有的函数都必须是某个对象的方法。ECMAScript中常用的函数例如isNaN()、isFinite()等,看起来都像独立的函数。实际上,它们都是Global对象的方法。而且Global对象的方法还不止这些。

4 定义类或对象

虽然ECMAScript越来越正规化了,但创建对象的方法却被置之不理。在高级的编程语言(如C#)中,创建对象的方法被明确的定义了。所以不会有太大的分歧。但在脚本语言中创建对象的方法就是多种多样了。

4.1 工厂方式

由于对象的属性可在对象创建后动态定义,所以许多开发者都在初次引入JavaScript时编写类似下面的代码:

Var oCar=new Object();

oCar.color="red";

oCar.doors=4;

oCar.mpg=23;

oCar.showColor=function(){alert(this.color);};

在这段代码中,创建对象car。然后给它设置几个属性:它的颜色是红色,有四个门,每加仑油23英里。最后一个属性是指向函数的指针,意味着该属性其实是个方法。执行这段代码后,就可以使用对象car了。可是要创建多个car实例就麻烦了。

要解决此问题,开发者可以创建并返回特定类型的对象的工厂函数。例如,函数CreateCar()可用于封装前面列出的创建car对象的操作:

Function createCar()

{

Var oTempCar=new Object();

oTempCar.color="red";

oTempCar.doors=4;

oTempCar.mpg=23;

oTempCar.showColor=function(){alert(this.color)};

return oTempCar;

}

Var oCar1=createCar();

Var oCar2=createCar();

这里,前面的所有代码都包含在createCar()函数中,此外还有一行额外的代码,返回Car对象作为函数值。调用此函数时,将创建新对象,并赋予它所有必要的属性,复制出一个前面说明的car对象。使用该方法,可以容易地创建car对象的两个版本,他们的属性完全一样。当然,还可以修改creatCar()函数,给它传递各个属性的默认值,而不是赋予属性默认值:

Function createCar(sColor,iDoors,iMpg)

{

Var oTempCar=new Object();

oTempCar.color= sColor;

oTempCar.doors= iDoors;

oTempCar.mpg= iMpg;

oTempCar.showColor=function(){alert(this.color)};

return oTempCar;

}

Var oCar1=createCar("red",4,23);

Var oCar2=createCar("blue",2,26);

oCar1.showColor(); // 输出"red"

oCar2.showColor(); // 输出"blue"

给createCar()函数加上参数,即可为要创建的car对象的color、doors和mpg属性赋值。使这两个对象具有相同的属性,却有不同的属性值。但这里有个问题:每次调用函数createCar(),都要创建新函数showColor(),意味着每个对象都有自己的showColor()版本。事实上,每个对象用的都是同一段代码。这样的定义方法还有一个如下的变形:

Function Car(sColor,iDoors,iMpg)

{

this.color= sColor;

this.doors= iDoors;

this.mpg= iMpg;

this.showColor=function(){alert(this.color)};

}

Var oCar1=new Car("red",4,23);

Var oCar2=new Car("blue",2,26);

oCar1.showColor(); // 输出"red"

oCar2.showColor(); // 输出"blue"

这个方法和上一个方法有个一样的缺陷:重复的创建了showColor()函数。为了解决这个缺陷我们可以用下面的方法。

4.2 原型方式

该方法利用了对象的Prototype属性。用空构造函数来设置类名,然后所有的属性和方法都被直接赋予prototype属性:

Function Car()

{}

Car.prototype.color="red";

Car.prototype.doors=4;

Car.prototype.mpg=23;

Car.prototype.showColor=function(){alert(this.color)};

Var oCar1=new Car();

Var oCar2=new Car();

使用这个方法可以解决重复创建showColor()函数,但又会有新的问题,考虑下面的例子:

Function Car()

{}

Car.prototype.color="red";

Car.prototype.doors=4;

Car.prototype.mpg=23;

Car.prototype.drivers=new Array("Mike","Sue");

Car.prototype.showColor=function(){alert(this.color)};

Var oCar1=new Car();

Var oCar2=new Car();

oCar1.drivers.push("Matt");

alert(oCar1.drivers); // 输出"Mike,Sue,Matt"

alert(oCar2.drivers); // 输出"Mike,Sue,Matt"

这里,属性drivers是指向Array对象的指针。改变指针指向的内容,所有的实例都会改变。看来这种方法也不可取

4.3 混合方式

这种方式就是用构造函数定义对象的所有非函数属性,用原型方式定义对象的函数属性(方法)。结果所有的函数只创建一次,而每个对象都具有自己的对象属性实例。

Function Car(sColor,iDoors,iMpg)

{

this.color= sColor;

this.doors= iDoors;

this.mpg= iMpg;

Car.drivers=new Array("Mike","Sue");

}

Car.prototype.showColor=function(){alert(this.color)};

Var oCar1=new Car("red",4,23);

Var oCar2=new Car("blue",3,25);

oCar1.drivers.push("Matt");

alert(oCar1.drivers); // 输出"Mike,Sue,Matt"

alert(oCar2.drivers); // 输出"Mike,Sue"

这种方式是ECMAScript主要采用的方式,它具有其他方式的特性,却没有它们的缺陷。在实际编程中应用的也是最多了。

另外还有JSON创建方式。其创建的方式如下:

var Car =

{

color: "red",

doors: 4,

mpg: 23,

drivers: [{name: "Mike", age: 20, Married: false}, {name: "Sue", age: 30, Marred: true}],

showColor: function() {alert(this.color)}

};

这种创建对象的方式也比较优雅。可作为Ajax返回的文本,然后用eval()函数将其还原成一个对象。著名的脚本框架JQuery就有专门接收返回文本为JSON对象的异步方法。

javascript与actionscript脚本语言有什么区别和联系?

定义 脚本语言,脚本语言或扩建的语言,又叫动态语言。是一种编程语言控制软件应用程序。 [编辑本段]概述 计算机语言是为了各种目的和任务而开发的,一个常见任务就是把各种不同的已有组件连接起来以完成相关任务。大多脚本语言共性是:良好的快速开发,高效率的执行,解释而非编译执行,和其它语言编写的程序组件之间通信功能很强大。 许多脚本语言用来执行一次性任务,尤其是系统管理方面。它可以把服务组件粘合起来,因此被广泛用于GUI创建或者命令行,操作系统通常提供一些默认的脚本语言,即通常所谓shell脚本语言。 脚本通常以文本(如ASCII)保存,只在被调用时进行解释或编译。 有些脚本是为了特定领域设计的,但通常脚本都可以写更通用的脚本。在大型项目中经常把脚本和其它低级编程语言一起使用,各自发挥优势解决特定问题。脚本经常用于设计互动通信,它有许多可以单独执行的命令,可以做很高级的操作,(如在传统的Unix shell (sh)中,大多操作就是程序本身。) 这些高级命令简化了代码编写过程。诸如内存自动管理和溢出检查等性能问题可以不用考虑。在更低级或非脚本语言中,内存及变量管理和数据结构等耗费人工,为解决一个给定问题需要大量代码,当然这样能够获得更为细致的控制和优化。脚本缺少优化程序以提速或者降低内存的伸缩性。 综上所述,脚本编程速度更快,且脚本文件明显小于如同类C程序文件。这种灵活性是以执行效率为代价的。脚本通常是解释执行的,速度可能很慢,且运行时更耗内存。在很多案例中,如编写一些数十行的小脚本,它所带来的编写优势就远远超过了运行时的劣势,尤其是在当前程序员工资趋高和硬件成本趋低时。 然而,在脚本和传统编程语言之间的界限越来越模糊,尤其是在一系列新语言及其集成畅出现时。在一些脚本语言中,有经验的程序员可以进行大量优化工作。在大多现代系统中通常有多种合适的脚本语言可以选择,所以推荐使用多种语言(包括C或汇编语言)编写一种脚本。 [编辑本段]与其他编程语言的关系及特点 1.脚本语言(JavaScript,VBscript等)介于HTML和C,C++,Java,C#等编程语言之间。 HTML通常用于格式化和链结文本。而编程语言通常用于向机器发出一系列复杂的指令。 2.脚本语言与编程语言也有很多相似地方,其函数与编程语言比较相象一些,其也涉及到变量。与编程语言之间最大的区别是编程语言的语法和规则更为严格和复杂一些. 3.与程序代码的关系:脚本也是一种语言,其同样由程序代码组成。 注:脚本语言一般都有相应的脚本引擎来解释执行。 他们一般需要解释器才能运行。Python、JAVASCRIPT,ASP,PHP,PERL,Nuva都是脚本语言。C/C++编译、链接后,可形成独立执行的exe文件。 4.脚本语言是一种解释性的语言,例如Python、vbscript,javascript,installshield script,ActionScript等等,它不象c\c++等可以编译成二进制代码,以可执行文件的形式存在. 脚本语言不需要编译,可以直接用,由解释器来负责解释。 5.脚本语言一般都是以文本形式存在,类似于一种命令. 举个例子说,如果你建立了一个程序,叫aaa.exe,可以打开.aa为扩展名的文件. 你为.aa文件的编写指定了一套规则(语法),当别人编写了.aa文件后,你的程序用这种规则来理解编写人的意图,并作出回应.那么,这一套规则就是脚本语言. [编辑本段]计算机脚本语言程序举例 (1)JavaScript: ①用于HTML中: alert("Hello World") ②用于WSH中: WScript.Echo("Hello World") (2)ASP: % Response.Write("Hello, world!") % 或者: % strHelloWorld = "Hello, world!" % %= strHelloWorld % 或者简单地写成: %= "Hello, world!" % (3)PHP: ?php echo 'Hello, world!'; print 'Hello, world!'; ? 或者 ?= "Hello World!"?

如果帮助到您,请记得采纳为满意答案哈,谢谢!祝您生活愉快! vae.la

JavaScript 和 PHP 两种编程语言哪个设计得更好一点

那个网友采纳的答案都没明白你问的是什么意思。所以我就抛个砖。

我没法在这里非常细致的一点一点的对比两个语言的优缺点,自己 Google 一下一大片,只是我刚好主要用这两种语言开发,所以说说我自己的看法。

我觉得单从语言的设计上来说,JavaScript 明显要优于 PHP。

JavaScript 在之前一直令大家所诟病的多在其浏览器端使用时的安全性、不同平台的特性不统一等。但是这些其实并不是 JavaScript 语言本身的问题,而且随着 NodeJS 的出现以及 Ecma 新标准的推动,现在的这些问题已经不是问题,或者即将不是问题。另外,很多人也认为原型继承也是 JavaScript 糟粕的地方之一,但是我觉得没有那么早,何况 ES6 已经支持像创建正常语言的语法一样创建 class。再就是 JavaScript 有很多让人疑惑不解的地方,例如 this 指针的很多特性,变量类型的转换,很多符号的二义性等等。这些问题有些在新的标准中有解决,有一些依然存在。

JavaScript 有一个很好的有点就是最近两年革新的非常快,新的标准快速吸纳了很多现代语言的优秀语法特性,社区也非常活跃。

PHP 是一个让大家喷了多年的语言,虽然用的人很多,但是不得不承认其存在很多问题。很多人认为其设计的如同屎一般。关于 PHP 的问题,建议自行 Google。

但是语言也都在发展,PHP 这几年也做了不少革新,特别是 PHP7不仅仅大幅的提升了性能,而且也给之后的 PHP 发展带来了更多新的可能。

我了解过几种语言,对 JavaScript 和 PHP 比较熟悉,Swift 和 Python 也都有接触。这几种语言里面,我最喜欢的是 JavaScript 和 Swift。

为什么没人推荐用 JavaScript/Node.js 做机器学习和数据分析

1.性能Python的在性能上比较饱受诟病。不过在ML这个问题却不成立,为什么呢?稍微观察就可以发现,流行的基于Python的机器学习库大多不是用纯Python写成的。比如很火的scikit-learn,其核心算法大多都是用Cython实现的,一种Python与C的混合语言。Python在这里起着“胶水”的作用,封装更高级的接口。2.快速开发实际上机器学习的算法不太注重快速开发,甚至是站在其反面。核心一旦实现,就基本上很少有人会去碰了,因为很难保证算法的正确性。这和web开发有着本质的不同,后者是在选定一个框架的基础上,进行功能上的“横向”拓展。因为有成熟的范式可以遵循,所以能做到“快速”。相比之下,机器学习就完全是另一个层次的东西了。


网站栏目:javascript诟病,JavaScript缺点
分享网址:http://hbruida.cn/article/dsijhee.html