空值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()来判断是否存在该变量。 类型检查Javascript可以通过typeof来获得某个变量的类型: typeof in Javascript 的例子: typeof 3 // "number" typeof "abc" // "string" typeof {} // "object" typeof true // "boolean" typeof undefined // "undefined" typeof function(){} // "function" typeof [] // "object" typeof null // "object" 要非常小心的使用typeof,从上面的例子你可以看到,typeof null居然是object。因为javscript的弱类型特性,想要获得更实际的类型,还需要结合使用instanceof,constructor等概念。具体请参考这篇文章 Python提供内置方法type来获得数据的类型。 >>> type([]) is list True >>> type({}) is dict True >>> type('') is str True >>> type(0) is int True 同时也可以通过isinstance()来判断类的类型 class A: pass class B(A): pass isinstance(A(), A) # returns True type(A()) == A # returns True isinstance(B(), A) # returns True type(B()) == A # returns False 但是注意Python的class style发生过一次变化,不是每个版本的Python运行上述代码的行为都一样,在old style中,所有的实例的type都是‘instance’,所以用type方法来检查也不是一个好的方法。这一点和Javascript很类似。 自动类型转换当操作不同类型一起进行运算的时候,Javascript总是尽可能的进行自动的类型转换,这很方便,当然也很容易出错。尤其是在进行数值和字符串操作的时候,一不小心就会出错。我以前经常会计算SVG中的各种数值属性,诸如x,y坐标之类的,当你一不小心把一个字符串加到数值上的时候,Javascript会自动转换出一个数值,往往是NaN,这样SVG就完全画不出来啦,因为自动转化是合法的,找到出错的地方也非常困难。 Python在这一点上就非常的谨慎,一般不会在不同的类型之间做自动的转换。 语法风格Python使用缩进来决定逻辑行的结束非常具有创造性,这也许是Python最独特的属性了,当然也有人对此颇具微词,尤其是需要修改重构代码的时候,修改缩进往往会引起不小的麻烦。 Javascript虽然名字里有Java,它的风格也有那么一点像Java,可是它和Java就好比雷峰塔和雷锋一样,真的没有半毛钱的关系。到时语法上和C比较类似。这里必须要提到的是coffeescript作为构建与Javascript之上的一种语言,采用了类似Python的语法风格,也是用缩进来决定逻辑行。 Python风格 def func(list): for i in range(0,len(list)): print list[i] Javascript风格 function funcs(list) { for(var i=0, len = list.length(); i < len; i++) { console.log(list[i]); } } 从以上的两个代码的例子可以看出,Python确实非常简洁。 作用范围和包管理Javascript的作用域是由方法function来定义的,也就是说同一个方法内部拥有相同的作用域。这个严重区别与C语言使用{}来定义的作用域。Closure是Javascript最有用的一个特性。 Python的作用域是由module,function,class来定义的。 Python的import可以很好的管理依赖和作用域,而Javascript没有原生的包管理机制,需要借助AMD来异步的加载依赖的js文件,requirejs是一个常用的工具。 赋值逻辑操作符Javascript使用=赋值,拥有判断相等(==)和全等(===)两种相等的判断。其它的逻辑运算符有&& 和||,和C语言类似。 Python中没有全等,或和与使用的时and 和 or,更接近自然语言。Python中没有三元运算符 A :B ?C,通常的写法是 (A and B) or C 因为这样写有一定的缺陷,也可以写作 B if A else C Python对赋值操作的一个重要的改进是不允许赋值操作返回赋值的结果,这样做的好处是避免出现在应该使用相等判断的时候错误的使用了赋值操作。因为这两个操作符实在太像了,而且从自然语言上来说它们也没有区别。 |