有关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。
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页,布尔操作符开始学习。