【深入学习】关于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