第 50 题:实现 (5).add(3).minus(2) 功能

发布于 2022-07-27 15:59:49 字数 426 浏览 635 评论 8

Number.prototype.add = function(n) {
  return this.valueOf() + n;
};
Number.prototype.minus = function(n) {
  return this.valueOf() - n;
};

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(8

落叶缤纷 2022-05-04 13:56:36
let myFun = {
    add(number) {
        if (typeof number !== 'number') {
            throw new Error('请输入数字')
    	}
    	return this + number
    },
    minus(number) {
        if (typeof number !== 'number') {
            throw new Error('请输入数字')
    	}
    	return this - number
    }
}

// 挂载到原型上
Object.assign(Number.prototype, myFun)

;(5).add(3).minus(2)
// 6

让一让,我分享一个比较简便、便于维护的方法。

岛歌少女 2022-05-04 13:55:58
Number.prototype.add = function(num) {
	return this + num;
};
Number.prototype.minus = function(num) {
	return this - num;
}
未央 2022-05-04 13:55:44
// 辅助函数当然也可以写到方法里去,但是要重复写
// get decimal places
const getDeimalPlaces = (num) => {
	const _num = parseFloat(num);
	if (Number.isNaN(_num)) {
		throw('This is not a Number!');
	}
	const _strArr = _num.toString().split('.');
	
	return _strArr.length > 1 ? _strArr[1].length : 0;
}

const getMaxDecimalPlaces = (x, y) => Math.max(getDeimalPlaces(x), getDeimalPlaces(y));

const calculateFloatSafely = (num, decimalPlaces) => parseFloat(num.toFixed(decimalPlaces));

Number.prototype.add = function (num) {
	const DECIMAL_PLACES = getMaxDecimalPlaces(this, num);
	return calculateFloatSafely((this + num), DECIMAL_PLACES);
}

Number.prototype.minus = function (num) {
	const DECIMAL_PLACES = getMaxDecimalPlaces(this, num);
	return calculateFloatSafely((this - num), DECIMAL_PLACES);
}

// usage
console.log((5).add(3).minus(2)); // 6
console.log((5.08).add(3.12).minus(2.1)); // 6.1
console.log((10.021).add(3.58).minus(2.102));// 11.499
蛮可爱 2022-05-04 13:51:56
Number.prototype.add = function (number) {
    if (typeof number !== 'number') {
        throw new Error('请输入数字~');
    }
    return this + number;
};
Number.prototype.minus = function (number) {
    if (typeof number !== 'number') {
        throw new Error('请输入数字~');
    }
    return this - number;
};
console.log((5).add(3).minus(2));

扩展

Object.prototype.add
Object.prototype.minus 

也是可以的

这个方法,可以扩展到数字字符串类型和排除 NaN

Number.prototype.add = function (value) {
    let  number = parseFloat(value);
    if (typeof number !== 'number' || Number.isNaN(number)) {
        throw new Error('请输入数字或者数字字符串~');
    };
    return this + number;
};
Number.prototype.minus = function (value) {
    let  number = parseFloat(value);
    if (typeof number !== 'number' || Number.isNaN(number)) {
        throw new Error('请输入数字或者数字字符串~');
    }
    return this - number;
};
console.log((5).add(3).minus(2));

对于在 Object 上添加原型方法是不建议的,因为这个影响太大,会影响所有以Object 构造的对象

function MyNumber(){
MyNumber.prototype= new Number().__proto__
MyNumber.prototype.add =  function (number) {
    if (typeof number !== 'number') {
        throw new Error('请输入数字~');
    }
    return this + number;
};
}
当梦初醒 2022-05-04 13:02:13

首先看到题干第一反应和楼上几位一样,链式操作+给Number/Object对象添加方法。

Number.prototype.add = function(i=0){
	return this.valueOf()+i
}
Number.prototype.minus = function(i=0){
	return this.valueOf()-i
}

不知道是否是考虑的不周全,就仔细想想,感觉会有一些好玩的知识点在里面,就做了一些小实验。
在 Chrome 的 DevTools 里,我们可以做这个实验:

这里问题就来了——JS的经典的浮点数陷阱。
在简单地搜索之后,我在 GitHub 上搜到了一位阿里大佬的解法,然后参考了一下他的解法和楼上大佬们的解法,对我上面的答案进行了如下修正:

Number.MAX_SAFE_DIGITS = Number.MAX_SAFE_INTEGER.toString().length-2
Number.prototype.digits = function(){
	let result = (this.valueOf().toString().split('.')[1] || '').length
	return result > Number.MAX_SAFE_DIGITS ? Number.MAX_SAFE_DIGITS : result
}
Number.prototype.add = function(i=0){
	if (typeof i !== 'number') {
        	throw new Error('请输入正确的数字');
    	}
	const v = this.valueOf();
	const thisDigits = this.digits();
	const iDigits = i.digits();
	const baseNum = Math.pow(10, Math.max(thisDigits, iDigits));
	const result = (v * baseNum + i * baseNum) / baseNum;
	if(result>0){ return result > Number.MAX_SAFE_INTEGER ? Number.MAX_SAFE_INTEGER : result }
	else{ return result < Number.MIN_SAFE_INTEGER ? Number.MIN_SAFE_INTEGER : result }
}
Number.prototype.minus = function(i=0){
	if (typeof i !== 'number') {
        	throw new Error('请输入正确的数字');
    	}
	const v = this.valueOf();
	const thisDigits = this.digits();
	const iDigits = i.digits();
	const baseNum = Math.pow(10, Math.max(thisDigits, iDigits));
	const result = (v * baseNum - i * baseNum) / baseNum;
	if(result>0){ return result > Number.MAX_SAFE_INTEGER ? Number.MAX_SAFE_INTEGER : result }
	else{ return result < Number.MIN_SAFE_INTEGER ? Number.MIN_SAFE_INTEGER : result }
}

【大数加减:直接通过 Number 原生的安全极值来进行判断,超出则直接取安全极值】
【超级多位数的小数加减:取JS安全极值位数-2作为最高兼容小数位数】

这样就能相对比较完善地解决这个问题了~希望大家多多补充

与酒说心事 2022-05-04 10:06:03
Number.prototype.add = function (number) {
    if (typeof number !== 'number') {
        throw new Error('请输入数字~');
    }
    return this + number;
};
Number.prototype.minus = function (number) {
    if (typeof number !== 'number') {
        throw new Error('请输入数字~');
    }
    return this - number;
};
console.log((5).add(3).minus(2));

扩展

Object.prototype.add
Object.prototype.minus 

也是可以的

这个方法,可以扩展到数字字符串类型和排除 NaN

Number.prototype.add = function (value) {
    let  number = parseFloat(value);
    if (typeof number !== 'number' || Number.isNaN(number)) {
        throw new Error('请输入数字或者数字字符串~');
    };
    return this + number;
};
Number.prototype.minus = function (value) {
    let  number = parseFloat(value);
    if (typeof number !== 'number' || Number.isNaN(number)) {
        throw new Error('请输入数字或者数字字符串~');
    }
    return this - number;
};
console.log((5).add(3).minus(2));

对于在 Object 上添加原型方法是不建议的,因为这个影响太大,会影响所有以Object 构造的对象

陌生。 2022-05-02 04:03:44
Number.prototype.add =  function(n){
  return this + n
}
Number.prototype.minus =  function(n){
  return this - n
}
console.log((5).add(3).minus(2))//6
烧了回忆取暖 2022-04-30 07:44:24
Number.prototype.add = function (number) {
    if (typeof number !== 'number') {
        throw new Error('请输入数字~');
    }
    return this + number;
};
Number.prototype.minus = function (number) {
    if (typeof number !== 'number') {
        throw new Error('请输入数字~');
    }
    return this - number;
};
console.log((5).add(3).minus(2));

扩展

Object.prototype.add
Object.prototype.minus 

也是可以的

~没有更多了~

关于作者

半边脸i

暂无简介

0 文章
0 评论
22 人气
更多

推荐作者

1CH1MKgiKxn9p

文章 0 评论 0

ゞ记忆︶ㄣ

文章 0 评论 0

JackDx

文章 0 评论 0

信远

文章 0 评论 0

yaoduoduo1995

文章 0 评论 0

霞映澄塘

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文