Js隐式转换

常见的隐式转换场景

1 .if 判断,其余类型转为布尔类型
2 .比较操作符 ==

[]==[] false 
{}=={} false
![]==[] true  //前面的取反操作 ,取反之前会把值转换为布尔类型 那么前面的就是一个true,

3 .+,-

var add=1+2+'3'
console.log("33")

var minus=3-true
console.log(minus) 2

4 . 点 号操作符
5 .在对数字,字符串进行点操作方法时,默认将数字,字符串转成对象

var a=2
console.log(a.toString())
// "2"

var b="zhang"
console.log(b.valueOf())
//zhang

5 .关系符比较的时候

3>4
//数字直接比较大小
"2">10
//非数值的话,前部转为数字在比较
"2">"10"
//都是字符串的话,直接比较unicode编码

其他类型转为布尔值

1 .


Popo截图2021316214348.png

其他类型转为字符串的情况

1 .null 转为“null”
2 .undefined 转为 “undefined”
3 .Boolean true转为“true”,false转为“false”
4 .number :11 转化为“11”,11e20 科学计数法转为“1.1e+21”
5 .数组,空数组转为字符串“”,如果数组中有null,或者undefined,同样当作空字符串处理,[1,2,3,4]="1,2,3,4"
6 .函数function a(){}转为字符串为 “function a(){}”
7 .一般对象:“[object,object]”
8 .NaN "NaN"

其他类型转为Boolean类型

1 .只有null,undefined,0,false,NaN,空字符串,这6种情况转为布尔值的结果为false,其余都是true
2 .转换为布尔值得场景

for 的第二个
while
if
三元表示符
|| && 左边的操作符

其他数据类型转为Number类型

1 .null 0
2 .undefined NaN
3 .Boolean true 1,false 0
4 .字符串:纯数字的字符串,转为对应的数字,空字符串转为0,其余都是NaN
5 .数组,数组首先会被转换为原始类型,然后根据上面的原始类型转换规则进行转换

[]=0
[0]=0
[1]=1
["abc"]=NaN

6 .对象,和数组一样 {}=NaN
7 .NaN NaN

对象转为其他类型

1 .Data对象会先调用toString
2 .当对象转为其他原始类型时,会先调用对象的valueOf方法,如果valueOf方法返回的是原始类型,直接返回这个原始类型
3 .返回的不是原始类型,或者valueOf方法不存在,继续调用toString()方法。如果toString()返回的是这个原始类型。直接返回这个原始类型,如果不是原始类型,直接报错

    var o1 = {
        valueOf(){
            return 1
        }
    }
//返回原始类型1 ,结果是1
    var o2 = {
        toString(){
            return 2
        }
    }
    var o3 = {
        valueOf(){
            return {}
        },
//返回这个不是原始类型,继续调用toString类型
        toString(){
            return 3
        }
    }
    
    Number(o1)  //1
    Number(o2)  //2
    Number(o3)  //3
    

Number([])
//首先[].valueOf  = [] 不是原始类型
[].toString = "" 返回一个空字符串,算是原始类型吧,空字符串转为数字是0,所以返回是0

!!

1 .将一个值转换为他为真正的布尔值
2 .!![] false ![]==true

宽松相等的隐式转换

字符串与数字类型相比较

1 .字符串和数字类型相比较的时候,字符串会被转换为数字类型

1 .当字符串是由纯数字组成的字符串时,转换成对应的数字,字符串为空时转换为0,其余的都是NaN
"1"==1 true
""==0 true
"1.1e+21"==1.1e+21 true
"Infinity"==Infinity true 
NaN==NaN false

2 .布尔值和其他类型值比较

1 .只要布尔值参与比较,布尔类型就会率先被转换成数字类型
true ==1  true
false ==0 true
true==2 false
""==false  true
"1"==true true

3 .null ,undefined 和其他类型的比较

1 .null :代表空值,代表一个空对象指针 typeof null =object 可以看成是一个特殊的对象值
1.1 使用场景;作为原型链的终点,作为函数的参数,表示改函数的参数不是对象

2 .undefined:声明了一个变量,但是没有给变量赋值,此变量的默认值就是undefined
2.2 使用场景 
1 .声明了一个变量,但是没有为该变量赋值,此时默认为undefined
2 .函数没有写明确的return ,此时返回undefined
3 .调用函数时,没有传参数,默认参数值为undefined\
4 .对象的某个属性没有赋值,默认值为undefined

4 .js规定null,undefined宽松都与自己相等,但是与其它值都不相等

对象与原始类型相比较

1 .会把对象按照对象转换规则转换成原始类型,再次比较

{}==0 false
({}).valueOf() == {}
({}).toString() == "[object object]"
"[objetc object]"==0 字符串和数字比较,先转为数字,NaN==0 这是最后比较的操作,所以是false


[]==false 
[].valueOf() == []
[].toString() == ""
""==false 
布尔值比较的时候会先转换为数字,""==0
字符串和数字比较的时候也会转为字符串 0==0 所以最后是true

[1,2,3,4]=="1,2,3,4" true

对象和对象的比较

1 .如果两个对象指向同一个对象,相等操作符返回true,否则返回 false

var a={}
var b={}
a==b false

var a={}
var b=a
a==b true

[]==![] true
//逻辑非 的优先级高于== ,所以现时取反操作,变成了false 
此时变成了[] 和false的比较
然后变成了[] 变为 "",false变为0,最后就是""==0的比较,字符串与数字的比较规则 0==0 所以最后是true
{}==!{} false

字符串连接符与加号运算符如何区分

1 .字符串连接符的情况

1 .+的两边,任意一个为字符串
2 .+的两边,其中一边是对象,并且取得原始值为字符串
var c={
valueOf(){return 1}
}
1+undefined NaN 不是1 
true+undefined NaN 不是1 
true + c  2 
NaN + 1 NaN
[]+[]=0
[]+{}= "[object object]"
{}+[] 0
{}会被看作是一个代码块,而不是一个js对象,于是运算就变成了+[] 于是最后得值是0
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,907评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,987评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,298评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,586评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,633评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,488评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,275评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,176评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,619评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,819评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,932评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,655评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,265评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,871评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,994评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,095评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,884评论 2 354

推荐阅读更多精彩内容