第3章 原生函数
- 所有typeof返回值为“object”的对象都包含一个内部属性[[Class]],一般用
Object.prototype.toString.call([1,2,3])
可以得到 - valueOf():得到封装对象中的基本类型值
- 不要创建和使用空单元数组,应该要创建
[undefiend,undefiend]
这样的数组 Array.apply(null,{length:3})
创建出[undefiend,undefiend,undefiend]
- 常用的原生函数有:
- String(): 一般不直接使用
- Number():一般不直接使用
- Boolean():一般不直接使用
- Array():尽量不使用,不加new也行
- Object():尽量不使用
- Function():尽量不使用
- RegExp():尽量不使用
- Date():有用
- Error():有用,不加new也行
- Symbol():不能带new
第4章 强制类型转换
- 类型转换:显式将值从一种类型转换为另一种类型,发生在静态类型语言的编译阶段,在代码中就可以看出
- 强制类型转换:隐式将值从一种类型转换为另一种类型,发生在动态类型语言的运行时
ToString
toString
是非字符串到字符串的强制类型转换- 对于普通对象来说,除非自定义,否则toString()返回内部属性[[class]]的值
JSON.stringfy(…)
不是强制类型转换,但是使用到了toString方法
ToNumber
- toPrimitive:对象转换为相应的基本类型值,首先检查valueOf()方法,再使用toString()方法的返回值
ToBoolean
包装了假值的封装对象,强制转换成boolean是true
1
2
3
4var a=new Boolean(false);
var b=new Number(0);
var c=new String("");
var d=Boolean(a&&b&&c); // true假值对象:浏览器在某些特定情况下,在常规JS语法基础上自己创建了一些外来值。比如document.all。假值对象强制类型转换为布尔型的结果为false
真值无限多,记住假值
- undefined
- null
- false
- +0、-0、NaN
- “ “
显式强制类型转换
a.toString()
涉及隐式转换,因为基本类型(比如数字42)没有toString
方法,会先创建一个封装对象,再对该对象调用toString
。显式转换中含有隐式转换。+c
运算符显式将C转换为数字,而非数字加法运算~
按位取反,相当于-(x+1)。只有-1可以让值成为0- 抽象渗漏:
indexOf()>=0或者!=-1
这样的写法不好,在代码中暴露了底层的实现细节。可以使用~indexOf()
只有在结果为-1的时候结果为0 ~~x
和x|0
与Math.floor(..)
效果一样,可以截除数字值的整数部分
显式解析数字字符串
- 解析允许字符串含有非数字字符,解析会从左到右,如果遇到非数字字符就停止:
parseInt
- 转换不允许出现数字字符,否则就失败返回NaN:
Number
显式转换为布尔值
- Boolean(..)和!!,会显式强制类型转换为布尔值
b=a?true:false
在三元运算符中,a进行了隐式强制类型转换,应该使用Boolean(..)或者!!进行显式强制类型转换
隐式强制类型转换
- & 和 || 运算符的返回值并不一定是布尔类型,而是两个操作数其中一个的值。
- 符号类型可以被显式转换成字符串,隐式会报错,不能转换为数字,转换为布尔值为true。
== 和 ===
==允许在相等比较中进行强制类型转换,但是===不允许
1
2
3var x=true;
var y="42";
x==y //false首先toNumber(x)将true转换为1,此时
1===“42”
,两者类型仍然不同,字符串和数字之间比较会把字符串转成数字,即1==42.只有null==undefiend才true,两者之一于其他任何值(0,false,“”)都为false
特别注意:
1
2
3
4[]==0 //true
""==0 //true
"0"==0 //true
[]=="" //true0=="\n" //true
因为””、”\n”、” “等空字符串转换为数字是0