derezzed

Python 与 Javascript 之比较 (1)

基本概念

Python和Javascript都是脚本语言,所以它们有很多共同的特性,都需要解释器来运行,都是动态类型,都支持自动内存管理,都可以调用eval()来执行脚本等等脚本语言所共有的特性。

然而它们也有很大的区别,Javascript这设计之初是一种客户端的脚本语言,主要应用于浏览器,它的语法主要借鉴了C,而Python由于其“优雅”,“明确”,“简单”的设计而广受欢迎,被应用于教育,科学计算,web开发等不同的场景中。

编程范式

Python和Javascript都支持多种不同的编程范式,在面向对象的编程上面,它们有很大的区别。Javascript的面向对象是基于原型(prototype)的, 对象的继承是由原型(也是对象)创建出来的,由原型对象创建出来的对象继承了原型链上的方法。而Python则是中规中矩的基于类(class)的继承,并天然的支持多态(polymophine)。

OO in Pyhton

 

    class Employee:

       \'Common base class for all employees\'

       empCount = 0 ##类成员

       def __init__(self, name, salary):

          self.name = name

          self.salary = salary

          Employee.empCount += 1

        

       def displayCount(self):

         print "Total Employee %d" % Employee.empCount

       def displayEmployee(self):

          print "Name : ", self.name,  ", Salary: ", self.salary

    ## 创建实例

    ea = Employee("a",1000)

    eb = Employee("b",2000)

 

OO in JavaScript

 

    var empCount = 0;

    //构造函数

    function Employee(name, salary){

        this.name = name;

        this.salary = salary;  

        this.empCount += 1;

    }

    Employee.prototype.displayCount = function(){

        console.log("Total Employee " + empCount );

    }

    Employee.prototype.displayEmployee = function(){

        console.log("Name " + this.name + ", Salary " + this.salary );

    }

    //创建实例

    var ea = new Employee("a",1000);

    var eb = new Employee("b", 2000);

因为是基于对象的继承,在Javascript中,我们没有办法使用类成员empCount,只好声明了一个全局变量,当然实际开发中我们会用更合适的scope。注意Javascript创建对象需要使用new关键字,而Python不需要。

除了原生的基于原型的继承,还有很多利用闭包或者原型来模拟类继承的Javascript OO工具,因为不是语言本身的属性,我们就不讨论了。

 

线程模型

 

在Javascript的世界中是没有多线程的概念的,并发使用过使用事件驱动的方式来进行的, 所有的JavaScript程序都运行在一个线程中。在HTML5中引入web worker可以并发的处理任务,但没有改变Javascript单线程的限制。

 

Python通过thread包支持多线程。

不可改变类型 (immutable type)

在Python中,有的数据类型是不可改变的,也就意味着这种类型的数据不能被修改,所有的修改都会返回新的对象。而在Javascript中所有的数据类型都是可以改变的。Python引入不可改变类型我认为是为了支持线程安全,而因为Javascript是单线程模型,所以没有必要引入不可改变类型。

当然在Javascript可以定义一个对象的属性为只读。

    var obj = {};Object.defineProperty(obj, "prop", {

        value: "test",

        writable: false});

 在ECMAScript5的支持中,也可以调用Object的freeze方法来是对象变得不可修改。

  Object.freeze(obj)

 数据类型

 

Javascript的数据类型比较简单,有object、string、boolean、number、null和undefined,总共六种

 

Python中一切均为对象,像module、function、class等等都是。

 

Python有五个内置的简单数据类型bool、int、long、float和complex,另外还有容器类型,代码类型,内部类型等等。

 

布尔

 

Javascript有true和false。Python有True和False。它们除了大小写没有什么区别。

 

字符串

 

Javascript采用UTF16编码。

 

Python2使用ASCII码。需要调用encode、decode来进行编码转换。使用u作为前缀可以指定字符串使用Unicode编码。

python3已调整为utf-8编码格式

 

数值

 

Javascript中所有的数值类型都是实现为64位浮点数。支持NaN(Not a number),正负无穷大(+/-Infiity)。

 

Python拥有诸多的数值类型,其中的复数类型非常方便,所以在Python在科研和教育领域很受欢迎。这应该也是其中一个原因吧。Python中没有定义NaN,除零操作会引发异常。

 

列表

 

Javascript内置了array类型(array也是object)

 

Python的列表(List)和Javascript的Array比较接近,而元组(Tuple)可以理解为不可改变的列表。

 

除了求长度在Python中是使用内置方法len外,基本上Javascript和Python都提供了类似的方法来操作列表。Python中对列表下标的操作非常灵活也非常方便,这是Javascript所没有的。例如l[5:-1],l[:6]等等。

 

字典、哈希表、对象

 

Javascript中大量的使用{}来创建对象,这些对象和字典没有什么区别,可以使用[]或者.来访问对象的成员。可以动态的添加,修改和删除成员。可以认为对象就是Javascript的字典或者哈希表。对象的key必须是字符串。

 

Python内置了哈希表(dictS),和Javascript不同的是,dictS可以有各种类型的key值。

 

空值

 

Javascript定义了两种空值。 undefined表示变量没有被初始化,null表示变量已经初始化但是值为空。

 

Python中不存在未初始化的值,如果一个变量值为空,Python使用None来表示。

 

Javascript中变量的声明和初始化

 

    v1;

    v2 = null;

    var v3;

    var v4 = null;

    var v5 = \'something\';

 

 在如上的代码中v1是全局变量,未初始化,值为undefined;v2是全局变量,初始化为空值;v3为局部未初始化变量,v4是局部初始化为空值的变量;v5是局部已初始化为一个字符处的变量。

Python中变量的声明和初始化

    v1 = None

    v2 = \'someting\'

 Python中的变量声明和初始化就简单了许多。当在Python中访问一个不存在的变量时,会抛出NameError的异常。当访问对象或者字典的值不存在的时候,会抛出AttributeError或者KeyError。因此判断一个值是否存在在Javascript和Python中需要不一样的方式。

Javascript中检查某变量的存在性:

    if (!v ) {

        // do something if v does not exist or is null or is false

    }

    if (v === undefined) {

        // do something if v does not initialized

    }

 

注意使用!v来检查v是否初始化是有歧义的因为有许多种情况!v都会返回true

Python中检查某变量的存在性:

 

    try:

        v

    except NameError

        ## do something if v does not exist

 

 在Python中也可以通过检查变量是不是存在于局部locals()或者全局globals()来判断是否存在该变量。

 

分类:

技术点:

相关文章:

  • 2021-08-24
  • 2019-02-18
  • 2022-01-14
  • 2021-12-21
  • 2021-10-07
猜你喜欢
  • 2021-12-14
  • 2021-11-13
  • 2021-12-03
  • 2021-08-06
  • 2022-01-09
  • 2021-12-06
相关资源
相似解决方案