此文先从语法角度讲述,会持续总结更新,先开个篇再说,有想法的同学也可以在下面留言。
js和java属于两门语言。参考了java语言,“看上去与Java足够相似,但是比Java简单”,是简化版Java语言。特别是在定义对象变量的时候,省略的太极端了。java里有的很多常用类型的对象在js中是没有的。js由原网景(Netscape)公司的高级工程师布兰登·艾奇(Brendan Eich)(曾经的 Mozilla公司的十天CEO)研发。
1.equals()方法
js中比较字符串相等不能用equals(没有equals,你也可以自己写个插件类的工具脚本),而用双等于==
而java有equals()方法。
2.集合类
js中没有Set、Map和List(但有数组Array()),需要自己利用Array写实现方法。
(js中的Array()请参考:http://www.w3school.com.cn/js/js_obj_array.asp)
(稍后会持续总结出类似于java中的Set、Map、List等等对象工具类js供大家下载参阅)
Map.js: http://download.csdn.net/download/superit401/10048291
List.js http://download.csdn.net/download/superit401/10048302
Set.js http://download.csdn.net/download/superit401/10048305
3.js和java中的length,length()对比:
js中只有length(在字符串长度、数组)没有length(),java中数组用length,字符串用length().
请参考:http://blog.csdn.net/superit401/article/details/78408500
4.js和java中的size,size()对比:
Java和js中没有size,但是java中集合用size(),js的轻量级jquery框架获取元素个数用size().
5.判断是否有指定字符串
java中的String有contains()方法,但js中没有,可用indexOf()!=或==-1代替。
6.JS的逻辑运算符&& 、 ||和位运算符 & 、 | 的区别:与java不同的是在进行逻辑运算时,&&和& 、|| 和 | 只有点小区别。
性能上的比较
逻辑运算符&& || 中,如果&&的第一个运算数是false,就不再考虑第二个运算数,直接返回false;如果||的第一个运算数是true,也不再考虑第二个运算数,直接返回true。而&和|运算符却不是这样的,它们总是要比较两个运算数才得出结果,因而性能上&&和||会比&和|好。
功能用法
&&和||只能进行逻辑运算,而&和|除了可以进行"逻辑运算"外,还可以进行位运算
7.substring()与substr():
java中只有substring()方法,js中substring()和substr()都有。
java中的substring(beginIndex,endIndex)是从角标beginIndex开始截取到endIndex-1结束(即含头不含尾),substring(beginIndex)是从beginIndex(含)开始截取后面所有的。
js中的substring(beginIndex,endIndex)同java的,还有个substr(start,length)是从 start 下标开始的length个字符。
8.for循环
java可写成for(String s : ss){}类型的,而js不可以,只能老老实实写for(var i=0;i<ss.length;i++){}类型的或for...in 循环:
var person={fname:"Bill",lname:"Gates",age:56};
for (x in person)
{
txt=txt + person[x];
}
9.都有的:new Object()、
都可把String赋值给Object
java:
Object o = "sdf";
js:
var b= new Object();
b="sdf";
或var b= new Object("sdf");//双引号
或var b= new Object('sdf');//单引号
但java中不可写成Object o = new Object("sdf");
10.类型判断
java中判断类型用obj.getClass().toString();
js中用typeof obj 或 typeof(obj)、Object.prototype.toString.call、obj.constructor、instanceof(不推荐使用,很容易判断出错)、$.type
参考:https://www.cnblogs.com/a546558309/p/3608194.html
js检测变量类型:typeof
typeof 123 //Number
typeof 'abc' //String
typeof true //Boolean
typeof undefined //Undefined
typeof null //Object
typeof { } //Object
typeof [ ] //Object
typeof console.log() //Function
js的instanceof的使用:
function Person(){};
var p =new Person();
console.log(p instanceof Person);//true
但为什么还是不推荐使用,看例子:
var simpleStr = "This is a simple string";
console.log(simpleStr instanceof String);//false
出乎意料吧,还敢用吗
总结:1. 一般简单的使用 typeof 或 instanceof 检测(这两种检测的不完全准确)
2. 完全准确的使用 原生js中的 Object.prototype.toString.call 或 jquery中的 $.type 检测
参考:
http://www.cnblogs.com/zhangruiqi/p/8027338.html
https://www.cnblogs.com/SourceKing/p/5766210.html
https://www.cnblogs.com/Trr-984688199/p/6180040.html
https://www.cnblogs.com/onepixel/p/5126046.html
11.indexOf()
都有indexOf()的用法,用于查指定字符串首次出现的位置(从0开始的角标);
也都有lastIndexOf()。
12.正则表达式区别
java与js的正则表达式的区别:参考:https://blog.csdn.net/superit401/article/details/79713730
13.字符串转换成整型
java与js的字符串转换成整型:java:Integer.parseInt();js:parseInt()
14.变量(数据)类型
java:
8个基本类型:byte、short、int、long、float、double、boolean、char
引用类型:除了四类八种基本类型外,所有的类型都称为引用类型,如String、数组、Object、class、interface、
js中有六种数据类型,包括五种基本数据类型(Number,String,Boolean,Undefined,Null)和三大引用类型:Object、Array、Function。
15.变量定义
java变量定义时可以不赋值(只定义类型),但是用前必须赋值使其初始化;
js变量定义时可以不赋值直接使用(不报错):
var a;
alert(a+"www");//undefinedwww
又如
var a;
alert(a+1);//NaN
js定时变量时可以不声明类型直接赋值(js自动识别类型,var就是个广义的、不确定的类型,你给它赋值成什么类型的它会自动识别,var可省略):
a=-0;
alert(a+1);//1
16.数组声明
java数组
不同的是java中没有Array array = new Array()的写法。
double[] myList = {1.9, 2.9, 3.4, 3.5};//只可用于初始化,不能给object赋值
Object obj = {1.9, 2.9, 3.4, 3.5};//报错,理由:只可用于初始化
但是Object obj = new int[]{3, 1, 2, 6, 4, 2};不报错
int[] d = new int[]{3, 1, 2, 6, 4, 2};
double[] myList = new double[3];
myList[0] = 5.6;
myList[1] = 4.5;
myList[2] = 3.3;
多维数组
String s[][] = new String[2][];
s[0] = new String[2];
s[1] = new String[3];
s[0][0] = new String("Good");
s[0][1] = new String("Luck");
s[1][0] = new String("to");
s[1][1] = new String("you");
s[1][2] = new String("!");
js数组
var cars=new Array();//注:此处可为new Array(n),但数字n不起作用,可带可不带n
cars[0]="Audi";
cars[1]="BMW";
cars[2]="Volvo";
或
var cars=new Array("Audi","BMW","Volvo");
或
var cars=["Audi","BMW","Volvo"];
判断是否为数组的方法:
Array.isArray(cars);
---------------
java数组:int[] left = {};
js数组:var left = [];
但是js数组有push、slice等方法:left.push(12); left.slice(2);
java数组没有这些方法。
17.对象声明
java对象声明有5种方式:使用new关键字、使用Class类的newInstance方法、使用Constructor类的newInstance方法 、使用clone方法、使用反序列化。
①使用new关键字
Employee emp1 = new Employee();
②使用Class类的newInstance方法
Employee emp2 = (Employee) Class.forName("org.programming.mitra.exercises.Employee").newInstance();
或者
Employee emp2 = Employee.class.newInstance();
③使用Constructor类的newInstance方法
Constructor<Employee> constructor = Employee.class.getConstructor();
Employee emp3 = constructor.newInstance();
④使用clone方法
Employee emp4 = (Employee) emp3.clone();
⑤使用反序列化
ObjectInputStream in = new ObjectInputStream(new FileInputStream("data.obj"));
Employee emp5 = (Employee) in.readObject();
参考:https://www.cnblogs.com/wxd0108/p/5685817.html
js对象:
JavaScript 中的所有事物都是对象:字符串、数值、数组、函数、数学和正则表达式
String、Date、Array、Boolean、
此外,JavaScript 允许自定义对象。
①通过object方式创建
person=new Object();
person.firstname="John";
person.lastname="Doe";
person.age=50;
person.eyecolor="blue";
②通过”字面量“方式创建
js对象直接声明:
var person={firstname:"Bill", lastname:"Gates", id:5566};
空格和折行无关紧要。声明可横跨多行:
var person={
firstname : "Bill",
lastname : "Gates",
id : 5566
};
③通过”构造函数“方式创建
function person(firstname,lastname,age,eyecolor) {
this.firstname=firstname;
this.lastname=lastname;
this.age=age;
this.eyecolor=eyecolor;
}
一旦您有了对象构造器,就可以创建新的对象实例,就像这样:
var myFather=new person("John","Doe",50,"blue");
对象属性有两种寻址方式:
name=person.lastname;
name=person["lastname"];
参考:http://www.w3school.com.cn/js/js_objects.asp
https://www.cnblogs.com/dongjc/p/5179561.html
https://www.cnblogs.com/zczhangcui/p/6389023.html
https://www.cnblogs.com/nuannuan7362/p/6368102.html
https://www.cnblogs.com/juggdxy/p/8245491.html
https://www.cnblogs.com/Jener/p/5878858.html
https://www.cnblogs.com/petterMother/articles/3665358.html
https://www.cnblogs.com/zyiii/p/8822550.html
18.js变量具体声明
(1)String类型声明
java:
String s = "abc"; 或 String s = new String("abc");
js:
var s=new String;//s值为""
var s=new String();//s值为""
var s=new String("df");
var s=new String('df');
typeof(s);//object
(2)数字类型声明
java:
直接赋值或使用包装类自动拆装,如:
int i = new Integer(3);
js:
var x= new Number;//x值为0
var x= new Number();x值为0
var x= new Number(56.90);
typeof(x);//object
(3)布尔型声明
java:
直接赋值或使用包装类自动拆装,如:
boolean b = new Boolean(false);
js:
var y= new Boolean;//y值为false
var y= new Boolean();//y值为false
var y= new Boolean(true);//y值为true
var y= new Boolean(1);//y值为true,但java没有此用法
var y= new Boolean(0);//y值为false,但java没有此用法
typeof(y);//object
(4)数组类型
var c= new Array;
var c= new Array();
var c= new Array("Audi","BMW","Volvo");
typeof(c);//object
参考 16.数组声明
(5)对象
var b= new Object;
var b= new Object(value);//value {number | bool | string} :一个数字、布尔值或者字符串,返回对应类型
//var b= new Object(firstname:"Bill", lastname:"Gates", id:5566);//报错
typeof(b);//object
b={firstname:"Bill", lastname:"Gates", id:5566};
参考 17.js变量具体声明
19.encode和decode
java:
String str = URLEncoder.encode("中国","utf-8");
System.out.println(str);//%E4%B8%AD%E5%9B%BD
//解码
String str1=URLDecoder.decode(str, "UTF-8");
System.out.println(str1);//中国
js:
传参:用encodeURI("url参数")将url编码
收参:用decodeURI("接收到的值")解码
encodeURI() 函数是不会进行转义的:;/?:@&=+$,#
不会对 ASCII 字母和数字进行编码,也不会对这些 ASCII 标点符号进行编码: - _ . ! ~ * ' ( ) 。
encodeURI方法不会对下列字符编码 ASCII字母、数字、~!@#$&*()=:/,;?+'
encodeURIComponent方法不会对下列字符编码 ASCII字母、数字、~!*()'
所以encodeURIComponent比encodeURI编码的范围更大。
encodeURIComponent适合编码URL中的参数。
20.判断undefined
java:未定义变量就使用就会提示报错
js:
if( typeof(document.mylist.length) != "undefined" ) {}
或
if( !isNaN(document.mylist.length) ) {}
typeof的运算数未定义,返回的就是 "undefined".
错误用法:
if(document.mylist.length != "undefined" ) {}
21.类型转换
字符串转数字(以int为例):
java:
第一种:Integer.parseInt(s);
第二种:i=Integer.valueOf(s).intValue();
js:
Number类型的数值转换方式可能通过三个函数:Number()、parseInt()、parseFloat()。
int转String:
java:
第一种方法:s=i+"";
第二种方法:s=String.valueOf(i);
第三种方法: Integer.toString(i);
js:
数字转String:
i.toString();
new String(10);
String(123);
更多方法:
方法 | 描述 |
---|---|
toExponential() | 把对象的值转换为指数计数法。 |
toFixed() | 把数字转换为字符串,结果的小数点后有指定位数的数字。 |
toPrecision() | 把数字格式化为指定的长度。 |
将日期转为字符串
java:
SimpleDateFormat sdf = new SimpleDateFormat( " yyyy年MM月dd日 " );
String str = sdf.format(new Date());
或Date date = new Date();
System.out.println(date.toInstant());//2019-03-06T08:55:30.167Z
或System.out.println(date.toString());//Wed Mar 06 16:56:12 CST 2019
或System.out.println(date.toLocaleString());//2019-3-6 16:57:04
js:
String(new Date()) ;
或obj = new Date()
obj.toString();
将日期转为数字
java:
Date date = new Date();
System.out.println(date.getTime());//1551862817140
js:
d = new Date();
Number(d) ;
或d.getTime();
布尔值转为字符串
java:
String.valueOf(b);
或b+"";
js:
String(false) // 返回 "false"
String(true) // 返回 "true"
或
false.toString() // 返回 "false"
true.toString() // 返回 "true"
将布尔转为数字
java:
不能转换
js:
全局方法 Number() 可将布尔值转换为数字。
Number(false) // 返回 0
Number(true) // 返回 1
自动类型转换
java:
Integer和int自动相互转换,其他Double、Float。。。类似
5 + null //会报错
"5" - 1 //会报错
js:
5 + null // 返回 5 null 转换为 0
"5" - 1 // 返回 4 "5" 转换为 5
参考:http://www.runoob.com/js/js-type-conversion.html
22.null与undefined
java:
null:对象定义但没有初始化或赋值,程序一般不会报错也不会终止
undefined:未定义对象,程序会报错而终止
js:
null:是一个表示无的对象,转换为数值为0;
如:
alert(null == document.getElementById('notExistElement')); //true(仅当页面上不存在id为"notExistElement"的DOM节点时)
undefined:表示一个无的原始值,转化为数值为NAN(与任何数字相加也为NAN)
如:
var oValue;
alert(oValue == undefined); //true
undefined出现原因:(口诀:一变量二函数一对象)
1.变量被声明了但是没赋值时
2.调用函数时,应该提供的参数没提供,则该参数为undefined
3.函数没有返回值时,默认返回undefined
4.对象没有赋值的属性
null出现原因
1.作为函数的参数,表示该函数的参数不是对象
2.作为对象原型链的终点
Undefined类型只有一个值,即undefined。当声明的变量还未被初始化时,变量的默认值为undefined。
Null类型也只有一个值,即null。null用来表示尚未存在的对象,常用来表示函数企图返回一个不存在的对象。
alert(typeof undefined); //undefined
alert(typeof null); //object
alert(null == undefined); //true
alert(null === undefined); //false
alert(typeof null == typeof undefined); //false
null与undefined的类型是不一样的,所以输出"false"。而===代表绝对等于,在这里null === undefined输出false。
23.字符串与数字比较
java中:
"23"==23,返回false
js中:
"23"==23,返回true
24.replace(reg,substr)用法相同:reg有(匹配到)则替换,没有则返回原字符串,且原字符串都不会被改变。
java:
String source = "fhsuirr";
System.out.println(source.replace("tt", ""));
System.out.println(source);
js:
var source = "fhsuirr";
alert(source.replace("rr", ""));
alert(source);