JS不同数据类型间的运算规则

规则1:非number类型的值进行运算(-,*,/,%),会将这些值转换成number再运算

规则2:强制转换:String()与Boolean()三个强制转换函数,所对应的就是在ECMAScript标准中的ToNumber、ToString、ToBoolean三个内部运算转换的对照表

通过ToNumber()把值转换成Number:

参数结果
undefinedNaN
null+0
booleantrue->1,false->0
number无需转换
string由字符串转换成为数字。”123″转换为123

通过ToString()把值转化成字符串:

参数结果
undefined“undefined”
null“null”
boolean“true” 或者 “false”
number数字转换成字符串。123转换成”123″
string无需转换

规则3:number类型的值与NaN做运算都是NaN

规则4:不同类型的基础数据之间的加法,数据优先转换为number,如果有string类型数据参与运算,则转成String再拼接

规则5:对象参与基础类型数据运算,先转化为基础类型。先调用其valueOf方法,如果返回的不是基础类型,再调用其toString方法,如果返回的还不是基础类型,则抛出错误。Date数据刚好相反,Date对象首选类型String,先调用toString(),得到字符串做字符串连接运算如果返回的不是基础类型,再调用其valueOf方法。获取Date对象中的valueOf返回值,需要使用一元加号(+),来强制转换它为数字类型

规则6:一元运算符:-, +对于number类型数字,+不会对数字产生影响,-将数字转换成负数;对于非number类型的值,会先将值转换成number再做运算

console.log(null + undefined);
//输出NaN。参照规则1、2、3,null转换成number为0,undefined转换为NaN
console.log(null + false);
//输出0。参照规则1、2,null转换成0,false转换成0
console.log(1 + true);
//输出2。参照规则1、2,true转换成1
console.log(1 + '1');
//输出11。参照规则4,转换成String进行拼接
console.log( 1 + 2 + '3');
//输出33。参照规则4和6,1+2结果为3后进行String拼接
console.log( 1 + (2 +'3'));
//输出123。参照规则4和6,2和'3'String拼接后为String类型'23',继续进行拼接
console.log('s' + null);
//输出snull。参照规则4,优先进行字符串拼接
console.log('s' + undefined);
//输出sundefined。参照规则4,优先进行字符串拼接
console.log('s' + true);
//输出strue。参照规则4,优先进行字符串拼接
console.log(1 + true + undefined + 's');
//输出NaNs。参照规则1,1+true为2,和undefined相加参照规则1、2转换成2+NaN,参照规则3结果为NaN,+'s'后参照规则4字符串拼接为也为NaNs

Date.prototype.toString = function(){
	return 1;
}
Date.prototype.valueOf = function(){
    return 2;
}
var a = new Date,b = new Date;
console.log(a + b);
//输出2。参照规则5,Date类型对象数据先调用toString方法,转化为1+1结果为2

Date.prototype.toString = function(){
    return {}; 
}
var c = new Date, d = new Date;
console.log(c + d);
//输出4。参照规则5,调用toString类型转化后不为基础类型,调用valueOf方法,转化为2+2结果为4

Date.prototype.valueOf = function(){
            return {};
}
var e = new Date,f = new Date;
console.log(e + f);
//抛出错误。参照规则5,调用toString和valueOf方法后,如果返回的还不是基础类型,则抛出错误
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值