自从扎入java之后,js好久没碰了,最近刚好在学node,正好把js温习了一遍,下面是在温习过程中碰到的自认为比较重要的部分,纪录下来,与大家分享,先从基础篇开始吧,以后每个礼拜会更新一章,如有错误,欢迎指正哦~~
1.数据类型
1.1 typeof 操作符
- undefined——如果这个值未定义
- boolean ——如果这个值是布尔值
- string——如果这个值是字符串
- number——如果这个值是数值
- object——如果这个值是对象或null
- function——如果这个值是函数
1.2 Null类型
- 从逻辑角度看,null值表示一个空对象指针,所以如果用typeof检测的话,会返回”object”.
- 实际上,undefined派生自null,所以一般alert(null==undefined),结果为true.
1.3 boolean类型
Boolean()函数:
- 例如: var msg=”hello world”;
var msgAsBoolean=Boolean(msg); 转换规则
数据类型 转换为true的值 转换为false的值 Boolean true false String 任何非空字符串 “”(空字符串) Number 任何非零数字值 (包括无穷大) 0和NaN Object 任何对象 null Undefined n/a undefined
- 例如: var msg=”hello world”;
1.4 NaN
在ecamscript中,任何数值除以0都会返回 NaN
alert(NaN == NaN); //false
isNaN() 函数:isNaN()在接收一个值后,会尝试将这个值转换为数值,某些不是数值的值会直接转换为数值,而任何不能被转换为数值的值都会导致这个函数返回 true.
- 示例:
- alert(isNaN(NaN)); //true
- alert(isNaN(10)); //false
- alert(isNaN(“10”)); //false
- alert(isNaN(“blue”)); //true(不能转换成数值)
- alert(isNaN(true)); //false(可以被转换成数值1)
- 示例:
1.5 数值转换
Number()、parseInt()、parseFloat()
第一个函数,即转型函数Number()可以用于任何数据类型
另外两个函数则专门用于把字符转换成数值。
Number()函数的转换规则如下:
- 如果是boolean,true和false将分别被转换成1和0;
- 如果是数字值,只是简单的传入和返回;
- 如果是null值,返回0;
- 如果是undefined,返回NaN;
- 如果是字符串,遵循以下规则:
- 如果字符串只包含数字,则转换为十进制
- 如果字符串包含有效的浮点格式,如”1.1”,则将其转换为对应的浮点数值
- 如果字符串中包含有效的十六进制格式,如”0xf”,则将其转换成相同大小的十进制整数值
- 如果字符串是空的,则转换为0
- 如果字符串中包含上述格式之外的字符,则将其转为NaN.
如果是对象,则调用对象的valueOf()方法,然后依照前面的规则转换返回的值。如果转换的结果为nan,则调用对象的toString()方法,然后再依照前面的规则转换返回的字符串值。
示例:
- var num1=Number(“Hello world”); //NaN
- var num2=Number(“”); //0
- var num3=Number(“00000011”); //11
- var num4=Number(true); //1
parseInt():
- 示例
- var num1=parseInt(“1234blue”); //1234
- var num3=parseInt(“”); //NaN
- var num4=parseInt(“0xA”); //10
- var num5=parseInt(22.5); //22
- 制定进制进行转换
- var num1=parseInt(“10”,2); //2 按二进制
- var num2=parseInt(“10”,8); //8 按八进制
- …以此类推
- 示例
1.6 String 类型
var str1=”hello world”;
var str2=’hello world’;任何字符串的长度都可以通过length属性获取
ecmascript 中的字符串是不可变的。(类似java)。也就是说,字符串一旦创建,它们的值就不能改变。要改变某个变量保存的字符串,首先要销毁原来的字符串,然后再用另一个包含新值的字符串填充该变量。
- 示例:
var lang=”java”;
lang = lang +”script”;
- 示例:
toString() 转换成字符串
数值、布尔、对象和字符串值都有toString()方法。但null 和undefined值没有这个方法。
那么问题来了,不知道要转换的值是不是null或undefined的情况下,还可以使用转型函数script(),这个函数能够将任何类型的值转换为字符串。规则如下:- 如果值有toString()方法,则调用该方法(没有参数)并返回相应的结果;
- 如果值是null,则返回”null”;
- 如果值是undefined,则返回”undefined”.
- 示例:
var val1=10;
var val2=true;
var val3=null;
var val4;
alert(String(val1)); //”10”
alert(String(val2)); //”true”
alert(String(val3)); //”null”
alert(String(val4)); //”undefined”
1.7 Object
ECMAScript中的对象其实就是一组数据和功能的集合。对象可以通过执行new操作符后跟要创建的对象类型的名称来创建。而创建object类型的实例并为其添加属性或方法,这点跟java是类似的~
var o=new Object();
但在ECAMSript中,如果不给构造函数传递参数,那么可以省略后面的括号:
var o=new Object; 也是正确的,不过不推荐哦~~
- 跟java中的java.lang.Object对象一样,Object类型是所有它的实例的基础。换句话说,object类型所具有的任何属性和方法也同样存在于更具体的对象中。
- constructor——保存着用语创建当前对象的函数。对于前面的例子而言,构造函数就是Object();
- hasOwnProperty(propertyName)——用于检查给定的属性在当前对象实例中(而不是在实例的原型中)是否存在。其中,作为参数的属性名必须以字符串形式制定
- propertyIsEnumerable(propertyName)——用于检查给定的属性是否能够使用for-in语句来枚举。与hasOwnProperty()方法一样,作为参数的属性名必须以字符串形式指定。
- toString()
- valueOf();
2. 操作符
2.1 逻辑非(!)
- 如果操作数是一个对象,返回 false
- 如果操作数是一个空字符串,返回true
- 如果操作数是一个非空字符串,返回false
- 如果操作数是数值 0,返回true
- 如果操作数是任意非0数值(包括Infinity),返回false
- 如果操作数是null,返回true
- 如果操作数是NaN,返回true
- 如果操作数是undefined,返回true
2.2 相等和不相等
表达式 | 值 | 表达式 | 值 |
---|---|---|---|
null == undefined | true | true == 1 | true |
“NaN” ==NaN | false | true==2 | false |
5 == NaN | false | undefined == 0 | false |
NaN == NaN | false | null ==0 | false |
NaN != NaN | true | “5”==5 | true |
false ==0 | true |
2.3 全等和不全等(推荐)
全等操作符 由3个等号 (===)表示,它只在两个操作符未经转换就相等的情况下返回true,例如:
var result1=(“55” == 55); //true,因为转换后相等
var result2=(“55” === 55); //false,因为不同的数据类型不相等不全等 (!==)例如:
var result1=(“55” != 55); //false,因为转换后相等
var result2=(“55” !== 55);//true,因为不同的数据类型不相等
2.4 label语句与 break、continue语句
break和continue语句都可以与label语句联合使用,从而返回代码中特定的位置。这种联合使用的情况多数发生在循环嵌套的情况下:
` var num=0;
outermost:
for(var x=0;x<10;x++){
for(var y=0;y<10;y++){
if(x==5 && y==5){
break outermost;
}
num++;
}
}
alert(num);
`
3 .function 函数
在ECMAScript中的所有参数传递都是值,不可能通过引用传递参数。
理解参数
形如:function functionName(arg0,arg1,arg2,...,argN){} 与其他语言不同的是,在ECMAScript中, function并不在乎函数传递进来多少个参数,也不在乎你传进来是什么数据类型。换句话说,即便你定义的函数只接收两个参数,但在调用这个函数的时候,你也未必一定要传两个参数,你可以传一个、两个、三个甚至不传等等,这不会产生什么错误。 这是什么道理呢?原因在于ECAMScript中的参数在内部是一个数组表示的,函数接收到的始终是这个数组,而并不关心数组中包含哪些参数。就像你喜欢一个人,第一印象必然是这个人,而不是他的内在或者其他,只要是个人。。。。所以只要是个函数而已~~那你在与其交往的过程中,你喜欢的对象会将其内在的元素一个个传递给你,从而你知道你接下来要干什么~~ 其实,arguments对象只是与数组类似(它并不是Arrays的实例),因为可以使用方括号语法访问它的每一个元素,即第一个元素就是arguments[0],使用length属性来确定传递进来多少个参数。 *实例: function helloworld(str1,str2){ alert(str1+","+str2); } 也可以写成: function helloworld(){ alert(arguments[0]+","+arguments[1]); } 结果都是一样的,返回 hello,world * ok,我们继续看两个例子: function toAdd() { if(arguments.length == 1){ alert(arguments[0]+10); } else if(arguments.length == 2){ alert(arguments[0]+arguments[1]); } } toAdd(10); //20 toAdd(10,20); //30 其实这样也算是小小弥补了ECAMScript木有重载的缺陷啦~~ ok,两一个重要的消息就是arguments可以和命名参数一起使用,给个实例: function doAdd(num1,num2) { if(arguments.length == 1){ alert(num1+10); }else if(arguments.length == 2){ alert(arguments[0]+num2); } } 注意,这样用的话虽然效果是一样的,但是如果你调用函数的时候只传了一个参数,另一个就会保存为undefined值~~ ****在ECMAScript中,所有的参数传递都是值传,木有引用传递!!!
没有重载
ECMAScript中没有真正意义上的函数重载,就像前面函数传参的时候所说,ECMAScript函数没有签名(签名是指函数的参数个数与其参数类型组成的一种声明,通过函数签名的不同来区别函数重载时到底调用哪个方法),因为其参数是由包含零或多个值的数组来表示的,而如果没有函数签名,真正的重载是不可能做到的。 注意:如果在ECMAScript中定义了两个名字相同的函数,则该名字只属于后定义的函数,即后定义的函数返回值会覆盖先前定义的函数返回值。 我们可以通过检查传入函数中参数的类型和数量来模拟函数的重载~~