js不同类型值的计算

一、valueOf()和 toString()的区别

二、基本数据类型隐私转换

原始数据类型 转Number
undefined NaN
null 0
false 0
true 1
数字串 相应的数字
不能转化的字符串 NaN
原始数据类型 转String
undefined undefined
null null
false false
true true
数字 数字字符串

隐式转换逻辑

如:“32”+32=“3232” "+"可以把数字转换为字符串 “+”可以理解为字符串拼接

“32”-32=0 “- * /”可以把操作数转换为数字 “-”可以理解为减法运算

把一个变量num变成数字:num-0;

把一个变量num变成字符串:num+' ';

不同类型的基础数据之间的加法,数据先转换为number,然后转换为string(如果有string类型数据参与运算)

null + undefined // 0+NaN 

null + false // 0+0 

1 + true // 1+1

1 + '1' //'11';数字与字符串相加结果是字符串 

1 + 2 + '3'  //'33';(1+2)的结果然后与'3'相加;这里要把每一步加法单独拆开来看,否则变成和下面一样的结果了. 

1 + (2 +'3') //'123';先运算2+'3',然后1+'23' 

's' + null //'snull' 

's' + undefined // 'sundefined' 

's' + true //'strue' 

1 + true + undefined + 's' // 1+1+NaN+'s'=2+NaN+'s'=NaN+'s'=‘NaNs’  

数据前有加号‘+',可以让字符串转化为数字

+'1'+1 // 2

+'s'+2 // NaN  

三、由于隐式转换只能转换原始值类型,如果转换对象等复杂类型需要用到valueOf()和toString()

toString:  将一个对象转换为对应的字符串形式,该方法返回一个表示该对象的字符串

valueOf: 
返回当前对象的原始值。返回当前对象所对应的基本数据类型值
如果当前对象无法获取到对应的基本数据类型,那么会将对象本身原封不动的返回

JS中的类型分为两大类: primitive(基本数据类型) 和 object(复杂数据类型)。
其中primitive类型的数据有6种,分别为: Null, Undefined, Number, String, Boolean, Symbol, BigInt。
不是primitive类型的值,都可以被认为是object类型
当object类型和primitive类型进行运算的时候,JS会尝试将object类型的数据转换为primitive类型的数据后再进行相应的运算
在ECMAScript文档,为object定义了一个内部方法toPrimitive,当JS需要将尝试将对象数据类型转换为基本数据类型的时候,就会调用这个方法
在ES6中,为引用数据类型提供了Symbol.toPrimitive属性,我们可以通过该属性来重写object的内部方法toPrimitive

在ECMAScript文档,为object定义了一个内部方法toPrimitive, 其会在进行类型转换或者运算的时候被调用。


// toPrimitive的伪代码形式如下:
toPrimitive(target, PreferredType = 'default': 'string' | 'number')
  • 如果没有定义PreferredType, 则默认为default;

  • 如果PreferredType 的值为default,执行流程和PreferredType的值为number时的执行流程一致;

  • 如果PreferredType的值为number,优先执行valueOf方法;

      如果valueOf方法返回值是基本类型值,那么就直接返回基本类型值,不再继续调用toString方法;
      如果valueOf方法不存在或者返回的不是基本类型值,继续调用toString方法;
    
      如果调用了toString方法,并且返回了基本数据类型值,就直接返回数据类型值
      如果没有返回基本数据类型值,就抛出异常
    
  • PreferredType的值为string,优先执行toString方法,

      如果toString方法返回值是基本类型值,那么就直接返回基本类型值,不再继续调用valueOf方法
      如果toString方法不存在或者返回的不是基本类型值,继续调用valueOf方法
    
    
      如果调用了valueOf方法,,并且返回了基本数据类型值,就直接返回数据类型值
      如果没有返回基本数据类型值,就抛出异常
    

(1)对象到字符串的转换过程

原始(基本)类型:undefined、null、string、number、boolean
首先调用toString()方法,只有当toString不返回一个原始值的时候,才会调用valueOf()
toString()方法基本上所有对象都返回字符串。
toString()方法用在对象上面,比如function、array、object,返回的值都差不多,都是返回这个对象的源码,但是以字符串的形式表示。

(2)对象到数字的转换过程

首先调用valueOf(),如果返回原始值,将原始值转为数字并返回,valueOf()基本上所有的对象返回的都是对象,虽然先使用valueOf(),但实际上也是使用的toString()的方法。

如将let a={ }; 转为数字

首先会调用a的valueOf()方法,如果结果不是原始类型,那么调用toString()方法;

a.valueOf()返回对象本身{ },不是原始类型,所以需要继续调用toString()方法;

a.toString()返回“[object,object]”,是一个字符串类型,即原始类型,所以接下来会调用Number(“[object,object]”),返回NaN;
![] //false;
 +[]  // 0
 +![]  // 0
[]+[] // ""
{}+{}//"[object Object][object Object]"
{}+[]//0
{a:0}+1 // 1
[]+{}//"[object Object]"
[]+![]//"false"
{}+[]//0
![]+[] // "false"
''+{} //"[object Object]"
{}+'' //0
[]["map"]+[] //"function map() { }"
[]["a"]+[] // "undefined"
[][[]] + []// "undefined"
+!![]+[] //"1"
+!![] //1
1-{} //NaN
1-[] //1
true-1 //0
{}-1 //-1
[]==![] //true

参考文章

1、探究JavaScript中的valueOf和toString
2、JS不同类型之间运算与转换

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

推荐阅读更多精彩内容