论坛首页 Web前端技术论坛

jQuery学习之JavaScript变量

浏览 6190 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (9) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-11-15   最后修改:2009-11-15
平时工作中知道,要会用一门技术很简单,Google一下,然后再Copy+Paste,再修改一下就好了。可是往往我们是知其然不知其所以然。当真正碰到客户提一两个问题的时候,就会呆在那里,不知道从哪里下手,问其原因,得到的回答是:当初看到网上是这样的,不知道怎么修改。

这就给我们实际的工作带来很多麻烦。要用jQuery,就要看jQuery的源码,不能说全部看懂,但是大体的一些结构和用法要熟,这样才能以不变应万变。另外我相信jQuery之所以一出来就受到很多从业人员的喜欢,一定有它的道理,从里面的细节可以看到大师们是怎么用JavaScript的,会让我们 受益匪浅,会是你成长的催化剂。

看到jQuery的源码,会发现和其它的extjs,dojo等框架一样,用到了很多我们平时用不到的JavaScript的特性。因为平时很多属性都没有用到过。下面就还是一样从最基本的开始,虽说是基础,但是很重要。

一,JavaScript变量的认识
    1. 和JVM内部有分堆和栈一样,不同的区域来存放的东西不一样。JavaScript解释器里也是一样。在 JavaScript 中,变量可以存放两种类型的值,即原始值和引用值。
        (1)原始值是存储在栈(stack)中的简单数据段,也就是说,它们的值直接存储在变量访问的位置。
        (2)引用值是存储在堆(heap)中的 对象,也就是说,存储在变量处的值是一个指针,指向存储对象的内存处。
    2.原始值有:Undefined,Null,Boolean,String,Number五种类型。因为这五种类型,占用内存多大的空间是固定的,而且占用空间相对软小,所以会选择存放在stack中。在栈中除天存放以上五种原始值类型,还要存放一个值 ,就是引用值的地址(也是假如一个Function,Object等,他们本身是对象,是存放在heap中的,但是解释器要去引用这些对象的时候是通过地址去引用)这些程序里面的存对象的地址这种类型,长度大小也是固定的。所以存放在在heap中对象的地址也是存放在stack中的。
比如Date类型就是存放在heap中,请看下面的例子:
<html>
<head>
<script type="text/javascript">
function seeResult(){
   var day1=new Date();
   alert('First: day1='+DateDemo(day1)+',ms='+day1.getTime());
   var day2=day1;
   day2.setMilliseconds(day2.getMilliseconds()+1);
   alert('Second: day1='+DateDemo(day1)+',ms='+day1.getTime());
}
function DateDemo(d){
   var s = "";   
   s += (d.getMonth() + 1) + "/"; 
   s += d.getDate() + "/"; 
   s += d.getFullYear(); 
   return(s); 
}
</script>
</head>
<body>
<h1 id="myHeader" onclick="seeResult()">点击我,查看结果</h1>
</body>
</html>

stack中的两个地址day1和day2都指向heap中的同一个Date对象,所以在day2对应的Date上加一个毫秒,输出day1的两次毫秒数会不一样。
我以前刚写JavaScript的时候犯过这样的错误,@@!


二,五种原始值
上面有提到JavaScript中原始值有五种,分别是Undefined,Null,Boolean,Number,String,那么JS解释器是用什么来判断的呢。或者说我们如何来判断呢!
先看一个运算符typeof
typeof运算符需要一个参数,这个参数就是你要让typeof检查的变量:
比如:
var name="bevis";
var age = 29;
alert(typeof name);
alert(typeof age);

上面这段代码输出的结果分别是string,number
下面结一个对照关系:
typeof运算的结果        输入的变量
------------------------------------------
undefined               Undefined类型变量
boolean                 Boolean类型变量
number                  Number类型变量
string                  String类型变量
object                  引用类型变量或Null类型

运好typeof对我们程序会带来很多方便!

2.Undefined类型
Undefined类型只有一个值undefined,当声明一个变量的时候,没有对变量赋值的时候,这个变量就会被赋值undefined值。
通过下面语句可以证明:
var name;
alert(typeof name);//输出为undefined
alert(name==undefined);//输出为true


还有一种情况需要注意:
var name;
alert(typeof name);//输出为undefined
alert(typeof myname);//输出为undefined
alert(name=="undefined");//输出为false
alert(name==undefined);//输出为true

对以上代码得出如下结论:
      (1)name变量定义了没有赋值,所以用typeof输出结果为undefined,可是myname前面没有定义过,输出结果也为undefined。所以输出结果为undefined时,这个变量有可能是没有定义过,也可能是定义过了没有赋值。
而且要特别注意的时,因为没有定义过的变量过用typeof是可以的,而且也可以输出值,但是如果对mynqme进行如下运用alert(myname==undefined);时就会出错,因为变量要先用声明再使用。
      (2)undefined和字符串"undefined"不相等,undefined不是字符串,而是一种数据类型。


3.Null类型
Null类型,它也只有一个值null
null表示尚不存在的对象
alert(typeof null);//输出为"object"
alert(null==undefined);//输出为true,因为undefined派生于null


其实对于JavaScript最迷惑的两个就是Null和Undefined类型。

再补充一点,
前面用typeof进行比较时,如果原始类弄的话,调用typeof是输出相应的类型,如果对引用类型用typeof的话,总是输出object
如果要判断对象是不是哪种类型的对象,就要用instanceof
var name="bevis";
alert(typeof name);//输出为string
alert(name instanceof String);//输出为false
name= new String("bevis");
alert(typeof name);//输出为string object
alert(name instanceof String);//输出为true

   发表时间:2009-11-17   最后修改:2009-11-17
对于对象类型的判断我倾向于用对象的constructor属性,因为这样能更准确,下面看的小例子:
   var name="张三";
		function User(name,age){
			this.name=name;
			this.age=age;
		}
		var myUser=new User("李四",18);
		//下面四个输出都是true
		//下面是typeof示例
		alert(typeof name==="string");//是字符串string
		alert(typeof myUser==="object");//是字符串object
		//下面是constructor示例
		alert(name.constructor===String);//是类String
		alert(myUser.constructor===User);//是自定义类User


使用constructor属性的好处是能准确的判断变量是哪个类的示例,这对于自定义类最有用,因为用typeof判断自定义类的实例(就是那个myUser)返回的永远都是object,这样我们就不好区分到底是哪个类的实例了,采用constructor属性就可以解决这个问题。
0 请登录后投票
   发表时间:2009-11-17  
这个我倒是很少用constructor,以后我试试看看
0 请登录后投票
   发表时间:2009-11-23  
typeof 是有些问题,不能准确的得到type of。。这个已经被有人归类为js的糟粕部分。
0 请登录后投票
   发表时间:2009-11-24  
typeof是有问题,即使是typeof Null,结果却是object.不过使用constructor能支持多态吗?

一般而言,我都使用instanceof.
0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics