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