2019-12-11第三章:类型转换

        有关12-10的一点小补充:isNaN()同样适用于对象。其处理时会优先调用valueOf方法,确定其返回值是否可以转换为数字,如果不可以,则调用toString()方法,再对返回值进行判断。

可以发现,哪怕是类的嵌套也是可以识别的

    ⑤ 数值转换。用作数值转换的函数共有三个,Number(),ParseInt(),ParseFloat(),三者使用上有很大差别,依次讨论。

    首先是Number():

    Boolean  ->  0或1;

    数字值  ->  传入传出;

    null  ->  0;

    undefined  ->  NaN;

    字符串:只包含数字时,转化为十进制整型,同时自动忽略前位的0('011' - > 11);包含浮点数时,转化为十进制浮点型;包含十六进制格式时,转化为同等大小的10进制整型('0xA' ->  10);为空字符串时,转化为0;如果字符串中包含除以上的任意格式,返回NaN(例如'?!#@%^@');

    Object:转换规则同上文isNaN();

    其次是ParseInt():

    ParseInt在Number的基础有了一些改进,例如:ParseInt在处理字符串时,会自动过滤字符串的前N位空格,直至找到第一个非空字符,如果第一个字符是数字或负号,ParseInt会继续查看下一位字符,依次推进,这样做的效率很高;因此,ParseInt可以从前缀为若干个空字符的串中提取第一个数字字符串,这一点在工程开发中极为实用:

自动过滤空格

    另外parseInt可以指定转化的进制,其第二个参数可以指定N进制,例如( parseInt(10,10) = 10; parseInt(10,2) = 2),另外,在使用parseInt时,如果不指定参数,一定要小心符合8进制或16进制的字符串被转化为对应进制的数字,引发错误。

3.字符串类型

    ① 字符串基础。在js中,字符串可以使用''或""表示。字符串中有一些典型的转义字符,在js中被称为字符字面量(\n,\r,\t,\\ 等等)。字符串的特点是不可变。一旦被创建,那么他对应的值也就唯一确定,如果我们需要更改一个字符串的值,js所使用的方式是先销毁,后填充的方式:

    var str1 = 'hunterMonster'        //创建一个可以容纳12个字符的字符串

    var str2 = ':world'        //创建一个可以容纳5个字符的字符串

    str1 = str1 + str2        //创建一个可以容纳17个字符的字符串,将str1与str2填充,再销毁str1,再将这个新字符串命名为str1

    ② 字符串的强制类型转换。最常用的是toString()方法,他返回除了null和undefined的任何变量的字符串表示(包括字符串本身也可以使用toString()函数,他返回的是字符串的副本(这是一个深拷贝的过程 ->结果是两个字符串地址不同,但值相同),string()与其类似,但string()同样可以处理null和undefined。

toString转万物

4.Object类型

    ① Object基础。ECMAScript中的对象就是数据与功能的集合,这点和大多数语言并无太多差异。可以使用new操作符来声明创建,在创建时,如果不需要传入参数,可以省略()。

二者完全等价

    在这里必须重新强调一个思想:即javascript中,类是一切。而Object是一切类和实例的基础(可以理解为原型或父类),换句话说,Object拥有的方法和属性毫无疑问地存在于每一个对象中。

    下面简单聊聊Object的方法和属性:

        Constructor:构造函数,保存着创建当前目标所使用的函数,对于Object类来说,就是Object()。

        hasOwnProperty(string propertyName):检查当前Object是否有propertyName这个属性。

        isPropertyOf(Object):检查当前传入的Object是不是当前Object的原型。

        proPertyIsEnumerable(propertyName):检查当前Object是否可以使用for-in循环。

        以及toLocaleString(),toString(),valueOf()三个简单方法,不多赘述。

    值得一提的是,区别{}和Object()的区别?查阅了一些资料,发现写的都非常笼统,大多数答案除了对比了a -- {} 和 b -- new Object() 以及c -- var Obj = function() {}; var c = new Obj();三者的变量创建速度(c > a >> b),并没有更深的解释。之前部门在做code-review的时候曾经有针对java讲过不调用构造函数(方法C)的本质是拷贝,在时间上远优于使用构造函数的常规类构造方法,想必在此也是类似的道理。而c>a的原因还不得而知。

    附上一篇参考帖子:https://www.jianshu.com/p/00bc4f105f7e,有空会再回来看看这个问题。

    另外,操作符中的一元操作符比较简单,位操作符更倾向于底层的二进制计算实现,在工程中使用不多,就不多赘述了。明天从44页,布尔操作符开始学习。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容