浏览 6197 次
锁定老帖子 主题:jQuery学习之JavaScript变量
精华帖 (0) :: 良好帖 (0) :: 新手帖 (9) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-11-15
最后修改:2009-11-15
这就给我们实际的工作带来很多麻烦。要用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 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间: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属性就可以解决这个问题。 |
|
返回顶楼 | |
发表时间:2009-11-17
这个我倒是很少用constructor,以后我试试看看
|
|
返回顶楼 | |
发表时间:2009-11-23
typeof 是有些问题,不能准确的得到type of。。这个已经被有人归类为js的糟粕部分。
|
|
返回顶楼 | |
发表时间:2009-11-24
typeof是有问题,即使是typeof Null,结果却是object.不过使用constructor能支持多态吗?
一般而言,我都使用instanceof. |
|
返回顶楼 | |