Skip to content

类型强制转换

1.1 string强制转换为数字

可以用 *1 来转换为数字

也可以用 + 来转化字符串为数字

1.2 object强制转化为string

1.3 使用boolean过滤数组中的所有假值

快速过滤js中的假值: false、null、0、""、undefined、NaN

js
const compact = arr => arr.filter(Boolean)
compact([ /*  */ ])

1.4 双位运算符 ~~

可以使用双位运算符来替代 Math.floor() 双否定位操作符的优势在于执行速度更快

js
Math.floor(4.9) === 4 // true
~~4.9 === 4 // true

对于负数来说,结果与Math.floor() 不同

js
~~-4.5 // -4
Math.floor(-4.5) // -5

1.5 短路运算符

逻辑与&& 与 逻辑或|| 是短路运算符(就是从左到右的运算中前者满足要求,就不再执行后者)

  • && 为取假运算,遇假返假,不再执行,否则返回最后一个真值
  • || 为取真运算,遇真返真,不再执行,否则返回最后一个假值
运算符示例说明
&&expr1 && expr2如果expr1 能转换成false则返回expr1,否则返回expr2. 因此, 在Boolean环境中使用时, 两个操作结果都为true时返回true,否则返回false
``
!!expr如果单个表达式能转换为true的话返回false,否则返回true

因此可以用来给变量赋初值

js
let variable1
let variable2 = variable1 || 'foo'

也可以用来进行简单判断,取代冗长的if

js
let variable = param && param.prop

1.6 取整 | 0

对一个数字 |0 可以取整,负数也同样适用

1.7 判断奇偶数 &1

对一个数字 &1 可以判断奇偶数,负数也适用

js
const num = 3
!!(num & 1) // true
!!(num % 2) // true

函数

2.1 函数默认值

2.2 强制参数

默认情况下,如果不向函数参数传值,那么JS 会将函数参数设置为undefined

js
const mustParam = () => {
  throw new Error('must param')
}
const foo = (bar = mustParam()) => {
  return bar
}

2.3 隐式返回值

返回值是我们通常用来返回函数最终结果的关键字。只有一个语句的箭头函数,可以隐式返回结果(函数必须省略大括号{ },以便省略返回关键字)。

要返回多行语句(例如对象文本),需要使用( )而不是{ }来包裹函数体。这样可以确保代码以单个语句的形式进行求值。

2.4 惰性载入函数

在某个场景下我们的函数中有判断语句,这个判断依据在整个项目运行期间一般不会变化,所以判断分支在整个项目运行期间只会运行某个特定分支,那么就可以考虑惰性载入函数

js
function foo() {
  if (a !== b) {
    console.log('aaa')
  } else {
    console.log('bbb')
  }
}
// 优化后
function foo() {
  if (a !== b) {
    foo = function() {
      console.log('aaa')
    }
  } else {
    foo = function() {
      console.log('bbb')
    }
  }
  return foo()
}

那么第一次运行之后就会覆写这个方法,下一次再运行的时候就不会执行判断了。当然现在只有一个判断,如果判断很多,分支比较复杂,那么节约的资源还是可观的。

2.5 一次性函数

跟上面的惰性载入同理,可以在函数体覆写当前函数,那么可以创建一个一次性的函数,重新赋值之前的代码相当于只运行了一次,适用于运行一些只需要执行一次的初始化代码

js
var sca = function() {
  console.log('msg')
  sca = function() {
    console.log('foo')
  }
}
sca() // msg
sca() // foo

3. 代码复用

3.1 Object[key]

虽然将 foo.bar 写成 foo ['bar'] 是一种常见的做法,但是这种做法构成了编写可重用代码的基础。许多框架使用了这种方法,比如element的表单验证。 请考虑下面这个验证函数的简化示例:

js
function validate(values) {
  if(!values.first)
    return false;
  if(!values.last)
    return false;
  return true;
}
console.log(validate({first:'Bruce',last:'Wayne'})); // true

复制代码上面的函数完美的完成验证工作。但是当有很多表单,则需要应用验证,此时会有不同的字段和规则。如果可以构建一个在运行时配置的通用验证函数,会是一个好选择。

js
// object validation rules
const schema = {
  first: {
    required:true
  },
  last: {
    required:true
  }
}

// universal validation function
const validate = (schema, values) => {
  for(field in schema) {
    if(schema[field].required) {
      if(!values[field]) {
        return false;
      }
    }
  }
  return true;
}
console.log(validate(schema, {first:'Bruce'})); // false
console.log(validate(schema, {first:'Bruce',last:'Wayne'})); // true

复制代码现在有了这个验证函数,我们就可以在所有窗体中重用,而无需为每个窗体编写自定义验证函数。

共 20 个模块,1301 篇 Markdown 文档。