programing

작동하지 않는 자바스크립트 규칙은 무엇입니까?

closeapi 2023. 10. 3. 09:21
반응형

작동하지 않는 자바스크립트 규칙은 무엇입니까?

작동하지 않는 자바스크립트 규칙은 무엇입니까?처럼.pass지휘.

  • 하나의 빈 입니다입니다.function() {}
  • 는 jQuery를 합니다.$.noop()빈입니다라고 .
  • 됩니까 ?false아니면0?

문맥상...Chrome에서 오류가 발생하지 않으면서 다음과 같은 모든 작업을 수행합니다.

var a = 2;
(a === 1) ? alert(1) : function() {};
(a === 1) ? alert(1) : $.noop();
(a === 1) ? alert(1) : false;
(a === 1) ? alert(1) : 0;

편집: 많은 사람들이 "이러지 마!"라고 대답했습니다.코드 구조를 바꿉니다!"누군가가 브라우저의 냄새를 맡는 방법을 물었던 게시물이 생각납니다.그는 "절대 그러지 마세요! 사악해요"라는 글을 받았지만, 아무도 그에게 브라우저 냄새를 맡는 방법을 알려주지 않았습니다.코드 리뷰가 아닙니다.변경할 수 없는 레거시 코드를 다루고 있으며, 일부 기능이 전달되지 않으면 오류가 발생한다고 상상해 보십시오.아니면, 단순히 고객이 원하는 방식이고, 그들은 나에게 돈을 지불합니다.그러니 정중히 질문에 대답해 주시기 바랍니다.자바스크립트에서 "동작 없음" 함수를 지정하는 가장 좋은 방법은 무엇입니까?

EDIT2: 이것들 중 하나는 어떻습니까?

true;
false;
0;
1;
null;

원래 질문에 답하자면 순수 자바스크립트에서 가장 우아하고 깔끔한 noop 기능 구현은 Function.prototype입니다.그 이유는:

  1. function.prototype은 다음과 같은 기능입니다.

typeof Function.prototype === "function" // returns true

  1. 함수로 호출할 수 있으며 여기에 나와 있는 것처럼 기본적으로 아무 것도 하지 않습니다.
setTimeout(function() {
      console.log('Start: ', Date.now());
      Function.prototype();
      console.log('End  : ', Date.now());
    }, 1000);

대부분의 브라우저가 이러한 방식으로 정의된 눕을 실행하는 데 아무런 도움이 되지 않는 것처럼 보이기 때문에(따라서 CPU 사이클을 절약하는 것), 이와 관련된 성능 문제가 있을 수 있습니다(다른 사용자가 주석이나 다른 답변에서도 언급한 바와 같이).

하지만 실제로 많은 라이브러리와 프레임워크에서 noop 기능을 쉽게 정의할 수 있습니다.다음은 몇 가지 예입니다.

var noop = function () {};           // Define your own noop in ES3 or ES5
const noop = () => {};               // Define in ES6 as Lambda (arrow function)
setTimeout(noop, 10000);             // Using the predefined noop

setTimeout(function () {} , 10000);  // Using directly in ES3 or ES5
setTimeout(() => {} , 10000);        // Using directly in ES6 as Lambda (arrow function)

setTimeout(angular.noop, 10000);     // Using with AngularJS 1.x
setTimeout(jQuery.noop, 10000);      // Using with jQuery

다음은 noop 기능(또는 관련 토론 또는 구글 검색)의 다양한 구현의 알파벳순 목록입니다.

AngularJS 1.x, Angular 2+ (네이티브 구현이 없는 것처럼 보임 - 위와 같이 자신의 것을 사용함), 엠버, jQuery, 로다시, 노드JS, 람다, React (네이티브 구현이 없는 것처럼 보임 - 위와 같이 자신의 것을 사용함), RxJS, 밑줄

요약: 함수.prototype이 자바스크립트로 누프를 표현하는 우아한 방법이긴 하지만 사용과 관련된 성능 문제가 있을 수 있습니다.따라서 (위에 표시된 것처럼) 자신의 것을 정의하고 사용하거나 코드에서 사용할 수 있는 라이브러리/프레임워크에 의해 정의된 것을 사용할 수 있습니다.

가장 간결하고 성능이 뛰어난 누프는 빈 화살표 함수입니다.()=>{}.

화살표 기능은 IE를 제외한 모든 브라우저에서 기본적으로 작동합니다(필요한 경우 바벨 변환이 있습니다).


()=>{}Function.Prototype

  • ()=>{}보다 87%빠릅니다.Function.prototype크롬 67에서.
  • ()=>{}보다 25% 빠릅니다.Function.prototype파이어폭스 60에서.
  • ()=>{}보다 85% 더 빠릅니다.Function.prototype엣지(2018년 6월 15일)에서.
  • ()=>{}보다 65% 적은 코드입니다.Function.prototype.

하여 됩니다.Function.prototype는 확실한 입니다:입니다.

const noop = ()=>{};
const noopProto = Function.prototype;

function test (_noop, iterations) {
    const before = performance.now();
    for(let i = 0; i < iterations; i++) _noop();
    const after = performance.now();
    const elapsed = after - before;
    console.info(`${elapsed.toFixed(4)}MS\t${_noop.toString().replace('\n', '')}\tISNOOP? ${_noop() === undefined}`);
    return elapsed;
}

const iterations = 10000000
console.info(`noop time for ${iterations.toLocaleString()} iterations`)
const timings = {
    noop: test(noop, iterations),
    noopProto: test(noopProto, iterations)
}

const percentFaster = ((timings.noopProto - timings.noop)/timings.noopProto).toLocaleString("en-us", { style: "percent" });
console.info(`()=>{} is ${percentFaster} faster than Function.prototype in the current browser!`)

당신이 여기서 성취하는 경향은 무엇이든 잘못된 것입니다.3개의 표현식은 표현식에만 사용되어서는 안 되며, 따라서 질문에 대한 답은 다음과 같습니다.

당신이 제안한 것 중 어떤 것도 하지 않습니다. 대신에:

var a = 2;
if (a === 1)
    alert(1)
// else do nothing!

그러면 코드는 쉽게 이해할 수 있고, 읽을 수 있으며, 얻을 수 있는 만큼 효율적입니다.

단순할 수 있는데 왜 더 어렵게 만드나요?

편집:

그렇다면 "무작위" 명령어는 기본적으로 하위 코드 구조를 나타내는 것입니까?

당신은 내 요점을 놓치고 있습니다.은 모두 입니다에 입니다.x ? y : z.

그러나 자바스크립트와 같은 상위 언어에서는 어떤 동작 명령도 의미가 없습니다.

일반적으로 어셈블리나 C와 같은 하위 수준의 언어에서는 타이밍 목적으로 하나의 명령에 대해 프로세서가 아무것도 하지 않도록 하는 방법으로 사용됩니다.

JS 를 을 하든지.0;,null;,function () {};또는 빈 문장을 읽을 때 해석자가 무시할 가능성이 높지만, 해석되기 에 결국에는 프로그램이 매우 적은 시간만큼 더 느리게 로딩되도록 만들 수 있습니다.Nota Bene:저는 널리 사용되는 JS 통역사에 관여하지 않고, 통역사마다 각자의 전략을 가지고 있을 가능성이 있기 때문에 이를 전제로 합니다.

에는 같은 좀 더 $.noop()아니면var foo = function () {}; foo()몇몇 쓸모없는 을 할 수 .

다음과 같은 기능이 보이는 유일한 이유는$.noop()존재할 것이고, 콜백 기능을 호출할 수 없는 경우 예외가 발생하는 이벤트 함수에 콜백 기능을 여전히 제공할 수 있습니다.하지만 그 다음에, 그것은 당신이 반드시 제공해야 할 기능이고, 그것을 제공하는 것입니다.noop이름은 좋은 아이디어이므로 독자들에게 의도적으로 빈 기능을 제공한다고 말하는 것입니다(그리고 6개월 후에는 독자 분일지도 모릅니다).

결국 '열등'이나 '우등' 코드 구조는 존재하지 않습니다.도구를 사용하는 방식이 맞거나 틀립니다.예를 들어 삼원계를 사용하는 것은 나사를 조이고 싶을 때 망치를 사용하는 것과 같습니다.효과는 있겠지만, 그 나사에 뭔가 걸 수 있을지는 확신할 수 없을 겁니다.

"열등" 또는 "우등"으로 간주될 수 있는 것은 코드에 입력하는 알고리즘과 아이디어입니다.하지만 그건 또 다른 일입니다.

사용에 따른 문제나 성능 저하는 전혀 없습니다.Function.prototype위에() => {}.

의 주된 이점은Function.prototype는 매번 새로운 익명 함수를 다시 defining하는 것이 아니라 싱글톤 함수를 가지고 있습니다.노옵을 사용하는 것이 특히 중요합니다.Function.prototype기본값을 정의하고 메모할 때 변경되지 않는 일관된 객체 포인터를 제공합니다.

제가 추천하는 이유는Function.prototype보다는Function그들이 같지 않기 때문입니다.

Function() === Function()
// false

Function.prototype() === Function.prototype()
// true

또한 다른 답변의 벤치마크는 오해의 소지가 있습니다.실은.Function.prototype보다 빠른 수행() => {}벤치마크를 작성하고 실행하는 방법에 따라 다음을 수행할 수 있습니다.

JS 벤치마크를 신뢰할 수 없습니다 << 이 질문에 대해 벤치마크를 구체적으로 언급합니다.

벤치마크에서 코드를 스타일화하지 말고, 유지보수가 가능한 것은 무엇이든 하고, 통역사가 장기적으로 최적화하는 방법을 알아내도록 하세요.

제 생각엔 jQuery.noop()는 주로 요청한 기능을 사용할 수 없을 때 기본 기능을 제공하여 코드가 충돌하는 것을 방지하기 위한 것입니다.예를 들어, 다음 코드 샘플을 고려하면,$.noop만약에 선택됩니다.fakeFunction정의되지 않아 에 대한 다음 호출이 금지됩니다.fn충돌로부터:

var fn = fakeFunction || $.noop;
fn() // no crash

그리고나서,noop()코드의 모든 곳에 동일한 빈 함수를 여러 번 쓰지 않도록 하여 메모리를 절약할 수 있습니다.그나저나.$.noop보다 조금 짧습니다.function(){}(토큰당 6바이트 절약).그래서 당신의 코드와 빈 함수 패턴 사이에는 아무런 관계가 없습니다. 사용하세요.null,false아니면0당신이 원한다면, 당신의 경우에는 부작용이 없을 것입니다.게다가 이 암호는...

true/false ? alert('boo') : function(){};

... 전혀 쓸모가 없어요 함수를 부르지 않을 테니까요 그리고 이건...

true/false ? alert('boo') : $.noop();

... empty function을 호출하면 더 쓸모가 없습니다. 그것은 ...와 정확히 같습니다.

true/false ? alert('boo') : undefined;

의 3개의 3개의 if얼마나 쓸모가 없는지 확인하는 진술:

if (true/false) {
    alert('boo');
} else {
    $.noop(); // returns undefined which goes nowhere
}

간단히 다음과 같이 적을 수 있습니다.

if (true/false) alert('boo');

또는 더 짧은 경우:

true/false && alert('boo');

마지막으로 질문에 답하자면, 제 생각에 "통상적인 수술 금지"는 결코 작성되지 않은 수술인 것 같습니다.

사용 용도:

 (0); // nop

이 실행의 실행 시간을 테스트하려면 다음과 같이 하십시오.

console.time("mark");
(0); // nop
console.timeEnd("mark");

결과 : 표시 : 0.000ms

으로.Boolean( 10 > 9)다로 할 수 있습니다.( 10 > 9)를) 반환합니다.true해 냈는데 했던 것입니다.(0);입니다.false이할 수 것처럼 만 하면 됩니다. , .

> var a = (0);
< undefined
> a
< 0

함수 호출을 포함하여 조건부로 식을 실행하는 간결한 방법이 필요합니까? (아니요, 필요 없습니다.)

true && expression // or `expression()`

부작용이 없는 유효하고 명확한 표현이 필요하십니까?

const noop = () => {}
if (true) noop()

부작용 없이 유효하고 호출할 수 없는 표현이 필요합니까?

void 0;
false;
0;

언급URL : https://stackoverflow.com/questions/21634886/what-is-the-javascript-convention-for-no-operation

반응형