javascript中的隐式转换

数字和字符串如果使用+运算符进行操作,那么会将数字先转换为字符串,然后进行字符串连接操作

var a = "qweqwe";
var num = 2;
console.log(a + num);
//qweqwe2

如果有布尔型参与,那么首先会将布尔值转换为对应的数字或者字符串,然后再进行相应的字符串连接或者算数运算

var bool = true;
var num = 2;
console.log(bool + num);//3

如果布尔类型与字符串相加,布尔值会和字符串拼接起来

var bool = true;
var str='12345';
console.log(bool + str);//true12345

Null和Undefined参与的+运算符操作
如果和数字进行计算,null会转化为0,undefined会转化成NaN

console.log(undefined + 1); //NaN
console.log(null + 1); //1

Null和Undefined参与的+运算符操作

如果和字符串进行计算

var a;
var sta = "123";
console.log(a + sta); //'undefined123'

var b = null;
var stb = "123";
console.log(b + stb); //'null123'

其他值类型(Number、Boolean、Null、Undefined)进行比较的时候都会将运算数转换为数字

console.log("1" == 1);
console.log(true == "1");//”1”和true转换成数字,然后进行比较
console.log(null == 0);
console.log(undefined == 0);//

        

 不是说null会转换成0吗,为啥第三个是false

:在关系运算符中,null,undefined会被Number()强制转换成数字类型;
在相等运算符中,null,undefined则不会转化为数字类型,而是经过特殊处理后转化为false(当然,除了与自身对比,或者是null与undefined对比,即都为true)。

 JavaScript提供了isNaN来检测某个值是否为NaN,但是,这也不太精确的,因为,在调用isNaN函数之前,本身就存在了一个隐式转换的过程,它会把那些原本不是NaN的值转换成NaN的

isNaN("foo"); // true
isNaN(undefined); // true
isNaN({}); // true
isNaN({ valueOf: "foo" }); // true

有一种可靠的并且准确的方法可以检测NaN只有NaN是自己不等自己的,那么,我们就以使用不等于号(!==)来判断一个数是否等于自身,从而,可以检测到NaN了

var a = NaN;
a !== a; // true
var b = "foo";
b !== b; // false
var c = undefined;
c !== c; // false
var d = {};
d !== d; // false
var e = { valueOf: "foo" };
e !== e; // false

对象转换成字符串是调用了他的toSting函数的

象也是可以转换成数字的,它是通过valueOf函数的

一个对象同时存在valueOf方法和toString方法,那么,valueOf方法总是会被优先调用的

但是真正应用的时候并没有这么简单,例如下面两个例子

var obj = {
 webName: "林益泰傻狗",
 url:"www4399com"
}
console.log(obj);
console.log(obj.toString());
var arr = [1, 2, 3];
console.log(arr);
console.log(arr.valueOf());

大多数对象隐式转换为值类型都是首先尝试调用valueOf()方法。但是Date对象是个例外,此对象的valueOf()和toString()方法都经过精心重写,默认是调用toString()方法,比如使用+运算符,如果在其他算数运算环境中,则会转而调用valueOf()方法。

var date = new Date();
console.log(date);
console.log(date + "1");
console.log(date + 1);
console.log(date - 1);
console.log(date * 1);

空数组[]转化为Number,得到0;空对象{}转化为Number,得到NaN 

console.log(Number([])); // 0
console.log(Number({})); //NaN

用if()判断
由于空数组和空对象都是Object类型,因此用if()判断的时候,都为true
和布尔值比较
由于任何值和布尔值比较时,两边都会转化为Number类型

console.log([] ? true : false); //true
console.log([] == false); //true
console.log({} == false); //false

toString()方法返回一个表示该对象的字符串。

每个对象都有一个toString() 方法,当对象被表示为文本值时或者当以期望字符串的方式引用对象时,该方法被自动调用。
对于对象x,toString() 返回 “[object type]”,其中type是对象类型。
如果x不是对象,toString()返回x应有的文本值(不是单纯的加”“)

var x = {}
console.log(x.toString()) //  "[object Object]"
toString.call(undefined) //"[object Undefined]"
toString.call(null) // "[object Null]"

//其他类型的toString():
var x = [1,2,3]
x.toString() // "1,2,3"

var x = function(){console.log('hello world')}
x.toString() // "function(){console.log('hello world')}"

var x = 12345
x.toString() // "12345"


 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王源偷我华子抽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值