Mongoose源码分析(类型转换部分)

Mongoose源码

Mongoose的底层是javaScript写的,javaScript只有一种数字类型Number,可以是整数或是小数,所以Mongoose也一样

number部分:

这部分是Number对不同类型转化为number的处理过程

Mongoose它是对Node原生的MongoDB模块进行的进一步的优化封装

Mongoose数据类型和MongoDB数据类型的转换在Node原生的MonogDB模块中完成

源码部分:

'use strict';
​
const assert = require('assert');
​
/*!
 * Given a value, cast it to a number, or throw a `CastError` if the value
 * cannot be casted. `null` and `undefined` are considered valid.
 *
 * @param {Any} value
 * @param {String} [path] optional the path to set on the CastError
 * @return {Boolean|null|undefined}
 * @throws {Error} if `value` is not one of the allowed values
 * @api private
 */
​
module.exports = function castNumber(val) {
  if (val == null) {
    return val;
  }
  if (val === '') {
    return null;
  }
​
  if (typeof val === 'string' || typeof val === 'boolean') {
    val = Number(val);
  }
​
  assert.ok(!isNaN(val));
  if (val instanceof Number) {
    return val.valueOf();
  }
  if (typeof val === 'number') {
    return val;
  }
  if (!Array.isArray(val) && typeof val.valueOf === 'function') {
    return Number(val.valueOf());
  }
  if (val.toString && !Array.isArray(val) && val.toString() == Number(val)) {
    return Number(val);
  }
​
  assert.ok(false);
};
  1. NaN属性代表非数字值,用于表示某个值不是数字。isNaN()函数来判断一个值是否是NaN值。

  2. Number()函数是JavaScript自带的函数,可把对象的值转换为数字,如无法转换,返回NaN。

  3. assert.ok(表达式,字符串),断言,用于验证,如果表达式结果为false会报出后面的错误,程序中断,为true则不会发生事件。

  4. typeof+变量,返回对量的类型;instanceof,同样可以返回类型,但可以返回引用对象的类型,typeof不行

  5. valueOf(),返回对象的原始值,属于Object对象,由于所有对象都继承了Object,所以都有,类似于toString()

  6. Array.isArray(),检测传递的值是否是Array类型

分析:

if (val == null) {
    return val;
  }

传入的值如果是null,直接返回null,退出函数

if (val === '') {
    return null;
  }

如果是空字符串,也直接返回null,退出函数

if (typeof val === 'string' || typeof val === 'boolean') {
    val = Number(val);
  }

如果传入值的类型是string或者boolean,用Number()函数来转换成数字类型

assert.ok(!isNaN(val));

通过断言判断经过转换后的参数val是否是数字类型,如不是则报错

if (val instanceof Number) {
    return val.valueOf();
  }

如果val是引用对象,类型是Number,返回val的原始值

f (typeof val === 'number') {
    return val;
  }

如果val是Number,返回val

if (!Array.isArray(val) && typeof val.valueOf === 'function') {
    return Number(val.valueOf());
  }

如果val不是数组并且val的原始值的类型是函数,返回val原始值的数字化

  if (val.toString && !Array.isArray(val) && val.toString() == Number(val)) {
    return Number(val);
  }

如果val可以化为字符串并且不是数组并且字符串化后的值和数字化后相等,返回数字化后的val

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值