확장 번호. 자바 스크립트 및 수학 객체의 프로토 타입?
-
05-07-2019 - |
문제
나는 왜 JavaScript가 숫자를 자신의 방법을 제공하는 대신 글로벌 수학 객체를 가지고 있는지 항상 궁금했습니다. 좋은 이유가 있습니까?
또한 이와 같은 일을하는 것에 대한 단점 (효율성 이외)이 있습니까? :
Number.prototype.round = function(){
return Math.round(this);
};
명확하게하기 위해, 나는 π와 같은 상수가 어딘가에 필요하고 Min/Max와 같은 하나 이상의 숫자에 적용되는 기능이 필요하다는 것을 이해합니다. 문제는 주로 라운드, 복근, 죄, Pow 등과 같은 단일 숫자에만 영향을 미치는 방법에 관한 것입니다.
해결책
그 이유 Math
객체는 간단합니다. "Java가 그렇게하기 때문에". 최선의 이유는 아니지만 여기에 있습니다. Douglas Crockford가 언어의 절반을 억제하기위한 캠페인을 시작하기 전에 그 당시에는 상황이 더 의미가 있다고 생각합니다. 원래 당신은 다음과 같은 일을하기 위해 "허용"되었거나 의미했습니다.
with (Math) {
var n = min( round(a) * round(b), sqrt(c) );
var result = exp( n + d );
}
확장 단점 Number.prototype
다른 사람도 같은 일을 할 수 있다는 것입니다. 예를 들어, 정의 Number.prototype.round
A로 대칭 반올림 함수.
인생을 더 편하게 만들 수있는 방법을 찾고 있다면 왜 거기서 멈춰야합니까? 단순히 포함하지 마십시오 Math
글로벌 기능으로 기능합니까?
var m = 'abs acos asin atan atan2 ceil cos exp floor log max min ' +
'pow random round sin sqrt tan PI').split(' ');
for (var i=0,l=m.length; i<l; i++) {
window[ m[i] ] = Math[ m[i] ];
}
이렇게하면 모든 수학 기능이 글로벌 범위로 삭제되어 "수학"입력을 효과적으로 중지 할 수 있습니다. 스스로에게 물어보세요 : 확장 사이의 진정한 차이가 있습니까? Number
그리고 확장 window
이 기능으로?
* 당신이 나를 화염시키기 전에 : Crockford 의견은 너무 심각하게 받아 들여지지 않습니다. 나는 그에게 동의합니다 with
암시 적 세계 환경에서 매우 위험합니다.
다른 팁
확장에는 단점이 없습니다 Number.prototype
다른 사람들을 혼란스럽게하는 것 외에. 점은 무엇인가? 사용하는 데 더 나은 것은 무엇입니까? value.round()
대신에 Math.round(value)
?
몇 가지 이유가 있습니다 Math
물체:
- 숫자가 아닌 사람에게도 효과가 있습니다.
Math.round("5")
작동하는 동안value.round()
값이 문자열 인 경우 작동하지 않습니다 (예 : 텍스트 상자의 값) - 수학 개체의 일부 구성원은 "기본"숫자 값에 속하지 않습니다.
Math.min()
또는Math.max()
. 아니면 당신은 그것을 사용하고 싶습니까?a.max(b)
? - 다른 회원은 글로벌이며 전문 번호에 속하지 않습니다. 예는 상수입니다
Math.PI
또는 기능Math.random()
.
시도해보십시오 123.round();
JavaScript 콘솔은 눈에 수백 가지 오류를 던질 것입니다 : P, Nah ...
넌 할 수있어:
Number.prototype.x
그 다음에: (123).x();
그러나 결코 123.x();
수학이 숫자 세트 이상이라고 생각합니다. 사용이 더 넓습니다. 숫자 variable.pi를 사용하면 혼란 스러울 수 있습니다. 임의의 숫자 생성과 동일합니다.
또한 연장 숫자는 JS 특성의 일부이기 때문에 확장 숫자가 괜찮다고 생각합니다. 내가 여기서 틀렸다면 누군가가 나를 교정 할 것입니다.
숫자의 프로토 타입 기능이 다른 모든 객체의 프로토 타입 기능과 마찬가지로 작동하기 때문에 이런 식으로 부르는 것도 다음과 같이 작동한다고 생각합니다.
5.5["round"]();
//should return 6
따라서 좋은 생각이든 옆에 있지 않은지에 대한 대화는 이것을 잘 할 수 있습니다.
123.x ()를 수행 할 수 있지만 JS의 통역사가 고장났습니다 (DOT를 메시지 디스패치로 해석하지 않으므로).
이상하게도 123 .x () (숫자와 점 사이의 공간이있는)를 대신 사용할 수 있습니다. 대신 작동합니다.
123 .. 작동하지만 효과적으로 소수점을 만들고 파견하기 때문입니다.
(유형 123.) === '번호') // true
노력하다:
숫자 .prototype.times = function (기타) {return this * other}; 3.times (5);
콘솔에서.
이에 대한 내 견해는 기본 기능을 덮어 쓰지 않도록 적절한 확인을 수행하면 기본 이름 지정 표준을 이해하고 코드를보다 읽기 쉽고 관리 할 수있게하여 코드를 편안하고 편리하게 만듭니다.
if (Number.prototype.round == null)
Number.prototype.round = function() { return Math.round(this); }
이것을 사용하는 것에 관해서는 JavaScript의 특성 때문에 이것을하는 가장 좋은 방법은 다음과 같습니다.
- 단순한 정적 값 대신 변수로 숫자를 래핑합니다 (대부분 경우)
- nnum.round ();
- 간단한 정적 값을 괄호 안에 래핑 :
- (123) .round ();
- 사각형 브래킷 표기법을 사용하여 호출
- 123 [ "라운드"]. 전화 ();
당신은 이것을 할 수 있습니다
Number.prototype.round = function() {
return Math.round(this.valueOf());
};