新人学习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谢谢你的观看~