学习JavaScript (二)数据类型的转换
javascript是一种动态类型语言,变量没有类型限制,可以随时赋予任意值,在JS中一共有7种数据类型,string、number、symbol、boolean、null、undefined、object。
JavaScript数据类型的转换 javascript是一种动态类型语言,变量没有类型限制,可以随时赋予任意值,在JS中一共有7种数据类型,string、number、symbol、boolean、null、undefined、object。 数据类型转换指将一个数据类型强制转换为其他的数据类型 类型转换主要指,将其他数据类型转换为:String Number Boolean 数据类型转换分为显式数据类型转换和隐式数据类型转换。 因为变量的数据类型是不确定的Mssq类型转换函数,且各种运算符对数据类型是有要求的,所以如果运算符发现运算子的类型与预期不符,就会自动转换类型。 1、转换为String 方式一: 调用被转换数据类型的toString()方法 该方法不会影响原变量,它会将转换的结果返回 注意:null和undefined这两个值没有toString()方法,如果调用他们的方法会报错。 例子: 记忆:Cannot read property 指的是不能读取属性 除此之外object的toString方法 返回的结果可能不是预期的结果,得到的是[Object Object] 方式二: 调用String()函数,并将被转换的数据作为参数传递给函数 使用String()函数做强制类型转换时,对于Number和Boolean实际上就是调用的toString()方法。但是对于null和undefined就不会调用toString()方法,它会将null直接转换为“null”;将undefined直接转换为“undefined” 例子 方式三: 用+ '',将任意数据类型转换为字符串 例子: 2、转换为Boolean 方式一:调用Boolean() 例子: 方式二:用!!x 例子: 转换结果: number :只有0 , NaN 是false string:空字符串为false其他字符串为ture null:false undefined:false Object:全是ture 五个falsy值:0, NaN , '' , null , undefined (falsy: 是在Boolean上下文中认定可以转换为false的值) 3、转换为Number 方式一: Number('x'),使用方法同toString()函数一样 字符串转数字 字符串转数字: 如果是纯数字的字符串,直接转换为数字 如果字符串中有非数字的内容 则转换为NaN 如果字符串是一个空串或者全是空格的字符串,则转为0 布尔转数字: true转成1,false转成0 null转数字: 结果为0 undefined转数字: 结果为NaN 方式二: parseInt('x,10'),函数解析一个字符串参数,并返回一个指定基数的整数,括号里的10表示10进制,parseInt()可以将一个字符串中的有效的整数内容取出来,然后转换为Number,从左往右读,读到非整数就停止 例子: 读到12.21px时,没有读到小数点后面的数,只取整数部分 方式三: parseFloat('x')函数解析一个字符串参数并返回一个浮点数,parseFloat()作用和parseInt()类似,不同的是他可以获得有效的小数 例子: 方式四: '1' - 0 例子: 方式五: + '1' 例子: 注意:方式1、4、5等价,既可解析整数又可解析小数,但无法解析有非数字字符的字符串。 老司机用法:方式四 内存图 你买一个 8G 的内存条 操作系统开机即占用 512MB Chrome 打开即占用 1G 内存 Chrome 各每个网页分配一定数量的内存 这些内存要分给页面渲染器、网络模块、浏览器外壳和 JS 引擎(V8引擎) JS 引擎将内存分为代码区和数据区 我们只研究数据区 数据区分为 Stack(栈内存) 和 Heap(堆内存) 简单类型的数据直接存在 Stack 里 (number/string/null/undefined/symbol/boolean) 复杂类型的数据是把 Heap 地址存在 Stack 里(Object) 遇到问题就画图,不要分析。 面试题 垃圾回收 总结: 如果一个对象没有被引用 他就是垃圾,将被回收 浅拷贝与深拷贝 浅拷贝是将原始对象中的数据型字段拷贝到新对象中去,将引用型字段的“引用”复制到新对象中去,不把“引用的对象”复制进去,所以原始对象和新对象引用同一对象,新对象中的引用型字段发生变化会导致原始对象中的对应字段也发生变化。 深拷贝是在引用方面不同,深拷贝就是创建一个新的和原始字段的内容相同的字段,是两个一样大的数据段,所以两者的引用是不同的,之后的新对象中的引用型字段发生改变,不会引起原始对象中的字段发生改变。 浅拷贝例子: var a = {name: 'Ming'} var b = a b.name = 'b' a.name === 'b' // true 我们对b做改变,a也改变了 深拷贝例子: var a = {name: 'Ming'} var b = deepClone(a) // deepClone 还不知道怎么实现 b.name = 'b' a.name === 'a' // true 对b做改变,a不影响 笔记内存图解析: (编辑:威海站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |