首页 > 代码库 > 用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真是一门特别有魅力的语言,还有很多东西需要探索,自己给自己加加油 哈哈。