数据类型的转换
把其他类型转换为number
-
Number([val])
-
一般存在隐式转换中
-
规则:
-
把字符串转换为数字:如果是空字符串就变成0,如果出现任何一个非有效数字字符结果就是NaN
-
把布尔值转为数字:true -> 1 , false ->0
-
null -> 0 ,undefined - >NaN
-
Symbol无法转为数字会报错Uncaught TypeError: Cannot convert a Symbol value to a number
-
BigInt去除n(超过安全数字会安装科学计数法处理)
-
对象转换成数字
-
先调用对象的Symbol.toPrimitive 这个方法如果不存在这个方法
-
// obj[Symbol.toPrimitive] = function (hint) { // // hint: number / string / default 浏览器自己调用这个方法,会默认传递的实参值 // // ... // };
-
-
再调用对象的valueOf,如果获取的不是原始值类型的值比如number,string,null,undefined,symbol,bigint,boolean
-
再调用对象的toString 把对象变为字符串
-
最后再把字符串基于Number方法转为数字
-
-
-
-
parseInt([val,[radix]])
-
parseFloat([val])
-
一般用于手动类型转换
-
规则
-
[val]值必须是一个字符串,如果不是则先转换为字符串;然后从字符串左侧第一个字符开始找,把找到的有效数字字符最后转换为数字「一个都没找到就是NaN」;遇到一个非有效数字字符,不论后面是否还有有效数字字符,都不再查找了;parseFloat可以多识别一个小数点;
-
-
把其他类型值转换为布尔值
- 除了0/NaN/null/undefined四个值是false,其他都是true
==比较时候互相转换的规则
两对象类型不相同,需要转换为相同类型,再进行比较
-
对象==对象之间比较是比较原来的堆地址
{}=={} //false -
对象和字符串比较是将对象转为字符串「Symbol.toPrimitive -> valueOf -> toString」
-
null == undefined -> true
-
NaN == NaN -> false
-
除了以上情况,只要两边类型不一致,剩下的都是转换为数字,然后再进行比较的
===比较
- “===”绝对相等,如果两边类型不同,则直接是false,不会转换数据类型「推荐」
Symbol 唯一值类型
Symbol() 创造一个唯一值
Symbol('xxx') 创造一个唯一值,只不过设置了标记
new Symbol() Uncaught TypeError: Symbol is not a constructor 不允许被new执行
----
用途1:给对象设置一个唯一的属性「对象的成员只能是 string & symbol 类型的值,Map允许属性名是不同类型的{包含对象}」
用途2:它是很多内置机制的实现方式
Symbol.toPrimitive
Symbol.hasInstance
Symbol.toStringTag
...
console.log(Symbol('AA') === Symbol('AA')); //false 创造了两个唯一值
面试题
if(a == 1 && a==2 && a==3){ console.log("测试通过") }
/*
@1 方法一 数据劫持
*/
var i = 0;
Object.defineProperty(window,"a",{
get:function (){
return ++i
}
})
if(a == 1 && a==2 && a==3){
console.log("测试通过")
}
/*----*/
/*
@2 方法二 类型隐式转换 (尽量变成对象进行隐式转换)
对象 == 数字
+ [Symbol.toPrimitive]()
+ valueof
+ toString
+ Number
*/
let a = {
i:1,
toString : function () { return this.i++ },
/*
// this 指向 a 因为隐式调用a[Symbol.toPrimitive]()
[Symbol.toPrimitive]: function () { return this.i++ },
valueOf : function () { return this.i++ }
*/
};
if (a == 1 && a == 2 && a == 3) {
console.log("测试通过")
}