Javascript中的false,零值,null,undefined和空字符串对象(与运。。。Javascript 中 false,零值,null,undefined和空字符串对象
类型检测
<script type="text/javascript">
alert(typeof(false)==='boolean');//true
alert(typeof(0)==='number');//true
alert(typeof("")==='string');//true
alert(typeof(null)==='object');//true
alert(typeof undefined==='undefined');//true
</script>
运⾏代码,弹出的对话框都是true。
也就是说,
false是布尔类型对象,
0是数字类型对象,
空字符串是字符串类型对象,
null是object对象,
undefined类型还是undefined。
互等性
当⽤ == 操作符将 false 对象和其他对象进⾏⽐较的时候,只有0和空字符串等于false;undefined和null对象并不等于false对象,⽽null 和undefined是相等的
<scripttype="text/javascript">
alert(false==undefined);//false
alert(false==null);//false
alert(false==0);//true
alert(false=="");//true
alert(null==undefined);//true
</script>
我们可以把
0、空字符串和false归为⼀类,称为"假值";
null 和 undefined 归为⼀类,称为"空值"。
假值 还算⼀个有效的对象,因此可以对其使⽤ toString 等类型相关的⽅法,⽽空值则不⾏。下⾯的代码将会抛出异常:
<scripttype="text/javascript">
String());// "false"
alert("".charAt(0));// ""
alert((0).toExponential(10));// 0.0000000e+0
String());
// throw exception "undefined has no properties"
String());
// "null has no properties"
</script>
字符串表⽰
虽然空值不能调⽤ toString ⽅法,但是却可以使⽤ String 构造函数进⾏构造。
像decodeURI这样的函数,如果传⼊的是undefined或者null,返回的是"undefined"和"null"字符串 。
<script type="text/javascript">
alert(String(false));// "false"
alert(String(""));// ""
alert(String(0));// 0.0000000e+0
alert(String(undefined));// "undefined"
alert(String(null));// "null"
alert(decodeURI(undefined));// "undefined"
alert(decodeURI(null));// "null"
</script>
假值和空值作为if条件分⽀
假值和空值有⼀个共性,那就是在 作为 if 的条件分⽀时,均被视为 false ;应⽤ " ! " 操作之后得到的均为true 。如下⽰例代码:
<scripttype="text/javascript">
var ar =[undefined,false,0,"",null];
for(var i =0,len = ar.length; i < len; i++){
if(ar[i]){
alert("你不应该看到此对话框!");//都是false不会弹出
}
}
</script>
这是因为,这⼏个对象均被视为各⾃类型中的⽆效值或空值。因此if分⽀中这些对象均被视为false对待。
js中的 || 与 && 运算符详解
js中逻辑运算符主要有三种:逻辑与 &&、逻辑或 || 和 逻辑⾮!。
当 && 和 || 连接语句时,两边的语句会转化为布尔类型(Boolean),然后再进⾏运算,具体的运算规则如下:
1.&&
1.1 两边条件都为true时,结果才为true;
1.2 如果有⼀个为false,结果就为false;
1.3 当第⼀个条件为false时,就不再判断后⾯的条件
注意:当数值参与逻辑与运算时,结果为true,那么会返回的会是第⼆个为真的值;如果结果为false,返回的会是第⼀个为假的值。console.log(5&&4);//当结果为真时,返回第⼆个为真的值4
console.log(0&&4);//当结果为假时,返回第⼀个为假的值0
<
typeof的用法2.1 只要有⼀个条件为true时,结果就为true;
2.2 当两个条件都为false时,结果才为false;
2.3 当⼀个条件为true时,后⾯的条件不再判断
注意:当数值参与逻辑或运算时,结果为true,会返回第⼀个为真的值;如果结果为false,会返回第⼆个为假的值;
console.log(5||4);//当结果为真时,返回第⼀个为真的值5
console.log(0||0);//当结果为假时,返回第⼆个为假的值0
3.!
3.1 当条件为false时,结果为true;反之亦然。
补充:逻辑与 的优先级是⾼于 逻辑或 的;
⽐如:console.log(3||2&&5||0),会先算2&&5的值为5,然后再3||5----3,最后再3||0----3,所以最终结果为3.
var arr =new Array();
// 或
var arr =[];
//初始化后,即使数组arr中没有元素,也是⼀个object。
typeof arr;// "object"
//既然是object,⽤于判断条件时就会被转化为true
if(arr){
console.log("it's true");// it's true
}
//但是,如果将arr与布尔值⽐较
arr ==false;// true
arr ==true;// false
//⽽如果把arr转化为Boolean,的确是true:
Boolean(arr);// true
注意:任意值与布尔值⽐较,都会将两边的值转化为Number
如arr与false⽐较,false转化为0,⽽arr为空数组,也转化为0:
Number(false)// 0
Number(arr)// 0
所以,当空数组作为判断条件时,相当于true。当空数组与布尔值直接⽐较时,相当于false。
也就出现了以下令⼈绕圈的现象:
[]==![];// true
补充:为什么 [ ]= =[ ]为false,[ ]==![ ]为true
[ ] == [ ] 为 false
在JS中,数组是属于引⽤型数据类型,所以 == 左右两边所表⽰的实际只是数组的所在的地址⽽已。
在创建⼀个新数组时,其地址均不相同,因此 [ ] = = [ ] 最终返回false。
[ ] == ![ ] 为 true
当我们使⽤ “==” 来对数据进⾏⽐较时,若两个数据类型不⼀致,JS会先按照⼀定规则将数据转换为同
⼀数据类型后再进⾏⽐较。⼀:若其中⼀个数据类型为数值,那么另⼀个数据类型会先转换成数值然后再与之⽐较
console.log(""==1);// false
console.log(""==0);// true
console.log("hello"==1);// false "hello"转换为数字是NaN
console.log("000"==0);// true
console.log("666"==666);// true
//true被转换为1,false被转换为0
console.log(true==1);// true
console.log(true==2);// false
console.log(false==0);// true
//数组会先通过调⽤toString()转换为字符串后再转换为数值,
//⽐如[true]转换为字符串后为"true",
//然后再转换为数值是NaN,所以[true]==1返回false。
console.log([]==0);// true
console.log([1]==1);// true
console.log(["1"]==1);// true
console.log([1,2]==1);// false
console.log([true]==1);// false
事实上,数组、对象和函数 在与其他基本数据类型进⾏⽐较时都会先转换为字符串,然后再转换为相应的数据类型(这⾥指的数据类型也可能需要转换,总之最后⽐较时⼀定是同⼀数据类型)进⾏⽐较,在此就不再⼀⼀举例了。
null、undefined和NaN 这三个是个特例,他们⽐较特殊:
a) null == undefined 为 true;
b) null 和 undefined 不会进⾏数据转换;
c) NaN 不与任何值相等,甚⾄包括它⾃⼰!
⼆:若其中⼀个数据类型为布尔值,则会先将其转换成数值再进⾏⽐较
console.log(true=="001");// true
console.log(true==[]);// false
console.log(true==["true"]);// false
console.log(true==[true]);// false
console.log(true==[1]);// true
我们可以看到,==左侧均为true,⽽右侧均不是布尔值类型,所以不管三七⼆⼗⼀,先将true转换成数值1,然后再根据上⾯ 1 中所讲与数值类型⽐较的转换规则,将右侧值统统进⾏数据类型转换,转换后如下所⽰:
console.log(1==1);// true
console.log(1==0);// false
console.log(1==NaN);// false
console.log(1==NaN);// false
console.log(1==1);// true
三: “!” 为逻辑⾮,在操作⾮布尔值类型的数据时,会将该数据类型先转换为布尔值后再取反
console.log(!"");// true
console.log(!"false");// false
console.log(!2);// false
console.log(![]);// false
console.log(!["false"]);// false
console.log(!NaN);// true
关于其他数据类型转布尔值,以下均返回true
① ⾮空字符串
② ⾮零数值
③ 数组
④ 对象
⑤ 函数
理解了以上数据类型转换规则之后在来理解[ ] = = ! [ ] 的问题就很简单了:
① 将==右侧数组转换为布尔值后再取反,转换后相当于[ ] = =false
② 根据“⽐较前布尔值转数值”规则,转换后相当于[ ] = = 0
③ 根据“⽐较前数组遇数值先转字符串后转数值”规则,转换后相当于0= =0
总结:
① 相等操作符,不同数据类型会根据⼀定规则转换为同⼀数据类型再⽐较
② 数组与数组⽐较,⽐较的是其引⽤
③ 不同类型⽐较,遇数值则转数值,布尔值⾃⾝转数值
④ ⾮空⾮零引⽤型,转为布尔均为真
如何避免数组与布尔值⽐较时出现的坑呢?可以先把数组转化为布尔值:
Boolean(arr)==true;// true
总结:
逻辑或 || 在前⾯有⼀个ture的时候则不看后⾯直接停⽌,
逻辑与&&同理,在前⾯有⼀个 false 的时候则不看后⾯直接停⽌。
然后计算赋值,获取最新的⼀次计算结果值。
b =(1+1,2+2,3+3)//b=6;获取最新值
null和undefined的区别
这两个空值的区别也是容易混淆的。
undefined 和 null 对象⽆⾮是两个特殊对象,undefined表⽰⽆效对象,null表⽰空对象。
如果变量显式或者隐式(由Javascript引擎进⾏赋值)地被赋予了undefined,那么代表了此变量未被定义,如果被赋予null值,则代表此变量被初始化为空值。
在Javascript中,变量是通过var声明,= 赋值符进⾏定义(初始化变量所指向的对象)。
当然,如果声明⼀个全局变量(作为window属性)可以不使⽤ var 关键字。变量可以在声明的同时进⾏定义。
<scripttype="text/javascript">
var undefinedVariable,nullVariable =null;
alert(undefinedVariable);// "undefined"
alert(window.undefinedVariable);// "undefined"
alert(window.abcd);// "undefined"
alert(nullVariable);// "null"
alert(abcd);// throw exception "abcd is not defined"
</script>
其实, 变量如果声明了但是没有初始化,那么Javascript引擎会将此变量⾃动指向 undefined 对象。
这⾥需要注意,我们在上⾯引⽤ window.abcd 时,弹出的是undefined;⽽直接引⽤abcd变量时,却抛出了⼀个异常。这是由于Javascript引擎对于没有显式指定对象链的变量,会尝试从最近的作⽤域开始查变量,查失败,则退到⽗级作⽤链进⾏查。如果均查失败,则抛出"变量未定义"的异常。
这两个值在进⾏数字运算的时候也有不同。
<scripttype="text/javascript">
alert(1+undefined);// "NaN"
alert(1+null);// "1"
</script>
从null和undefined的意义上来说,这是很好理解的。
undefined表⽰⽆效对象,null表⽰空对象
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论