undefined
和 null
undefined
是JavaScript语言本身分配的,如果一个变量还没有被初始化,那么他的值就是undefined
null
是被开发者用来明确指出某个值是缺失的,例如,对于JSON.stringify()
如果需要知道变量
x
是否有值,通常情况下,你需要同时,校验undefined
和null
。12345678910111213if (x != null) {// 有值的操作 (false, -0, +0, NaN)都被认为是有值} else {// 没有值时,执行的操作}```相等于```javascriptif (v !== undefined && v!== null) {// 有值} else {// 没值}另外一种逻辑
12345if (x == null) {// 没值} else {// 有值}
隐式类型转换
0. 提要
- 自动转换为布尔值通常不会引起问题,而且往往很有用
1. 隐式转换为布尔: “ truthy ” 和 “ falsy ”
- 当JavaScript需要一个布尔值时(
if
语句),会触发隐式转换为布尔值,Boolean() - 算法
- 下面这些值将被转换为false
- undefined, null
- Boolea: false
- Number: -0, +0, NaN
- String: ‘’
- 其他值都被认为是
true
- 下面这些值将被转换为false
2. 字符串的隐式转换
- 加运算符
+
,当其中一个操作数是字符串的时候,就会执行拼接字符串的操作
3. 对象的隐式转换
- 只有在 JavaScript 表达式或语句需要用到数字或字符串时,对象才被隐式转换。
- 需要转换为数字时
- 调用
valueOf()
,如果结果是原始值,则将其转换为一个数字 - 否则,调用
toString()
方法,如果结果时原始值,则将其转换为一个数字 - 否则,抛出一个类型错误
- 调用
- 需要转换为字符串的时候
- 上面的算法,第一步与第二步调换。
- 需要转换为数字时
参数的处理
- 可以传递任意的参数
- 缺失参数的值是undefined
- 多出来的参数则被直接忽略掉
- ES6: 参数默认值
- ES6: 不定参数,必须在最后一个
- 所有传递的参数都储存在一个特别的,类数组对象 arguments中
判断参数是否传递了?
一个不严谨的方法
1234567function hasParameter (param) {if (param) {return 'yse'} else {return 'no'}}这个情况,对于虚拟值(falsy)的运用是非法的,比如false、0以及空字符串都会被解析为缺失参数
- 仅仅判断undefined 1234567function hasParameter (param) {if (typeof param !== undefined) {return 'yes'} else {return 'no'}}
参数默认值ES5实现
简单版,传递虚拟值(falsy): false、0 、空字符等同于没传递,将会使用默认值
12345function plus (x, y) {x = x || 1y = y || 1return x * y}严谨版,
typeof x === undefined
强制执行一定数量的参数
- 通过
arguments.length
验证12345678function add (x, y) {if (arguments.length > 2) {throw new Error('Need at most 2 parameter')} else if ( arguments.length < 2) {throw new Error('Need at least 2 parameter')}return x + y}
- 通过
arguments 不是 array
- arguments 并不是 array,它只是像array,暂且知道两点方法像array
- 获取第i个参数,argument[i]
- argument.length
- 转换函数 123function fromArray (arrayLikeValue) {return Array.prototype.slice.call(arrayLikeValue)}
- arguments 并不是 array,它只是像array,暂且知道两点方法像array
函数参数的个数
- 函数直接传入参数是最常见的
- 不过如果参数个数太多。程序的可读性就下降了,调用起来也麻烦 – 比如记不清每个位置的参数含义,记不清顺序等。
- 通常函数参数的个数不应该超过4个。
- 如果有更多的配置需求呢?把多个参数合成为一组配置,以单一参数传递,JS中就是对象
object