문제

나는 왜 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 물체:

  1. 숫자가 아닌 사람에게도 효과가 있습니다. Math.round("5") 작동하는 동안 value.round() 값이 문자열 인 경우 작동하지 않습니다 (예 : 텍스트 상자의 값)
  2. 수학 개체의 일부 구성원은 "기본"숫자 값에 속하지 않습니다. Math.min() 또는 Math.max(). 아니면 당신은 그것을 사용하고 싶습니까? a.max(b)?
  3. 다른 회원은 글로벌이며 전문 번호에 속하지 않습니다. 예는 상수입니다 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());
};

https://www.w3schools.com/jsref/jsref_prototyp_num.asp

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top