【转】js运算符重载


【深入学习】关于js的运算符重载(+ 等), 以及 js中的那些隐式类型转换

今天遇见了一个问题,一个div从上往下运动,一个从下往上运动,需要判断他们碰头时做出其他操作,简单的思维是判断上对象移动的值加上下对象移动的值等于视口的height

1
2
3
4
if (movingObj1 + movingObj2 == window.innerHeight)
{
     // doSomething();
}

于是这里就引出了一个关于 对象相加的问题,当然,这里写一个plus函数就可以解决了,但是突然让我想起了学过的运算符重载,js中普通的重载容易,判断args的length即可,那么运算符的重载呢??
想着想着就想起了js中的隐式类型转换:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
console.log( '2'  + 1);  // 21
 
//由此可以看出, 当加号一边为字符串时,会进行隐式类型转换,将number转化为string
 
//于是我就有了新的想法,重写toString函数不就行了吗?
 
         function  objectNum(num) {
             this .value = num;
         }
 
         var  num1 =  new  objectNum(1);
         var  num2 =  new  objectNum(2);
 
         console.log(num1 + num2);  //这里进行默认的Object.prototype.toString() 
         // 结果为  [object Object][object Object]  ,加号作为了字符串连接的作用
 
         //重写之后
         objectNum.prototype.toString =  function  () {
             return  parseFloat( this .value);  //js中number数据类型是float
         }
         
         console.log(num1 + num2);   // 结果为 3
         console.log(num1 - num2);   // 结果为 -1
         console.log(num1 * num2);   // 结果为 2
         console.log(num1 / num2);   // 结果为 0.5

到这里运算符的重载就完成了,但是这里就隐出来了关于隐式类型转换的问题。
原来研究了一下关于 == 的类型转换,发现对象的隐式类型转换无非是 Object.prototype.valueOf() / Object.prototype.toString();

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
         function  objectNum(num) {
             this .value = num;
         }
         objectNum.prototype.toString =  function  () {
             return  parseFloat( this .value);
         }
         
         var  num2 =  new  objectNum(2);
         
         //现在重写两个方法
         num2.toString =  function  () {
             return  1000;
         }
 
         num2.valueOf =  function ()
         {
             return  this .value;
         }
         
         alert(num2);   // 1000
         console.log(num2);  //objectNum {value: 2}
         //由此可知 alert隐式转换调用 toString(),console.log 隐式转换调用 valueOf()
         
         //那么当我想重载运算符的时候,这两个函数都重写了会优先调用哪个呢??
         
         console.log(++num2);     // 结果3 而不是1001,优先调用valueOf
         console.log(num2 +  '22' );  // 结果100022 ,不是322,优先调用toString
         
         //因此可以知道,当没有字符串时,优先调用的是valueOf()。
         
         //进一步证明 :
         num2.valueOf =  function ()
         {
             return  'thie' ;
         }
         
         console.log(++num2);  //返回NaN,因此可知先调用了 valueOf(),但是因为 返回的是字符串 遇见了 运算符且没有字符串,则隐式转换为number型,所以返回NaN

总结: 如果想要重载运算符,则重写toString方法或者valueOf方法则可以完成运算符的重载,因为valueOf的优先级比较高,所以我偏向使用这个。

 

转自:http://www.kgc.cn/bbs/post/68321.shtml

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM