-
Notifications
You must be signed in to change notification settings - Fork 3.3k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
第 50 题:实现 (5).add(3).minus(2) 功能 #88
Comments
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 也是可以的 |
Number.prototype.add = function(n){
return this + n
}
Number.prototype.minus = function(n){
return this - n
}
console.log((5).add(3).minus(2))//6 |
这个方法,可以扩展到数字字符串类型和排除 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)); 对于在 |
首先看到题干第一反应和楼上几位一样,链式操作+给Number/Object对象添加方法。 Number.prototype.add = function(i=0){
return this.valueOf()+i
}
Number.prototype.minus = function(i=0){
return this.valueOf()-i
} 不知道是否是考虑的不周全,就仔细想想,感觉会有一些好玩的知识点在里面,就做了一些小实验。 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 原生的安全极值来进行判断,超出则直接取安全极值】 这样就能相对比较完善地解决这个问题了~希望大家多多补充 |
function MyNumber(){
MyNumber.prototype= new Number().__proto__
MyNumber.prototype.add = function (number) {
if (typeof number !== 'number') {
throw new Error('请输入数字~');
}
return this + number;
};
} |
|
Number.prototype.add = function(num) {
return this + num;
};
Number.prototype.minus = function(num) {
return this - num;
} |
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 让一让,我分享一个比较简便、便于维护的方法。🙈 不过望大佬指出不同意见,本人小白一个 |
Function.prototype.method = function (name, fn) { |
Number.prototype.add=function(x){ return this+x} |
Number.prototype.add = function (num) {
return this + num
}
Number.prototype.minus = function (num) {
return this - num
}
console.log((5).add(3).minus(2)) // 6 |
我的一个疑惑
上面代码中,调用方法之所以写成8['add'],而不是8.add,是因为数值后面的点,会被解释为小数点,而不是点运算符。 将数值放在圆括号中,数字就会自动转化为基本包装类型,就可以使用点运算符调用方法了。 |
|
Number.prototype.add = function(num) {
return this + num
}
Number.prototype.minus = function(num) {
return this - num
} 5.add(3)报错,因为js引擎将5.识别为一个数字,一个数字+add(3)报错。 |
5..add(3)就可以了 |
~function () {
function verify(n) {
n = Number(n)
return isNaN(n) ? 0 : n;
}
function add(n) {
n = verify(n)
return this + n;
}
function minus(n) {
n = verify(n)
return this - n;
}
["add", "minus"].forEach(item => {
Number.prototype[item] = eval(item)
})
}()
(5).add(2).minus(3) // 4 |
例: 5 + 3 - 2,结果为 6 |
Number.prototype.add = function(i = 0){
return parseFloat((this + i).toPrecision(12))
}
Number.prototype.minus = function(i = 0){
return parseFloat((this - i).toPrecision(12))
}
2.1.minus(1.9) // 0.2 |
思路:将 Number.prototype.add = function(num) {
return Number(this + num)
}
Number.prototype.minus = function(num) {
return Number(this - num)
} |
牛皮 |
Number.prototype.add = function(n){return this.toString()*1 + n} |
你这和调用valueOf有啥区别... |
想问下,(5)为啥就变成Number Object了,真的有点好奇js那是怎么处理的 |
|
Number.prototype.add = function (val) {
return this + val
}
Number.prototype.minus = function (val) {
return this - val
} |
|
看到其他答案,都改number 原型链,就不怕该出bug啊。这可是动了基本类型啊。。 |
|
您的来信已收到,我会尽快回复,谢谢
|
The text was updated successfully, but these errors were encountered: