这是我参与8月更文挑战的第18天,活动详情查看:8月更文挑战
前言
大家好哇,今天来记录一下javascript的值类型转换和抽象值操作,内容主要参考《你不知道的JavaScript》(中卷),同时会加上自己的思考,以及实践的例子,有道是好记性不如烂笔头,读了书一定要勤做笔记,这样不仅记的牢固,也能提升自己的水平。
正文
提前说明哦,这是一篇前端笔记类的文章,属于个人记录。各位高人请绕道勿喷,谢谢~
值类型转换
将值从一种类型转换为另一种类型通常称为类型转换, 这是显式的情况,隐式的情况成为强制类型转换。
强制类型转换总是返回标量基本类型值,如字符串,数字,布尔值,不会返回对象和函数。
抽象值操作
普通对象除非自定义,否则toString()返回内部属性[[Class]]的值,如"[Object Object]",如果对象有自己的toString()方法,字符串化时就会调用该方法并使用其返回值。
toString()可以被显式调用,或者在需要字符串化时自动调用。
JSON.stringify(): 不是强制类型转换,只能将安全的JSON值字符串化,安全的JSON值即为能够呈现为有效JSON格式的值。不安全的JSON值如:undefined、function、symbol和包含循环引用的对象都不符合JSON结构标准,其他支持JSON的语言无法处理它们。所以,JSON.stringify()在对象中遇到undefined、function、和symbol时会自动将其忽略,如果在数组中则会返回null,以保证单元位置不变。如:
let a = [1,undefined]
let b = {
aa:null,
bb:function(){
console.log("111")
}
}
JSON.stringify(a) // '[1,null]'
JSON.stringify(b) // '{"aa":null}'
如果对象中定义了toJSON()方法,JSON字符串化时会首先调用该方法,然后用它的返回值来进行序列化。toJSON()返回的应该是安全的JSON值,而不是JSON字符串,因为返回的值会再次经过JSON.stringify(...)对其进行字符串化。
JSON.stringify() 可以接收一个可选参数replacer,可以是数组或者函数,用来指定对象中被json字符串化的属性。当replacer是数组的时候,必须是一个字符串数组,其中包含序列化要处理的对象的属性名称,除此之外其他的属性则被忽略。当replacer是函数的时候,它会对对象本身调用一次,然后对对象中各个属性各调用一次,每次传递两个参数:键和值。要忽略某个键就返回undefined,否则返回指定的值。
JSON.stringify() 还可以介绍一个可选参数space,用来指定输出的缩进格式,若space为正整数,则是指定每一级缩进的字符数,它还可以是字符串,字符串的前十个字符被用于每一级的缩进。
ToNumber() 对字符串的处理遵循数字常量的相关规则/语法,处理失败则返回NaN。在处理对象(包括数组)时,首先会检查该值是否有valueOf()方法,如果有并返回基本类型值,则使用该值进行强制类型转换。如果没有就使用toString()的返回值进行强制类型转换。如果都valueOf()和toString()均不返回基本类型值,就会产生TypeError的错误。
T oBoolean( ): 假值的布尔强制类型转换结果为false,如undefined,null,false,+0,-0,NaN,""等。
假值对象实际上不属于Javascript怨言的范畴,浏览器在某些特定情况下,在常规Javascript语法基础上自己创建了一些外来值,这些就是“价值对象”,假值对象看起来和普通对象一样,但是它们强制类型转换为布尔值时的结果为false。如document.all,如今已被废止,但是还有在用以下方法来判断老版本的IE:
if(document.all){/*这是IE*/}
后记
你好哇,我是南极大冰块,一个技术与颜值成正比的前端工程师,崇尚一针见血的搞定前端问题,希望我的博客有帮助到了你。
关注我,前端路途一起走。嘿哈~😛