Java和JS的那些不同
记得刚学JavaScript时,就听见有人说JavaScript和Java之间的关系就像是:巴基斯坦和卡巴斯基、面包和面包车,可以说两者除了语言名字上有点像以外,几乎毫无关系。其实为啥JavaScript叫这个名字,Nicholas C.Zakas大神在《JavaScript高级程序设计》的开篇中就有提到,起初JavaScript叫LiveScript,不过九几年那时候Java正火,为了赶波顺风车,于是LiveScript更名为JavaScript。
1. JavaScript是动态语言,可以把任意数据类型赋值给变量,同一个变量可以反复赋值,而且可以是不同类型的变量。这种变量本身类型不固定的语言称之为动态语言,与之对应的是静态语言。JS是解释型语言,即在程序运行时把语言翻译成机器语言。
Java就是静态语言。静态语言在定义变量时必须指定变量类型,如果赋值的时候类型不匹配,就会报错。Java是编译型语言,即在程序运行前把语言翻译成机器语言。
2. JS中,单双引号没有区别,它们都用来表示字符串。
Java中,字符型(char)的值用单引号括起来,表示单个字符 char c = 'a';
字符串(String)的值用双引号括起来,表示一个或多个字符 String s = "abc";
String s = 'hello'; //Java报错
3. JS中,正则表达式用 / / 包起来
var str = "abc123" str = str.replace(/\d{3}/, ""); //注意replace方法不会对字符串本身做出改变
Java中,正则表达式用 " " 包起来
String str = “abc123”; str = str.replaceAll("(.{2})(.{*})(.{2})", "$1***$3"); //注意replaceAll方法也不会改原字符串 //Java替换字符串有两个常用的方法,replace()和replaceAll() //replace的参数是char和CharSequence,即可以支持字符的替换,也支持字符串的替换 //replaceAll的参数是regex,即基于规则表达式的替换
4. JS中有变量提升
Java中没有变量提升,但函数有提升。在public static void main 中,可以使用在其后声明的函数块,不可以使用在其后声明的变量
5. JS中的this不限制使用范围,使用时注意this的指向即可。JS中函数里的this指向的是window,生成实例后指向实例化后的对象。需要注意的是在ES6的箭头函数中不可以改变this绑定
function Student(name){ this.name = name; } Student("kuro-p"); //直接调用,则创建全局变量name;如果已存在全局变量name,则更改全局变量name的值 var Tom = new Student("Tom"); //构造函数调用,创建对象属性name console.log(Tom.name); //Tom
Java的入口函数public static void main中,不能调用this,this只能用在构造函数或方法里
在构造方法里的this指向当前对象
class Student(){ String name=""; public student (String name){ this.name = name; //这个this.name指的是class student里的变量name,需要在class中提前声明才能使用 } }
5. 返回值问题
不管是JS还是Java都要注意方法的返回值是什么,拿Java举例来说,ArrayList.add()方法的返回值是布尔值,BigDecimal.add()方法并没有更改原数据。
6. 关于花括号"{ }"
在JS中,花括号可用来初始化一个对象,一种用键值对保存数据的数据类型
var person = { name: "Kuro-P", age: 23 }
在Java中,花括号中的代码是这个类在实例化之前所做的一些操作,可以看作是构造方法前的初始化方法
String[] fruits = { "apple", "pear", "banana" };
7. 循环
JS 和 Java 都可以用最基本的for循环来实现循环语句
for(var i=0: i<list.length; i++){...} //JS for(int i=0: i<list.length; i++){...} //Java
对于普通的数组循环,二者都提供了更为便利的方法
JS可用 for..of...(注意兼容)
for(item in list){...}
Java用 for.. : ..
for(item : list){...}
8. 数组长度
在JS中,字符串和数组长度都可以用length属性获取
var name = 'Kuro-P'; console.log(name.length); // 6 var arr = ['K', 'u', 'r', 'o', '-', 'P']; console.log(arr.length); //6
在Java中,有长度访问三种方式分别对应三种情况 (详情)
- 访问数组长度时,用 length 属性
- 访问String长度时,用 length() 方法
- 访问List等泛型集合长度时,用 size() 方法
public static void main(String[] args) { String []list={"lHTML","CSS","JS"}; String name="Kuro-P"; List<Object> array=new ArrayList(); array.add(name); System.out.println(list.length); //3 System.out.println(name.length()); //6 System.out.println(array.size()); //1 }
9. 数据类型转换
JS中的基本数据类型中常需要操作的就是String和number
var number = 123;// number转换成String number.toString(); // "123" // String转换称number // 若用 parseInt() 转换成含有非数字的字符串时,非数字部分要在数字部分的后面 parseInt("15px") // 15 parseInt("px15") // NaN // 浮点数取整 parseInt(123.456) //123 parseInt(123.678) //123 // 浮点数取整也可以用Math里的方法
Java中的强制类型转换,就要用到其包装类的方法
// String 转 Integer Integer.parseInt( str ) // 或者 (int) 123 这样声明 // 强制转换为Double同理 Double.parseDouble()
10. 日期类型的转换
JS中 Data to String 或者 String to Date 如下
var startDate = new Date(),
endDate = new Date(startDate + 24 * 60 * 60 * 1000 * 31); //对时间进行加减操作 +31 天 startDate.toLocalDateString(); //"2018/7/23" 高版本的Chrome和Safari 表现一致,但鉴于有不同版本浏览器表现不一致的情况,谨慎使用 startDate.getFullYear(); //2018 startDate.getMonth() + 1; //7 startDate.getDate(); //23 //同时也可以set时间 startDate.setFullYear(2017); startDate.setMonth(6); startDate.setDate(28);
Java中常用的对Date操作的方法如下
//1. 对Date对象进行加减时间操作( 用calendar类 ) Date date = new Date(); Calendar calendar = Calendar.getInstance(); calendar.setTime(date); calendar.add(Calendar.YEAR, -1); // 对时间进行处理 calendar.add(Calendar.MONTH, -1); Date oldDate = calendar.getTime(); //return Date //2. 将字符串转化为Date( 用SimpleDateFormat类 ) SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd"); //大小写含义不同,不可随意使用 String today = "2018/7/23"; try{ Date todayDate = simpleDateFormat.parse(today); } catch (ParseException e) { System.out.println(e); }
java关于日期参数的参考:SimpleDateFormat使用详解