JavaScript学习总结(一)
JavaScript语言特性
Javascript是一门动态的、弱类型的、基于原型的脚本语言。在Javascript中“一切皆对象”,在这一方面,它比其他的面向对象语言来得更为彻底。即使作为代码本身载体的函数(function),也是对象,数据与代码的界限在Javascript中已经相当模糊。虽然它被广泛应用在Web客户端,但是其应用范围远远未局限于此。
动态性
动态性是指:在一个javascript对象中,要为一个属性赋值,我们不必事先创建一个字段,只需要在使用的时候做赋值操作即可。
弱类型
与Java、C/C++不同,Javascript是弱类型的,它的数据类型无需再声明时指定,解释器会根据上下文对变量进行实例化。
在Javascript中,类型是和值相关联的,而不是变量和值关联。弱类型语言有很强的灵活性,在定义变量时无须显示声明。不过弱类型语言也有其不利的一方面,比如在开发面向对象的Javascript的时候,没有类型的判断往往会很麻烦,不过我们可以通过别的途径来解决此问题。
`
1 var array = [1,2,3,4,5]; 2 array.map(function(item){ 3 console.log(item*2); 4 });
运行结果为:2,4,6,8,10
数组array中有五个元素,每个元素是一个数字。数组的map方法会接收一个匿名函数,这样对于数组中的每一个元素,都会调用这个匿名函数,最后把结果放入结果数组。
基本概念
数据类型
在javascript中,包含了六种数据类型、字符串、数值、布尔值、undefined、null、及对象(object)。其中除了对象为引用类型其它为值类型,这些类型分别在内存中占有固定大小的空间,它们的值保存在栈空间中,我们可以按值访问。
(1)值类型:数值、布尔值、null、undefined。 (2)引用类型:对象、数组、函数。
如果赋值的是引用类型的值,那么要在堆内存中为这个值分配空间。由于这种值得大小不固定(对象有很多的属性),故我们通过对其引用的访问来访问它们本身,引用本身就是一个地址,即指向真实存储复杂对象的位置(引用(也就是指针)保存在栈空间中,而其真实存在于堆内存中)。
基本类型与对象之间的转换
类似于JAVA中基本数据类型的自动装箱拆箱,Javascript也有相应的动作,基本数据类型在做一些运算时,会临时包装一个对象,做完运算后,又自动释放该对象。
1 var str = 'javascript Kernal'; 2 alert(str.length);//打印17 3 alert(typeof str);//打印String 4 5 var str2=new String('javascript Kernal'); 6 alert('typeof str2);//打印Object
两次的typeof操作结果来看,这两者并不相同,那么为什么可以使用str.length来得到str的长度呢?事实上,当使用str.length时,js会自动包装一个临时的string对象,内容为str的内容,然后获取该对象的length属性,最后再释放这个临时对象。
对象转换为基本数据类型
对象转换为基本数据类型的方式:通过调用对象的valueOf()方法来得到对象的值,如果和上下文类型匹配,则使用该值。如果valueOf()取不到的话,则需要调用toString()方法,而如果上下文为数值型,则又需要将此字符串转换为数值。由于js是弱类型的,所以js引擎要根据上下文来“猜测”对象的类型,这就使得js的效率要比编译型的语言要差一些。valueOf()的优先级要高于toString().
valueOf()的作用是:将一个对象的值转换成一种合乎上下文需求的基本类型,toString()则名副其实,可以打印出对象对应的字符串。
类型的判断
js是一个弱类型的语言,但是有时候我们需要知道变量/参数在运行时的类型,就要做类型判断。
function handleMessage(message,handle){ if(typeof handle == "function"){ return handle(message); }else { throw new Error("the 2nd argument should be a function"); } }
如上例,一个函数接收的参数为函数类型的判断,若不做类型判断,js引擎就会报错。
但是,typeof不是总是有效的,比如下面这种情况:
var obj = {}; var array = ["one","two","three"]; alert(typeof obj);//Object alert(typeof array);//Object
对象obj和数组array返回的typeof值都为‘object’,这样我们就无法准确判断了,这时候通过调用instanceof来进一步判断。
alert(obj instanceof Array);//false alert(array instanceof Array);//true
变量
变量,是对值得存储空间的引用,通过一个名字将一个值关联起来,以后通过这个名字就可以引用该值。
变量的作用域
变量被定义的区域即作用域,全局变量具有全局作用域,局部变量具有局部作用域,比如在函数内部声明的变量为局部变量,在函数外部是无法访问局部变量的。