解释一下 为什么会是这样的!?

daniel_kaka 2007-08-27 04:13:54
document.write('Boolean("")=' + Boolean("")+'<br>');
document.write('Boolean(" ")='+Boolean(" ")+'<br>');
document.write('(" " == false)='+(" " == false)+'<br>');
document.write('("" == false)='+("" == false)+'<br>');
document.write('(false == false)='+(false == false)+'<br>');

================================================================
结果:

Boolean("")=false
Boolean(" ")=true
(" " == false)=true
("" == false)=true
(false == false)=true

===============================================================
其中
Boolean(" ")=true
(" " == false)=true
难道是Bug?!

高手帮忙解释一下~
...全文
321 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
浪尖赏花 2007-08-29
  • 打赏
  • 举报
回复
这个就不是你我可能管的了
如果用着不爽就尽量少用(即避免用)

js就是这么规定的呀
Number(new String()) -- 0
parseInt(new String()) -- NaN

作为程序员,在弄清楚之后,你可以认为他不合理,但必须遵从
daniel_kaka 2007-08-29
  • 打赏
  • 举报
回复
Number("") -- 0
Number(" ") -- 0

但是为什么:
parseInt(" ")-- NaN
parseInt("")-- NaN

两种转化结果怎么可能不同~
daniel_kaka 2007-08-29
  • 打赏
  • 举报
回复
function check(){
var v = document.getElementById("aaa").value;
alert("*" + v + "*");
if (v){
alert("*" + v + "*");
}
}
function check1(){
var v = document.getElementById("aaa").value;
alert("*" + v + "*");
if (v == false){
alert("*" + v + "*");
}
}

<input type="text" name="aaa"/>
<input type="button" name="bt2" onclick="check()" value="校验"/>
<input type="button" name="bt3" onclick="check1()" value="校验1"/>

1,执行check()时:
当什么都不输入,结果是:
**
当输入" "时,结果是
* *
* *
2,执行check1()时:
当什么都不输入,结果是:
**
**
当输入" "时,结果是
* *
* *

很简单的验证~
很容易看出不同来吧~
知道这个问题的意义了吧~
daniel_kaka 2007-08-29
  • 打赏
  • 举报
回复
还有~

回lihui_shine(浪尖赏花) ( 五级(中级))

Boolean("")=false
Boolean(" ")=true
但是:
(" " == false)=true
("" == false)=true
(false == false)=true

结合以上两种,那你说一下下面的题该怎么判断~
别告诉我就是规定的~
if(document.getElementById("aaa").value){
....
}
其中aaa是一个文本框~
如果我想要的结果中允许是空的字符串,那该怎么实现~

请你回答~

注意,我允许用户输入空串(" ")~但不允许是空("")
-----------------------------------------------------
看问题不要太肤浅~,不是抓住什么不放,既然存在,就有存在的价值~
等你研究明白这道题再来回答问题~别老是想当然~

我明确告诉你我的结果:
它是按照下面规则来验证的~
Boolean("")=false
Boolean(" ")=true
而不是
(" " == false)=true
("" == false)=true
这条规则~~~
daniel_kaka 2007-08-29
  • 打赏
  • 举报
回复
我说了,单独针对数据实没有意义,但是

因为在javascript应用中,我们都不需要显式转化,
都是靠的系统自己的转化,那在不同的情况下,我们就会转化得到不一样的结果~
这才是应用中存在的问题~
其实就是一些边缘数据,如""," "之类的~等~

但我们往往在判断的时候用到的也就是这些边缘值~

因此我才想到了问这些问题~
这也许是大家在应用过程中都忽略的地方~
浪尖赏花 2007-08-29
  • 打赏
  • 举报
回复
lz有必要重新理下头绪
不要想当然(当然,你NB可以自己搞一个语言,规则你自己定)
浪尖赏花 2007-08-29
  • 打赏
  • 举报
回复
哎,我不是早就回答了吗?
判断一个串是不是等于另一个串的时候,还有没有必要trim~
答:不是没有必要trim,而是不会去做trim
如:alert(" "==" a ");//false

(" " == false)=true
("" == false)=true
(false == false)=true
答:出现这中情况是因为比较的类型不同
当字符串跟布尔型进行比较,统一转换成Number类型
" " == false
转换成0==0,所以结果为true
""==false
转换成0==0,所以结果为true

false==false自然是true

我不清楚你干嘛老抓着Boolean("")=false,Boolean(" ")=true不放,这跟
(" " == false)=true
("" == false)=true
毫无关系,跟
(" " == false)=true
("" == false)=true
有关系因该是Number("")=0,Number(" ")=0
btbtd 2007-08-29
  • 打赏
  • 举报
回复
理解这种问题...没啥意义...
daniel_kaka 2007-08-29
  • 打赏
  • 举报
回复
因为在javascript应用中,我们都不需要显式转化,
都是靠的系统自己的转化,那在不同的情况下,我们就会转化得到不一样的结果~
这才是应用中存在的问题~
其实就是一些边缘数据,如""," "之类的~等~

但我们往往在判断的时候用到的也就是这些边缘值~

因此我才想到了问这些问题~
这也许是大家在应用过程中都忽略的地方~
daniel_kaka 2007-08-29
  • 打赏
  • 举报
回复
上面这点不是我问题的本质~

回到原题~
Boolean("")=false
Boolean(" ")=true
但是:
(" " == false)=true
("" == false)=true
(false == false)=true

这个才是我的问题的根源~~
两种情况也是不一致的~

问题原型就是,
判断一个串是不是等于另一个串的时候,还有没有必要trim~
这才是实用的关键 ~

daniel_kaka 2007-08-28
  • 打赏
  • 举报
回复
up~~
King6860 2007-08-28
  • 打赏
  • 举报
回复
学习了。
daniel_kaka 2007-08-28
  • 打赏
  • 举报
回复
ls的没看懂我的意思~

我的意思是
Boolean("")=false
Boolean(" ")=true
但是:
(" " == false)=true
("" == false)=true
(false == false)=true

这两种情况不是矛盾吗~
浪尖赏花 2007-08-28
  • 打赏
  • 举报
回复
to lz:
new Object()跟" "可不是一回事
" "的类型是String,而不是Object
比如:
alert(Number(new Object()));//NaN
alert(Number(new String()));//0
区别立即显现
daniel_kaka 2007-08-28
  • 打赏
  • 举报
回复
并且,按照Number(new Object())---NaN的规则
Number(" ")的结果是NaN才符合~
daniel_kaka 2007-08-28
  • 打赏
  • 举报
回复
上面写错~
Number("") -- 0
Number(" ") -- 0
parseInt(" ")-- NaN
parseInt("")-- NaN
daniel_kaka 2007-08-28
  • 打赏
  • 举报
回复
实在不好意思~

我用的是parseInt(" ")结果是NaN~~~~~~

parseInt(" ")

这样说来新问题又来了~

parseInt(" ")--NaN
parseInt("")--NaN
Number("") --NaN

但是,二者的区别仅仅是
parseInt()转化的是第一个非数字之前的部分,Number()转化的是整个串~

那么怎么又会出现上面这种情况~~
浪尖赏花 2007-08-28
  • 打赏
  • 举报
回复
谢ls的关心,我还早呢
刚刚得的第5个裤衩
菜鸟一个,呵呵
而且来csdn不久,还请多多照顾啊
hij333 2007-08-28
  • 打赏
  • 举报
回复
lihui_shine还差多少升星啊?
浪尖赏花 2007-08-28
  • 打赏
  • 举报
回复
lz认为是String和boolean比较时
String转化为boolean~
这样" "先经过trim(我认为)变成""
而""转化为boolean是false
因此才有" " == false
----------------
lz再试试这个通不通了
"0"==false
String转化为boolean
即true==false
那结果应该是false//错误

可是事实上是都转换成Number
即0==0
结果应该是true
加载更多回复(12)

87,915

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧