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); //undefined alert(typeof undefined); //undefined undefined = 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); //true alert(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); //true
alert(arr1 instanceof Array); //true
var arr2 = new Array();
alert(arr2 instanceof Object); //true
alert(arr2 instanceof Array); //true
var obj1 = {};
alert(obj1 instanceof Object); //true
var obj2 = new Object();
alert(obj2 instanceof Object); //true
var fun1 = function(){};
alert(fun1 instanceof Object); //true
alert(fun1 instanceof Function);//true
//原始类型
var num1 = 12;
alert(num1 instanceof Object); //false
alert(num1 instanceof Number); //false
var num2 = new Number();
alert(num2 instanceof Object); //true
alert(num2 instanceof Number); //true
var str1 = "1111";
alert(str1 instanceof Object); //false
alert(str1 instanceof String); //false
var str2 = new String();
alert(str2 instanceof Object); //true
alert(str2 instanceof String); //true
var bl1 = true;
alert(bl1 instanceof Object); //false
alert(bl1 instanceof Boolean); //false
var bl2 = new Boolean();
alert(bl2 instanceof Object); //true
alert(bl2 instanceof Boolean); //true
//特殊
var n = null;
alert(n instanceof Object); //false
var 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; //false 5 == NaN; //false NaN == NaN; //false NaN != NaN; //true false == 0; //true true == 1; //true true == 2; //false undefined == 0; //false null == 0; //false "5" == 5; //true?
var a={};
var b=a;
var c=a;
alert(c==b); //true
alert(c===b); //true
alert(c==a); //true
c={};
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));
//Number
alert(typeof(Infinity));
//number
alert(typeof(null));
//object
alert(typeof(undefined));
//undefined
alert(NaN==NaN);
//false
alert(NaN!=NaN);
//true
alert(NaN>NaN);
//false
alert(null==undefined);
//true
alert(null>=undefined);
//false
alert(null<=undefined);
//false
alert(null==null);
//true
alert(null!=null);
//false
alert(null!=NaN);
//true
alert(null==NaN);
//false
alert(NaN==undefined);
//false
alert(parseInt("123abc"));
//123
alert("123abc"-0);
//NaN
alert(Infinity>10);
//true
alert(Infinity>"abc");
//false
alert(Infinity==NaN);
//false
alert(true==1);
//true
alert(new String("abc")=="abc");
//true
alert(new String("abc")==="abc");
//false
alert(new Number("12")==12);
//true
alert(new Number("12")===12);
//false
?
alert("0"==0); //true
alert(""==0); //true
//注意:按规则2,字符串与数字相比,将字符串转换为数字。从这里可以看出用的是Number("")的方法。
//详细请看parseInt,parseFloat,Number的区别
alert("0"==""); //false
alert(false=="false"); //false
alert("0"==false); //true
alert("\t\r\n"==0); //true
?
alert(!undefined); //true alert(!null); //true alert(!""); //true alert(!0); //true alert(!NaN) //true alert(!Infinity); //false?
?
alert(undefined == null) //true
alert(""==undefined); //false
alert(""==false) //true
alert(0==false) //true
//引用规则:在检查相等性时,不能把 null 和 undefined 转换成其他值。只是在判断的时候作假值
alert(undefined==false) //false
alert(null==false) //false
alert(undefined==true) //false
alert(null==true) //false
alert(NaN !== NaN) //true