文章思维导图
文章思维导图获取 点击
以下的数据类型转换都属于全局函数
输出
1 0 1593869544742 999 NaN隐式类型转化主要通过一些运算符,如:+、-、*、==
当number与其他数据类型进行减法运算的时候,会优先把其他数据类型转化为number然后进行运算
最终的结果一定是数字(包括NaN、Infinity)
// 加法 console.log(4 - 'hello')// NaN console.log(4 - '123')//-119 console.log(4 - true)//3 console.log(4 - null)//4 console.log(4 - undefined)//NaN // 乘法 console.log(4 * 'hello')// NaN console.log(4 * '123')//492 console.log(4 * true)//4 console.log(4 * null)//0 console.log(4 * undefined)//NaN // 除法 console.log(4 / 'hello')// NaN console.log(4 / '123')//0.032520325203252036 console.log(4 / true)//4 console.log(4 / null)//Infinity console.log(4 / undefined)//NaN这里的关系运算符包括==/>/<
两个特殊性
undefined==null //返回true NaN==NaN //返回falsestring、boolean:转化为数字(调用Number())之后进行比较
'0'== false //true无论是对象还是空对象,一律判定为 true
可以利用NaN本身不相等来初始化一个函数
NaN == NaN // false NaN !== NaN // true const obj = {name:'SunWuKong'} obj !== obj // false初始化函数
function isReallyNaN(element) { return element !== element; }只要传入元素就能判断他是否为NaN
一般情况下,会先将相应的数据类型转化为数字,在进行比较
1 > false // ture null > -1 // true如果比较的两位数据中都是字符串,他会叫字符串转化为unicode编码,再进行比较
通过charCodeAt()可以得到字符串对应的unicode编码 点击 "10".charCodeAt() // 49 "2".charCodeAt() // 50 // 所以 "10"<"2" 长度不相等的字符串的比较 从左向右以此比较字母的unicode,如果相同则比较下一位,知道返回结果。 console.log("abc" > "d") // false console.log("abc".charCodeAt())//97 console.log("d".charCodeAt())//100 他会先将a和d的unicode编码进行比较,d的编码大于a直接得出结果相当于Boolean(),他会把后边的类型转化为布尔值,转化的类型请参见Boolean全局函数
复杂的数据类型,比如说对象,比如说数组。一般会先调用valueOf()方法,之后在调用toString()方法
举例
console.log([1,2] == '1,2') // true 经历了上面的隐式类型转换,我们知道,等号两边的数据类型是数值==,才能进行运算,所以会想尽一些办法把数组和字符串变成数值对于数组来说,是复杂的数据类型,会先调用valueOf方法,得到其原始值如果原始值不是number,则会调用toString()方法将其转化成字符串之后在调用Number()全局方法,将其转化为number console.log([1,2].valueOf())//[1, 2] console.log([1,2].toString())//1,2valueOf和toString,都是允许被重写的,当两者都存在的时候,会优先调用valueOf,我们下面完成这样一个题
var a = ? if (a == 1 && a==2 && a == 3) { console.log('you are right') } // 如何打印成 you are right?我们进行这样的分析
题目是用的==,他会首先进行隐式类型转换,如果我们给a赋值成一个复杂的数据类型,比如对象,他进行类型转换的时候会首先调用方法valueOf()因为要进行三次类型转换,他会调用三次valueOf方法,我们能不能通过重写valueOf()方法,实现呢?实现
var a = { i:0, valueOf:function(){ return ++a.i // 每一次调用a的值都会一次加1 } } if (a == 1 && a==2 && a == 3) { console.log('you are right') }