数据类型的转换

266 阅读3分钟
数据类型的转换

把其他类型转换为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("测试通过")
}