首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > Web前端 >

ECMAScript 等性运算符 跟原始类型

2012-10-08 
ECMAScript 等性运算符 和原始类型1.关于类型ECMAScript分为原始类型和引用类型。5种原始类型:undefined nu

ECMAScript 等性运算符 和原始类型

1.关于类型

ECMAScript分为原始类型引用类型

5种原始类型:undefined null boolean number string,其余的都是引用类型。

?

undefined 类型只有一个值:undefined

值 undefined 并不同于未定义的值。但是,typeof 运算符并不真正区分这两种值。

那些定义了但是没有赋值的变量同样是undefined。

?

null 类型只有一个值:null

值 undefined 实际上是从值 null 派生来的,因此 ECMAScript 把它们定义为相等的。

尽管这两个值相等,但它们的含义不同。undefined 是声明了变量但未对其初始化时赋予该变量的值,null 则用于表示尚未存在的对象(在讨论 typeof 运算符时,简单地介绍过这一点)。如果函数或方法要返回的是对象,那么找不到该对象时,返回的通常是 null。

?

- 注意 -

null是JS的关键字,无法用来作为变量的名字,而undefined既不是关键字也不是保留字,是可以用作变量名的。

其实目前大多数浏览器都会有一个叫undefined的全局变量,这个变量的值是undefined,类型也是undefined。很奇妙,不是吗?也可以说,是window的一个属性:window.undefined。

?

注意,一些老的浏览器是没有undefined全局变量的,可以手动讲undefined变量设为undefined值。

?

window.undefined = window.undefined;

?

在Jquery中,是在函数作用域中申明的undefined变量

?

(function($, undefined){   js code...})(jQuery); 
?

undefined 属性用于存放 JavaScript 的 undefined 值。

无法使用 for/in 循环来枚举 undefined 属性,也不能用 delete 运算符来删除它。

undefined 不是常量,可以把它设置为其他值。

当尝试读取不存在的对象属性时也会返回 undefined。

?

alert(undefined); //undefinedalert(typeof undefined); //undefinedundefined = 1;alert(undefined); //undefined
?

?

typeof:


需要注意的是,对变量或值调用 typeof 运算符将返回下列值之一:

undefined - 如果变量是 Undefined 类型的boolean - 如果变量是 Boolean 类型的number - 如果变量是 Number 类型的string - 如果变量是 String 类型的object - 如果变量是一种引用类型或 Null 类型的

- 注意 -

    为什么 typeof 运算符对于 null 值会返回object ?这实际上是 JavaScript 最初实现中的一个错误,然后被 ECMAScript 沿用了。现在,null 被认为是对象的占位符,从而解释了这一矛盾,但从技术上来说,它仍然是原始值。值 undefined 实际上是从值 null 派生来的,因此 ECMAScript 把它们定义为相等的。
alert(typeof null);//object
?
alert(undefined == null);        //truealert(undefined === null);//false

?

instanceof:

?

对于各种类型的定义有两种方法,比如:

var istrue = new Boolean();

var istrue = false;

对于原始类型来说,不同方法定义的变量,用instanceof得到的值是不同的。

?

而对于引用类型来说,比如:

var arr = [];

var arr = new Array();

用instanceof得到的值是相同的。这很好理解。

?

以下是一些例子:

var arr1 = [];alert(arr1 instanceof Object);//truealert(arr1 instanceof Array);//truevar arr2 = new Array();alert(arr2 instanceof Object);//truealert(arr2 instanceof Array);//truevar obj1 = {};alert(obj1 instanceof Object);//truevar obj2 = new Object();alert(obj2 instanceof Object);//truevar fun1 = function(){};alert(fun1 instanceof Object);//truealert(fun1 instanceof Function);//true//原始类型var num1 = 12;alert(num1 instanceof Object);//falsealert(num1 instanceof Number);//falsevar num2 = new Number();alert(num2 instanceof Object);//truealert(num2 instanceof Number);//truevar str1 = "1111";alert(str1 instanceof Object);//falsealert(str1 instanceof String);//falsevarstr2 = new String();alert(str2 instanceof Object);//truealert(str2 instanceof String);//truevar bl1 = true;alert(bl1 instanceof Object);//falsealert(bl1 instanceof Boolean);//falsevar bl2 = new Boolean();alert(bl2 instanceof Object);//truealert(bl2 instanceof Boolean);//true//特殊var n = null;alert(n instanceof Object);//falsevar u = undefined;alert(u instanceof Object);//false
?

?

2.类型的比较

?

等号和非等号

?

在 ECMAScript 中,等号由双等号(==)表示,当且仅当两个运算数相等时,它返回 true。非等号由感叹号加等号(!=)表示,当且仅当两个运算数不相等时,它返回 true。为确定两个运算数是否相等,这两个运算符都会进行类型转换。

执行类型转换的规则如下:

如果一个运算数是 Boolean 值,在检查相等性之前,把它转换成数字值。false 转换成 0,true 为 1。如果一个运算数是字符串,另一个是数字,在检查相等性之前,要尝试把字符串转换成数字。如果一个运算数是对象,另一个是字符串,在检查相等性之前,要尝试把对象转换成字符串。如果一个运算数是对象,另一个是数字,在检查相等性之前,要尝试把对象转换成数字。

在比较时,该运算符还遵守下列规则:

值 null 和 undefined 相等。在检查相等性时,不能把 null 和 undefined 转换成其他值。如果某个运算数是 NaN,等号将返回 false,非等号将返回 true。如果两个运算数都是对象,那么比较的是它们的引用值。如果两个运算数指向同一对象,那么等号返回 true,否则两个运算数不等。

注意:

NaN不等于任何东西!像NaN>NaN这样的也是false,同样的还有undefinded >= null 也是 false

?

null == undefined; //true"NaN" == NaN; //false5 == NaN; //falseNaN == NaN; //falseNaN != NaN; //truefalse == 0;//truetrue == 1; //truetrue == 2; //falseundefined == 0; //falsenull == 0; //false"5" == 5; //true
?
var a={};var b=a;var c=a;alert(c==b);//truealert(c===b);//truealert(c==a);//truec={};alert(c==b);//false

?

全等号和非全等号

?

等号和非等号的同类运算符是全等号和非全等号。这两个运算符所做的与等号和非等号相同,只是它们在检查相等性前,不执行类型转换。

全等号由三个等号表示(===),只有在无需类型转换运算数就相等的情况下,才返回 true。

?

var sNum = "66";var iNum = 66;alert(sNum == iNum);//输出 "true"alert(sNum === iNum);//输出 "false"

?

3.关于假值

0 (Number)NaN (Number)null (Object)undefined (Undefined)"" (String)false (Boolean)

以上值在判断的时候都会转换为flase.但他们之间并没等于关系。


4.一些补充

alert(typeof(NaN));    //Numberalert(typeof(Infinity));    //numberalert(typeof(null));     //objectalert(typeof(undefined));     //undefinedalert(NaN==NaN);     //falsealert(NaN!=NaN);     //truealert(NaN>NaN);      //falsealert(null==undefined);      //truealert(null>=undefined);      //falsealert(null<=undefined);      //falsealert(null==null);    //truealert(null!=null);     //falsealert(null!=NaN);     //truealert(null==NaN);    //falsealert(NaN==undefined);     //falsealert(parseInt("123abc"));    //123alert("123abc"-0);     //NaNalert(Infinity>10);     //truealert(Infinity>"abc");     //falsealert(Infinity==NaN);    //falsealert(true==1);     //truealert(new String("abc")=="abc");     //truealert(new String("abc")==="abc");     //falsealert(new Number("12")==12);     //truealert(new Number("12")===12);     //false
?
alert("0"==0);//truealert(""==0);//true//注意:按规则2,字符串与数字相比,将字符串转换为数字。从这里可以看出用的是Number("")的方法。//详细请看parseInt,parseFloat,Number的区别alert("0"=="");//falsealert(false=="false");//falsealert("0"==false);//truealert("\t\r\n"==0);//true
?
alert(!undefined);//truealert(!null);//truealert(!"");//truealert(!0); //truealert(!NaN)//truealert(!Infinity);//false
?

?

alert(undefined == null) //truealert(""==undefined);//falsealert(""==false)//truealert(0==false)//true//引用规则:在检查相等性时,不能把 null 和 undefined 转换成其他值。只是在判断的时候作假值alert(undefined==false)//falsealert(null==false)//falsealert(undefined==true)//falsealert(null==true)//falsealert(NaN !== NaN)//true

热点排行