记得刚学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
详情)
- 访问数组长度时,用 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);
}