首页 > 代码库 > 用Java来比较JavaScript的一些特性

用Java来比较JavaScript的一些特性

  由于是从java做到JavaScript,所以对强弱语言类型,还是比较敏感的。JavaScript是弱语言,只严格区分数据和指令。简单描述下自己对两者之间的一些区别吧。

  1、JavaScript变量的类型取决于右侧的对象。

JavaScript:

var variable_name = new Object();

Java:

Object variable_name = new Object();


  2、JavaScript没有块级作用域,

Java:

if(true) {
    Object a = 1;
}
System.out.println(a); // 编译错误,超出作用域

JavaScript:

if(true){
    var a = 1;
}
console.log(a); // 1 JavaScript没有块级作用域

而JavaScript的作用域一般体现在函数作用域上。

 

  3.比较特别的是JavaScript会把声明提前,像这样

function test() {
    console.log(a); // 输出undefined,而不是变量not defined,说明函数声明提前了,但是初始化没提前,所以输出的不是1
    var a = 1;
}
test();

function test2(){
    var a = 1;
    if(true) {
       console.log(a); // 输出也是undefined,而不是1
       var a = 2;           
    }
}
test2();

  4.JavaScript没有像Java一样可以直接调用成员变量的语法,通常只能是:

var data = http://www.mamicode.com/{‘one‘:1,‘two‘:2};
with(data) { // 模拟作用域,在use strict严格模式下会抛语法错误
  console.log(one);// 输出 1 
  console.log(two);// 输出 2

}

  值得注意的是上面with使用的作用域内,只能对已有的属性进行操作,而不能创建新属性。同时在use strict模式下,还限制了arguments对象的callee和caller两个属性的使用,一用就会报错。之前接手的嵌入式web端有用setTimeout实现setInterval功能的,就是调用了callee,代表正在执行的方法,就好像接力棒一样,但明显这在严格模式下是无法使用的。

  5.在ECMAScript5的标准里多了一些函数式编程的方法,主要是Array对象的实例方法forEach、reduce,或者就是我们经常使用的回调,把函数作为参数传递的,跟高阶函数有点相似,但是没有返回函数。作为一个前端开发人员,对于下面这样的回调方法应该很熟悉

$.post(‘url:getData‘,function(data){
    if(data) console.log(data);// 将函数作为参数传递进去,然后在post方法里面调用这个匿名函数
});

  6.JavaScript无法正确地表示0.1这样的简单小数,尽管在数值上已经非常接近,但在进行equals类似的操作时仍会出错,解决方案有将小数点左右两侧的数据分开来计算之后再合并。

 

JavaScript真是一门特别有魅力的语言,还有很多东西需要探索,自己给自己加加油 哈哈。