jQuery片段:
- var
-
- window =this,
-
- undefined,
-
- _jQuery = window.jQuery,
-
- _$ = window.$,
-
- jQuery = window.jQuery = window.$ =function( selector, context ) {
-
- returnnewjQuery.fn.init( selector, context );
- },
-
-
-
- quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,
-
- isSimple = /^.[^:#\[\.,]*$/;
在这一节,我们将讨论同一段jQuery片段的另一个知识点:数据类型和对象。为了让我们更好地理解代码,我们必须对这一部分内容深入了解。没有牢固的基础,是不可能构筑起坚实的堡垒的。
- 内置数据类型
内置数据类型,也称作固有数据类型,也就是JS的基本的数据类型。首先,让我们的大脑热一下身:回想一下,我们所有编程语言中实际可能运用到的数据都有些什么?
基本如你所想,但实质上我们需要的只是有意义的文字而已。但对于电脑来说,它能认识的不是文字,而是逻辑电路中电平的高低。为此,我们在程序语言中,将这些高低电平转换成0和1,并使用这些二进制的数字串构造成人类更加好理解的数字逻辑。这些数字逻辑实际上就是所谓的数据类型了。(我承认我在胡说八道……)
现在让我们看看JS是怎么理解这些数字逻辑,来让我们更好地使用它的(至少JS的设计者初衷是这样)。
- undefined
我们第一个看到的数据类型是undefined。或许很多人都会怀疑到——你没有搞错吧?undefined也是一种数据类型?!然后,我可以很镇定的告诉你,我没搞错……
- alert(undefined);
- alert(typeofundefined);
- alert(undefinedinstanceofObject);
- alert(undefinedinstanceofundefined);
- alert(undefinedinstanceofUndefined);
看到上面的例子后,你还有疑问吗?
联系一下我们前面所说的内容,如果调用一个没有声明的变量被直接调用,应该是会报错的,但上例没有,这就证明了undefined是JS里固有的变量。而且,根据typeof的结果,这个变量的数据类型是undefined。但它不是一个Object。而且不能用instanceof来判断他是不是undefined实例。
那么,让我们来小结一下:undefined是一种类似单态的数据类型,他在全局作用域中以变量标识undefined存在,并且拥有唯一值undefined。
除了上面所说的以外,还有一些需要注意的地方,请看下例:
-
- alert(typeofx =="undefined");
- alert(x==undefined);
所以,如果你需要判断一个变量是否已声明,请使用typeof运算符,再和"undefined"这个字符串比较。如果你看得仔细,你或许会产生一个疑问:在上一节中不是说,如果在作用域链中找不到变量标识的时候,不是会创建空值标识吗?如果你有此一问,那么我得赞你一下,你真的用心思考了!这个问题将在稍后解答。
- varx;
- alert(undefined =="undefined");
- alert(x==undefined);
- alert(x=="undefined");
另外,别以为undefined和字符串"undefined"是相等的,undefined不是字符串,而是另一种数据类型。
- null
相信看完undefined后,你已经不再怀疑null也是一种数据类型了吧。可是null又有何特别呢?请看:
- alert(null);
- alert(typeofnull);
- alert(nullinstanceofObject);
- alert(nullinstanceofnull);
你有感到奇怪了么?奇怪在哪里呢?嗯。我也觉得奇怪:为啥typeof的运算结果会是“object”,但instanceof判断又为false呢?但对于这个问题,能找到的唯一解答是如此描述的:
“这点潜在的混淆是为了向下兼容。”
但怎么向下兼容,我已经不能考究也不想考究下去了。我能告诉大家的是typeof null的返回值“object”是ECMA-262中规定的内容。并且这规定只是为了兼容性,实际上null并不是一个Object的实例。
至此,我们再小结一下:null和undefined很相似,只是我们从根本上还是属于两种不同的数据类型。但是他们真的“不同”吗?让我们再来看看下面的例子:
- alert(null==undefined);
- alert(null===undefined);
那么,看来JS解释器一般认为null和undefined是相等的了,虽然在严格等于运算时结果是false。(据说这是为了兼容以往的浏览器中没有undefined而设的。)
由此引起了我们另一个思考:他们到底有何异同呢?实际上,导致他们严格等于运算返回false的是typeof的运算——在运算符节再详细解释吧。但他们其实还有一个语言规范层级的区别:undefined是作为Global对象的属性存在的,而null则是ECMA规范中设定的一个字面值。换句话说,undefined是存放在Global中的属性(所以像单态),而null是解释执行时产生的值。然而对他们的值作强制转换还是相同的,如:
- alert(!undefined);
- alert(!!undefined);
- alert(!null);
- alert(!!null);
-
- alert(parseInt(undefined));
- alert(parseInt(null));
-
还值得注意的是,和其他语言不同,他们和0值是不相等的,除非转换成布尔值:
- alert(undefined==0);
- alert(null==0);
- alert(!undefined==!0);
- alert(!null==!0);
另外,它们都不带属性的:
- alert(null.a);
- alert(undefined.a);
最后,提一点我在项目中经常看到的,某些程序员喜欢将一些控件的属性是否定义的判定交给字符串"undefined"和null,但实际上只有null在起作用呢。
- boolean
下一个我们看到的类型是boolean,也就是我们常用来判断真假的布尔型。它的值只有两个:true和false。让我们来看看它的特点:
- varx=true;
- alert(x);
- alert(typeofx);
- alert(!x==0);
- alert(x==1);
- alert(x==2);
- alert(parseInt(x));<span class="comment" style="border-top-s
>> 留言评论