【转】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

 

posted @ 2018-06-07 11:16  Sameen  阅读(4111)  评论(1编辑  收藏  举报