JavaScript内核之基本概念(1)


本章主要讲述JavaScript中的数据类型(基本类型与引用类型),变量(包括变量的作用域),操作符(主要是一些较为常见,但是不容易从字面上理解的操作符)。由于JavaScript中的“一切皆对象”,在掌握了这些基本的概念之后,读者就可以较为轻松的理解诸如作用域,调用对象,闭包,currying等等较难理解的概念了。


数据类型


有程序设计经验的读者肯定知道,在C或者Java这样的语言中,数据是有类型的,比如用以表示用户名的属性是字符串,而一个雇员的年龄则是一个数字,表示UI上的一个开关按钮的数据模型则为布尔值等等,对数字可能还可以细分为浮点数,整型数,整型数又可能分为长整型和短整型,总而言之,它们都表示语言中的数据的值的类型。


JavaScript中的数据类型分为两种:基本数据类型和对象类型,其中对象类型包含对象,数组,以及函数(事实上,函数,数组等也都是对象,这个在后边的章节详述)。


1.1.1 基本数据类型


在JavaScript中,包含三种基本的数据类型,字符串(String),数值(Number),布尔值(boolean),下面是一些简单的例子:


  1. <strong>var str = "Hello, world";//字符串  
  2. var i = 10;//整型数  
  3. var f = 2.3;//浮点数  
  4.    
  5. var b = true;//布尔值</strong> 

我们可以分别查看变量的值及变量的类型:


  1. print(str);  
  2. print(i);  
  3. print(f);  
  4. print(b);  
  5.    
  6. print(typeof str);  
  7. print(typeof i);  
  8. print(typeof f);  
  9. print(typeof b); 

注意,在此处使用的print()函数为rhino解释器的顶层对象的方法,可以用来打印字符串,通常情况下,在客户端,程序员多使用alert()进行类似的动作,alert()是浏览器中JavaScript解释器的顶层对象(window)的一个方法。


  1. Hello, world  
  2. 10  
  3. 2.3  
  4. true 
  5.    
  6. string  
  7. number  
  8. number  
  9. Boolean 

在JavaScript中,所有的数字,不论是整型浮点,都属于“数字”基本类型。typeof是一个一元的操作符,在本章的另外一个小节会专门讲到。


1.1.2 对象类型


这里提到的对象不是对象本身,而是指一种类型,我们在第三章会对对象进行详细的讨论,此处的对象包括,对象(属性的集合,即键值的散列表),数组(有序的列表),函数(包含可执行的代码)。


对象类型是一种复合的数据类型,其基本元素由基本数据类型组成,当然不限于基本类型,比如对象类型中的值可以是其他的对象类型实例,我们通过例子来说明:


  1. <strong>var str = "Hello, world";  
  2. var obj = new Object();  
  3. obj.str = str;  
  4. obj.num = 2.3;  
  5.    
  6. var array = new Array("foo""bar""zoo");  
  7.    
  8. var func = function(){  
  9.     print("I am a function here");  
  10. }</strong> 

可以看到,对象具有属性,如obj.str, obj.num,这些属性的值可以是基本类型,事实上还可以更复杂,我们来看看他们的类型:


  1. print(typeof obj);  
  2. print(typeof array);  
  3. print(typeof func);  
  4.    
  5. //将打印出  
  6. object  
  7. object  
  8. function 

读者可能会对print(typeof array)打印出object感到奇怪,事实上,对象和数组的界限并不那么明显(事实上它们是属于同一类型的),但是他们的行为却非常不同,本书的后续章节将两个重要的数据类型做了分别介绍。


2.1.3 两者之间的转换


类似与Java中基本数据类型的自动装箱拆箱,JavaScript也有类似的动作,基本数据类型在做一些运算时,会临时包装一个对象,做完运算后,又自动释放该对象。我们可以通过几个例子来说明:


  1. <strong>var str = "JavaScript Kernal";  
  2. print(str.length);//打印17</strong> 

str为一个字符串,通过typeof运算符可知其type为”string”,而:


  1. <strong>var str2 = new String("JavaScript Kernal");  
  2. print(typeof str2);</strong> 

可知,str2的type为”object”,即这两者并不相同,那么为什么可以使用str.length来的到str的长度呢?事实上,当使用str.length时,JavaScript会自动包装一个临时的String对象,内容为str的内容,然后获取该对象的length属性,最后,这个临时的对象将被释放。


而将对象转换为基本类型则是通过这样的方式:通过调用对象的valueOf()方法来取得对象的值,如果和上下文的类型匹配,则使用该值。如果valueOf取不到值的话,则需要调用对象的toString()方法,而如果上下文为数值型,则又需要将此字符串转换为数值。由于JavaScript是弱类型的,所以JavaScript引擎需要根据上下文来“猜测”对象的类型,这就使得JavaScript的效率比编译型的语言要差一些。


valueOf()的作用是,将一个对象的值转换成一种合乎上下文需求的基本类型,toString()则名副其实,可以打印出对象对应的字符串,当然前提是你已经“重载”了Object的toString()方法。


事实上,这种转换规则会导致很多的问题,比如,所有的非空对象,在布尔值环境下,都会被转成true,比如:


  1. <strong>function convertTest(){  
  2. if(new Boolean(false) && new Object() &&  
  3.  new String("") && new Array()){  
  4.        print("convert to boolean")  
  5.     }    
  6. }  
  7.    
  8. convertTest();//convert to Boolean</strong> 

初学者容易被JavaScript中的类型转换规则搞晕掉,很多情况下会觉得那种写法看着非常别扭,其实只需要掌握了规则,这些古怪的写法会大大的提高代码的性能,我们通过例子来学习这些规则:


  1. <strong>var x = 3;  
  2. var y = x + "2";// => 32  
  3. var z = x + 2;// => 5  
  4.    
  5. print(y);  
  6. print(z);</strong> 

通常可以在JS代码中发现这样的代码:


  1. <strong>if(datamodel.item){  
  2.     //do something...  
  3. }else{  
  4.     datamodel.item = new Item();  
  5. }</strong> 

这种写法事实上具有更深层次的含义:


应该注意到,datamodel.item是一个对象(字符串,数字等),而if需要一个boolean型的表达式,所以这里进行了类型转换。在JavaScript中,如果上下文需要boolean型的值,则引擎会自动将对象转换为boolean类型。转换规则为,如果该对象非空,则转换为true,否则为false.因此我们可以采取这种简写的形式。


而在传统的编程语言(强类型)中,我们则需要:


  1. <strong>if(datamodel.item != null){  
  2.     //do something...  
  3. }else{  
  4.     datamodel.item = new Item();  
  5. }</strong> 




标签:
Warning: Invalid argument supplied for foreach() in C:\zl\webjia\view.php on line 50

友情链接
轻松育儿世界奇观
苏ICP备16066217号-2