example1:
json={
//字符串str
str:"+12345"
}
alert(typeof(str))
if(!json.str.indexOf("+")==-1)
{
alert("yes")
}
这个会输出什么呢?我猜会是json.str.indexOf("+") is not a function
example2:
json={str:"+123"}
alert(typeof(str))
alert(json.str.indexOf("+"))
输出会是什么呢?我猜是0
example3
json={str:
{indexOf:function(s){}
}
}
alert(json.str.indexOf("+"))
输出会是什么呢?
求大神亲测解释原理
我是不是用了假的编译器???
js怎么区分这个混淆呢?
example1中 alert(typeof(str))为未定义
if(!json.str.indexOf("+")==-1){} 条件为false 所以 alert(yes)不会出来,并不是json.str.indexOf("+") is not a function的锅
if(!json.str.indexOf("+")==-1)改为 if(json.str.indexOf("+")!=-1) alert(yes)会出来
example2 未定义 0
example3 未定义
那js如何区分str.indexOf是调用字符串的方法,还是json的定义的东西呢?
不会混淆吗?
非要用点,不能用中括号吗?
第一个未输出yes是因为操作符优先级的问题。
if(!json.str.indexOf("+")==-1)等价于
if(
(!json.str.indexOf("+"))//===>!0 ==>true,true和-1比较是false,因为布尔值和数字比较会转为1,1==-1为false
==-1)
参考js运算符优先级
javascript计算不同数据类型如何转换
example1 :
json={
//字符串str
str:"+12345"
};
alert(typeof(str));//输出undefined ,str 在全局范围内是未定义变量,typeof识别不了
if(!json.str.indexOf("+")==-1){//这里的 json.str 相当于 "+12345" , !"+12345".indexOf("+") 得值为 true,这里就相当于if(true==-1) ,js解析器在解析的时候会将true转成1,实际上这里相当于if(1==-1)条件判断为false因此alert不执行。
alert("yes");
}
example2
json={str:"+123"}; //标准json格式变量
alert(typeof(str));//undefined 理由同上
alert(json.str.indexOf("+"));//相当于 "+123".indexOf("+") ,indexOf是JS提供的字符串处理函数,因此这里函数是有效的,结果输出为 0
example3
json={str:
{
indexOf:function(s){}
}
}
alert(json.str.indexOf("+"))//这里返回undefined ,这里其实是调用了json.str.indexOf这个函数的,因为函数没有返回值,默认返回就是undefiend,这里的indexOf并没有覆盖js的字符串函数,就只是一个普通的同名变量
example3可以调整一下
json={str:
{
indexOf:function(s){return s;}
}
};
alert(json.str.indexOf("+"));//这里结果将是 "+"
如果要做JSON函数封装也可以改成这样:
json={str:
{
indexOf:function(s,i){return s.indexOf(i);}
}
};
alert(json.str.indexOf("+12345","+"));//返回值是 0
题外话,个人建议每条语句后面补加“;“作为语句结束符,JS比较长的时候有时候容易导致一些错误,找起来比较头大。