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