<JS>学习笔记(基础:类型转换规则)

新人学习JS的日记。

欢迎各位朋友纠错!

以下内容都在谷歌浏览器进行测试可用
( 我用 -> 表示转换后的)
' ' 是我表示字符串," "是浏览器表示字符串
抽象操作是JS的内部操作,可以理解为规则。

抽象操作ToNumber

在其它类型 转换为 Number类型 按照此规则执行

转换方法(其中一种) :Number(参数)即可转换为Number类型
undefined -> NaN
null -> 0
true -> 1
false -> 0
Symbol类型 报错

顺便说下如果 数字过大 会转换为 科学计数法 形式显示(具体的阈值我不清楚)
let a = 1 // 1
a = Math.pow(2,70) // 1.1805916207174113e+21
如果特别大的话 就显示Infinity (具体的阈值我不清楚)
a = Math.pow(2,2000) //Infinity
a = -Math.pow(2,2000) //-Infinity
你可以用 进制,科学计数法 赋值,但是系统计算时都转换为10进制计算,然后按照上面这个规则
a = 1e10 // 10000000000
a = 0xA // 10

String类型 简单说
'' -> 0
如果字符串的值正好是数值,就直接变为对应数值
'0' -> 0
'-0' -> -0
'123' -> 123
'1.1805916207174113e+21' -> 1.1805916207174113e+21
'Infinity' -> Infinity
'-Infinity' -> -Infinity
'0xA' -> 10 //16进制
'070' -> 70 //注意:这样的写法你可能以为是8进制 其实会当做10进制解析,并且去掉开头多余的0
'0o70' -> 70 // 56 这样写就会正常当做8进制解析了
其余所有情况都转换为NaN
'NaN' -> NaN
'acza' -> NaN
'++0' -> NaN

若是<位运算>,NaN转换为0进行计算.

Object类型
(1)进行抽象操作ToPrimitive
(2)将返回的值按照上述规则进行转换
抽象操作ToString

其它类型 转换为 String类型 按照此规则执行

转换方法(其中一种) :String(参数)即可转换为String类型
undefined -> "undefined"
null -> "null"
true -> "true"
false -> "false"
Symbol类型 报错

Number类型
-0 -> "0"
其余所有都相当于是,数值 -> "数值" , 加俩引号
0 -> "0"
-1 -> "-1"
NaN -> "NaN" 
1e+30 -> "1e+30"
123 -> "123"
Infinity -> "Infinity"

Object类型
(1)进行抽象操作ToPrimitive
(2)将返回的值按照上述规则进行转换
 
抽象操作ToBoolean

其他类型 转换为 Boolean类型 按照此规则执行

转换方法(其中一种) :Boolean(参数)即可转换为Boolean类型

返回false的情况
undefined -> false
null -> false
0, -0 , NaN -> false
'' -> false
document.all -> false //已被废止的语法

除上面的false情况,其他情况都为true
new String('') -> true
new Boolean(false) -> true 
new Number(0) -> true
虽然 '',false,0 都为false 但是它们的封装对象,都为真,因为都是object。
所以不推荐主动创建封装对象,
抽象操作ToPrimitive

object类型 转换为 基本类型 按照此规则执行

(1)优先调用 valueOf 方法。如果返回一个基本类型值,按照上面的转换规则进行转换。 
如果没有返回一个基本类型值进行第二步。
(2)调用 toString 方法。  如果返回一个基本类型值,按照上面的转换规则进行转换。 
如果没有返回一个基本类型值进行第三步。
(3)报错

特殊情况: 在使用String(object), `${object}`(ES6模板字符串), parseInt(), parseFloat() 
这些情况 按照如下规则
(1)优先调用 toString 方法。如果返回一个基本类型值,按照上面的转换规则进行转换。 
如果没有返回一个基本类型值进行第二步。
(2)调用 valueOf 方法。  如果返回一个基本类型值,按照上面的转换规则进行转换。 
如果没有返回一个基本类型值进行第三步。
(3)报错
JSON
let o ={
    a : 1
}
JSON.stringify( o ) 会返回格式化后的JSON字符串 {"a":1}

如果有写toJSON(),会优先调用toJSON(),然后将返回的对象,在进行格式化返回JSON字符串
let o = {
    a : 1,
    toJSON: function(){
        return { a: 2} ; 
    }
}
JSON.stringify( o )  // {"a":2}

会进行类型转换的时候

>>按抽象操作<ToNumber>对值进行转换的情况
+(一元加: +[]) , - , * , / , ++ , --  , ~ , | , & 
// 按照抽象操作<ToNumber>对值进行转换,然后在进行相应操作.

>>按抽象操作<ToBoolean>对值进行转换的情况
&& , || , ! 
// 按照抽象操作<ToBoolean>对值进行转换,然后在进行相应操作.

>>按抽象操作<ToString>对值进行转换的情况
+(加性操作 []+[]) ,//如果2个值都是number则相加,若有一个不是number类型,则按照<ToString>转换,然后在进行相应操作.
< , >(大于,小于两个值有一个是number,按照<ToNumber>转换,有一个值是string,按照<ToString>转换)
更加准确的类型检测
let type = function(obj){
    let reg = /\[object\s(\w*)\]/g;
    return reg.exec(Object.prototype.toString.call(obj))[1];
};

type({}) // "Object"
type([]) // "Array"
type(/s/) // "RegExp"
type(new Date()) // "Date"
type(1) // "Number"
type(true) // "Boolean"
type('') // "String"
type(window) // "Window"
type(document) // "HTMLDocument"
type(function(){}) // "Function"
有意思的问题
[] + {} // "[object Object]"
{} + [] // 0
这种情况是因为,第二个式子{}在开头,被JS解析器认为是一个代码块,而不是一个对象,所以其实执行的是 +[] 
而数组的toString方法会返回其所有项,由逗号隔开的字符串,[] 没有项,所以返回""
+ "" 加号进行了隐式类型转换(抽象显式ToNumber),将""转换为了0
一些细节

一般情况 object类型的toString方法的东西返回各不相同

String({}) // "[object Object]"
String(new Date()) // "Sat Jun 10 2017 00:19:01 GMT+0800 (CST)"
String([]) //""
String([1,2,3]) //"1,2,3"
String(function (){}) // "function (){}"
String(new RegExp('ds','g')) // "/ds/g"
String(document) // "[object HTMLDocument]"

Date对象的 valueOf方法会返回其对应的毫秒数
Number(new Date()) // 1497025430633

创造一个没有原型的object

let a = Object.create(null) // {}
String(a) // 报错 因为没有原型,也就没有toString,valueOf方法用了

以上是我所知的的东西,有任何错误,请在评论指出!
O(∩_∩)O谢谢你的观看~

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

推荐阅读更多精彩内容