语言特性
1、动态性
动态性是指,在一个javascript对象中,要为一个属性赋值,我们不必事先创建这个属性,只需要在使用的时候做赋值操作即可。
var obj=new Object();
obj.name="demo";
obj.sayHi=function(){alert("Hi");}
2、弱类型
与java、.net等不同,javascript是弱类型的。它的数据类型无需在声明变量时指定,解释器会根据上下文对变量进行实例化。
var s="test";
s=new Object();
s.name="object";
弱类型语言的变量可以重复利用,比如赋值为字符串类型后,可以赋值为其他类型。比如Number类型、对象等。
3、解释和编译
javascript是一门解释性的语言,特别是作为浏览器中的javascript,所有主流浏览器都将javascript作为一门解释性语言。然后这并非定则,如在java版的javascript解释 器 rhino中,脚本是被编译为字节码的。
解释型语言随时可以被修改,无需编译,浏览器刷新后重新解释,可以实时看到程序的结果,但每一次都解释,产生的开销较大。编译型语言只需要编译一次,每次运行编译过的代码即可,但丧失了动态性。
- 数据类型
1、基本数据类型
在javascript中,包含三种基本的数据类型,字符串(String)、数值(Number)、布尔值(Boolean)。
2、对象类型
对象(属性的集合,即键值的散列表)、数组(有序的列表)、函数(包含可执行的代码)
3、两者之间的转换
自动装箱:基本数据类型在做一些基本运算时,会临时包装成一个对象,做完运算后,又自动释放该对象。
var str="hello world!";
alert(str.length)
当使用str.length时,javascript会自动包装成一个临时的String对象,内容为str的内容,然后获取该对象的length对象,最后,这个临时的对象将被释放。
拆箱:将对象转换为基本的数据类型的方式,通过调用对象的valueOf()和toString()方法。valueOf()的作用是将一个对象的值转换成一种合乎上下文需求的基本类型,toString()的作用是专为对象对应的字符串,当然前提是该对象重载了Object的toString()方法。
所以非空对象,在布尔值环境下,都会被转化为true。如下:
if (new Boolean(false) && new Object() && new String("") && new Array()) {
alert("convert to boolean");
}
- 运算符
[]运算符
[]运算符可用在数组对象和对象上,从数组中按下标取值。在访问对象的时不知道属性的时候可以通过for遍历对象,取出每个属性对应的值。
.运算符
.运算符的左边为一个对象(属性的集合),右边是属性名,应该注意的是右边的值除了作为左边的对象的属性外,同时还可能是它自己的右边的值的对象。
==和===以及!=和!==
运算符==读作相等。相等操作符会对两边的操作数做类型转换。
运算符===读作等同。等同操作符不会对两边的操作数做类型转换。
eg:
alert(1==true)
alert(1===true);
alert(""==false);
alert(""===false);
alert(null==undefined);
alert(null===undefined);
相等和等同运算符的规则分别如下:
相等运算符
如果操作数具有相同的类型,则判断其等同性,如果两个操作数的值相等,则返回true,否则返回false。
如果操作数的类型不同,规则如下:
null和undefined相等
其中一个数字,另一个字符串,则将字符串转换为数字,在做比较
其中一个true,先转换成1(false转成0)在做比较
其中一个是对象,另一个是数字/字符串,则将对象转换为原始值(通过toString()或者valueOf()方法)
其他情况,则直接返回false
等同运算符
如果操作数类型不同,则不进行值的判断,直接返回false
如果操作数的类型相同,规则如下
都是数字,如果值相同,则两者等同(有一个例外,就是NaN、NaN与其本身也不相等)。否则不等同
都是字符串,串值相同,则等同,否则不等同
都是布尔值,且值均为true/false,则等同,否则不等同
两个操作数引用同一个对象(数组、函数),则等同,否则不等同
两个操作数均为null/undefined,则等同,否则不等同
在javascript中,推荐使用等同/不等同来进行判断。这样可以避免一些难以调式的bug