• 微信:
  • hai764003
  • QQ:
  • 511211014
  • E-mail:
  • jaquery@163.com

案例总数51

访问总数312366

收藏总数310897

javascript能干什么返回列表

上传时间:2015-02-02 内容关键字:



三种情况


加法运算符的类型转换,可以分成三种情况讨论。


1)运算子之中存在字符串


两个运算子之中,只要有一个是字符串,则另一个不管是什么类型,都会被自动转为字符串,然后执行字符串连接运算。前面的《自动转换为字符串》一节,已经举了很多例子。


2)两个运算子都为数值或布尔值


这种情况下,执行加法运算,布尔值转为数值(true1false0)。


true + 5 // 6


true + true // 2


3)运算子之中存在对象


运算子之中存在对象(或者准确地说,存在非原始类型的值),则先调用该对象的valueOf方法。如果返回结果为原始类型的值,则运用上面两条规则;否则继续调用该对象的toString方法,对其返回值运用上面两条规则。


1 + [1,2]

// "11,2"


上面代码的运行顺序是,先调用[1,2].valueOf(),结果还是数组[1,2]本身,则继续调用[1,2].toString(),结果字符串“1,2”,所以最终结果为字符串“11,2”。


1 + {a:1}

// "1[object Object]"


对象{a:1}valueOf方法,返回的就是这个对象的本身,因此接着对它调用toString方法。({a:1}).toString()默认返回字符串"[object Object]",所以最终结果就是字符串“1[object Object]


有趣的是,如果更换上面代码的运算次序,就会得到不同的值。


{a:1} + 1

// 1


原来此时,JavaScript引擎不将{a:1}视为对象,而是视为一个代码块,这个代码块没有返回值,所以被忽略。因此上面的代码,实际上等同于 {a:1};+1 ,所以最终结果就是1。为了避免这种情况,需要对{a:1}加上括号。


({a:1})+1

"[object Object]1"


{a:1}放置在括号之中,由于JavaScript引擎预期括号之中是一个值,所以不把它当作代码块处理,而是当作对象处理,所以最终结果为“[object Object]1”。


1 + {valueOf:function(){return 2;}}

// 3


上面代码的valueOf方法返回数值2,所以最终结果为3


1 + {valueOf:function(){return {};}}

// "1[object Object]"


上面代码的valueOf方法返回一个空对象,则继续调用toString方法,所以最终结果是“1[object Object]”。


1 + {valueOf:function(){return {};}, toString:function(){return 2;}}

// 3


上面代码的toString方法返回数值2(不是字符串),则最终结果就是数值3


1 + {valueOf:function(){return {};}, toString:function(){return {};}}

// TypeError: Cannot convert object to primitive value


上面代码的toString方法返回一个空对象,JavaScript就会报错,表示无法获得原始类型的值。


四个特殊表达式


有了上面这些例子,我们再进一步来看四个特殊表达式。


1)空数组 + 空数组


[] + []

// ""


首先,对空数组调用valueOf方法,返回的是数组本身;因此再对空数组调用toString方法,生成空字符串;所以,最终结果就是空字符串。


2)空数组 + 空对象


[] + {}

// "[object Object]"


这等同于空字符串与字符串“[object Object]”相加。因此,结果就是“[object Object]”。


3)空对象 + 空数组


{} + []

// 0


 

小海哥推荐你看: 博客园  php教程分享网站  phpmywind  脚本之家