최고의 자바 스크립트 구문 설탕


81

다음은 몇 가지 보석입니다.

리터럴 :

var obj = {}; // Object literal, equivalent to var obj = new Object();
var arr = []; // Array literal, equivalent to var arr = new Array();
var regex = /something/; // Regular expression literal, equivalent to var regex = new RegExp('something');

기본값 :

arg = arg || 'default'; // if arg evaluates to false, use 'default', which is the same as:
arg = !!arg ? arg : 'default';

물론 우리는 익명의 함수를 알고 있지만, 그것들을 리터럴로 취급하고 그 자리에서 (클로저로) 실행할 수 있다는 것은 훌륭합니다.

(function() { ... })(); // Creates an anonymous function and executes it

질문 : 자바 스크립트에서 사용할 수있는 다른 훌륭한 구문 설탕은 무엇입니까?


2
그건 몰랐어 || 기본값 구문. 너무 직관적이지는 않지만 멋지고 컴팩트합니다. (어쩌면 내가 을 볼 수 있지만, 그것을 이해하지 않습니다.)
크리스 노

1
삼항 구문을 파악하기가 훨씬 더 어려웠습니다. 당신이 그것을 몇 번 쓰고 나면 그것은 제 2의 자연처럼 보일 것입니다. 당신이 본 적이있는 곳에서는 jquery.js와 prototype.js 모두 그것을 사용한다고 생각합니다.
눈꺼풀 없음

1
각각의 예를 설명하는 것은 어떻습니까?
pc1oad1etter

2
"arg || 'default'"에 대해 몰랐습니다. 부울 값을 반환 할 것으로 예상하지만 true로 평가되는 첫 번째 값 (왼쪽부터)을 반환합니다 (python과 유사)! "arg = arg? arg : 'default'"보다 훨씬 낫습니다!
Jamol 2009

Chris Noe가이 스레드를 전당했습니다!
Mahesh Velaga 2010

답변:


58

현재 날짜 시간을 밀리 초로 가져옵니다.

Date.now()

예를 들어, 코드 섹션의 실행 시간을 측정하려면 다음을 수행하십시오.

var start = Date.now();
// some code
alert((Date.now() - start) + " ms elapsed");

사실 이것은 최고의 자바 스크립트 구문 설탕입니다. A winnar si yuo.
눈꺼풀 없음

3
OrbMan, 아마도 컨텍스트에 따라 다릅니다. 인수로 전달하면 숫자 나 문자열이 아닌 객체로 강제 변환 될 수 있습니다.이 경우 +는 이미 숫자로 강제 변환했을 것입니다. 실제로 +는 parseInt (value, 10)의 약자로 작동하는 것으로 보입니다.
눈꺼풀

정정 : parseInt (value, 10)과 약간의 차이가 있습니다. 예를 들어, + [3] 및 parseInt ([3], 10)은 모두 숫자 3과 같지만 + [3, 4] == NaN 및 parseInt ([3, 4], 10) == 3.
eyelidlessness

Er ... parseInt (value, 10)의 모든 인스턴스는 parseFloat (value) 여야합니다. 그리고 Chris Noe, 댓글 스팸에 대해 죄송합니다.)
eyelidlessness

1
내 호기심으로 인해 jsperf에서 시도해 보았습니다. 가장 성능이 좋은 것은 표준 getTime () :) (ref. jsperf.com/millisecondsdate )
sirLisko

33

개체 멤버십 테스트 :

var props = {a : 1, b : 2};

(props의 "a") // true
(props의 "b") // true
(props의 "c") // false

그것은 확실히 props.a === undefined 감사보다 더 간결합니다.
눈꺼풀 없음

15
그리고 props = {a : undefined} 인 경우에도 마찬가지입니다.
ephemient

참고-Firefox는 XPCNativeWrapper 개체에서 "in"을 사용하려고 할 때 TypeError를 발생시킵니다. Firefox 4부터는 많은 개체가 래핑됩니다. 그래서 다시 props.a === undefined로 돌아갑니다.
Chris Noe

26

Mozilla (및 IE7)에서는 다음을 사용하여 XML 상수를 만들 수 있습니다.

var xml = <elem> </ elem>;

변수를 대체 할 수도 있습니다.

var elem = "html";
var text = "일부 텍스트";
var xml = <{elem}> {text} </ {elem}>;

정말? 이를 지원하는 다른 엔진이 있습니까?
눈꺼풀 없음

1
궁금한 점이 있습니다. "xml"변수를 만든 후에는 무엇을 할 수 있습니까? 방화범에서 지금 가지고 놀기만하면 메서드 나 속성이없고 DOM에 추가 할 수없는 것처럼 보입니다.
nickf


8
E4X 리터럴은 사이트 간 스크립트 포함 공격으로 인한 보안 재앙이며 "var xml = new XML ( '<elem> </ elem>')"IMO를 말할 수있는 것보다 눈에 띄게 나아지지는 않습니다.
bobince

2
@CharlieSomerville 그건 위험하지 않습니다. E4X는 잠재적으로 '안전한'[X] [HT] ML 파일을 활성 JS로 바꿉니다. 이 문제에 대한 배경 지식은 code.google.com/p/doctype/wiki/ArticleE4XSecurity 를 참조하십시오 .
bobince

26

익명 함수와 클로저를 사용하여 개인 변수 (정보 숨김) 및 관련 get / set 메서드를 만듭니다.

var getter, setter;

(function()
{
   var _privateVar=123;
   getter = function() { return _privateVar; };
   setter = function(v) { _privateVar = v; };
})()

잠시 시간이 걸렸지 만 알았습니다. 이것은 깔끔합니다.
Matt lohkamp

얼마 전에 swfobject 소스를 살펴보면서 비슷한 기술을 발견했습니다. 클로저를 사용하여 개인 변수 / 메소드를 만드는 것은 아마도 생각하지 못했을 것입니다. 멋지네요.
Herms

새로운 JS 버전으로 우리는 더 간단한 것을 사용할 수 있습니다if(true) { let _privateVar=123; }
Kulvar

여기서 "도그 볼"문체의 잠재적 인 문제를 인식하십시오. 참조 : twitter.com/paul_irish/status/176187448420864000?lang=en
Jonathan.Brink

22

프로토 타입 상속을 통해 네이티브 JavaScript 유형을 확장 할 수 있습니다.

String.prototype.isNullOrEmpty = function(input) {
    return input === null || input.length === 0;
}


이것은 사실이지만 for (a in b) 루프를 사용하는 경우에만 해당됩니다. 일반적으로 나는 다른 사람들과 마찬가지로 프레임 워크를 사용합니다. 결과적으로 나는 일반적으로 .each ()
steve_c

그것은 잠재적 인 문제의 경우 어떤 (B의)에 대한 컨테이너가 사용하는 코드. 컨테이너가 브라우저 인 경우 브라우저에서 다른 코드 (예 : 해당 프레임 워크)를 손상시킬 수 있습니다. 나는 그 사람에게 물 들었다.
Chris Noe

네. 좋은 지적이야, 크리스. 나는 여전히 프로토 타입 상속을 JavaScript의 최고의 기능 중 하나로 생각합니다. :)
steve_c

for (var i in obj) {if (! obj.hasOwnProperty (i)) {계속; } ...}
눈꺼풀 없음

21

=== 유형 을 비교하는 데 사용 합니다 .

var i = 0;
var s = "0";

if (i == s) // 참

if (i === s) // 거짓

실제로 완전 동일이라고합니다. 기본적으로 ==를 수행 할 때 발생해야하는 모든 유형 변환을 방지합니다.
olliej

다른 언어 (PHP)도 "ID"검사라고 부릅니다. 즉,이 두 값이 동일 합니까?
nickf

@nickf, 약간 잘못된 이름입니다. $var1 = 'string'; $var2 = 'string'; $var1 === $var2; // true, $var1$var2동일하지 않더라도 (메모리에 동일한 저장된 값에 대한 참조) 동일한 유형 및 동일한 값입니다.
eyelidlessness

@eyelidlessness, 나는 자바 스크립트가 그런 식으로 작동하는지 확신하지 못합니다 ... 문자열은 (보통) 값으로 저장되고 전달됩니다. 그러나 객체는 참조로 저장됩니다 : var1 = {a : 'b'}; var2 = {a : 'b'}; var1 === var2 // false.
nickf

@nickf, 이해합니다. 그러나 PHP 코드에서시길을 제거하고 JavaScript에서 동일한 결과를 얻을 수 있습니다. 이러한 문자열은 동일 하지 않지만 해당 값은 동일 합니다.
눈꺼풀 없음

21

여러 줄 문자열 :

var str = "이것은 \
모두 하나
끈.";

문자열에 공백을 추가하지 않고는 다음 줄을 들여 쓸 수 없기 때문에 사람들은 일반적으로 더하기 연산자로 연결하는 것을 선호합니다. 그러나 이것은 여기 에 좋은 문서 기능을 제공합니다.


2
공정한 경고-\ 뒤에 공백이 있으면 예외가 발생합니다.
Daniel Szabo

21

배열 길이 크기 조정

길이 속성은 읽기 전용이 아닙니다 . 배열의 크기를 늘리거나 줄이는 데 사용할 수 있습니다.

var myArray = [1,2,3];
myArray.length // 3 elements.
myArray.length = 2; //Deletes the last element.
myArray.length = 20 // Adds 18 elements to the array; the elements have the empty value. A sparse array.

1
선생님, 이것이 가장 중요한 답변이 될 것 같습니다. 더 이상 push나를 위해 노래하지 마세요, 헤헤. 무리 감사.
aefxx 2010

4
실제로이 방법을 사용하여 생성 된 요소는 실제로 존재하지 않습니다 (정의되지 않은 값도 없지만 액세스하면 정의되지 않음). for..in을 사용하여 반복 할 수도 없습니다.
yorick

16

빈 배열에서 join 메소드를 활용하여 "-"와 같은 문자열을 특정 횟수만큼 반복 :

var s = new Array(repeat+1).join("-");

repeat == 3이면 "---"가됩니다.


15

기본 연산자와 마찬가지로 ||가드 연산자 &&입니다.

answer = obj && obj.property

반대로

if (obj) {
    answer = obj.property;
}
else {
    answer = null;
}

1
반드시 null. 이것은 obj === null.
pimvdb

1
||와 함께 사용할 수도 있습니다. obj가 전혀 존재하지 않거나 객체가 존재하지만 키 속성이없는 경우 백업을 보장합니다. 이런 식으로 대답은 항상 정의됩니다. answer = (obj && obj.property) || 'backupprop';
Dtipson

13
var tags = {
    name: "Jack",
    location: "USA"
};

"Name: {name}<br>From {location}".replace(/\{(.*?)\}/gim, function(all, match){
    return tags[match];
});

문자열 교체를위한 콜백은 유용합니다.


12

게터 및 세터 :

function Foo(bar)
{
    this._bar = bar;
}

Foo.prototype =
{
    get bar()
    {
        return this._bar;
    },

    set bar(bar)
    {
        this._bar = bar.toUpperCase();
    }
};

우리에게 주어지다:

>>> var myFoo = new Foo("bar");
>>> myFoo.bar
"BAR"
>>> myFoo.bar = "Baz";
>>> myFoo.bar
"BAZ"

예, 제가 사용한 현재 접근 방식보다 조금 더 좋을 것입니다.
Ash

@eyelidlessness는 IE 구현 및 다른 브라우저를 사용할 수있는 인 ECMAScript 5의 Object.defineProperty에 defineGetter을 .
Eli Gray

IE8은 DOM 개체에 대한 getter / setter 만 구현하므로 고유 한 개체 API를 더 깔끔하게 만드는 데는 쓸모가 없습니다. :-/
Jonny Buchanan

5

이것은 자바 스크립트 전용이 아니지만 세 줄의 코드처럼 절약됩니다.

check ? value1 : value2

값을 할당하지 않을 때 이에 상응하는 것이 있습니까 (예 : fnName? fnName : defaultFn;)?
눈꺼풀 없음

1
아니요, 삼항 연산자는 엄격하게 표현식을위한 것입니다. 진술 없음
Josh Hinman

1
다음과 같이 익명 함수를 평가하는 데 사용할 수 있습니다. "var myFunc = (browserIsIE? function () {...} : function () {...})". 개인적으로 꽤 헷갈 리기 때문에 추천하지 않겠지 만 적어도 가능합니다.
nickf

"평가하다"는 이전 댓글에서 가장 좋은 단어가 아닐 것입니다. 음 .. 할당?
nickf

@ 눈꺼풀 없음 : 예 : fnName? fnName () : defaultFn (); // 자체 라인에서 작업
Ates Goral

4

levik의 예에 대해 조금 더 :

var foo = (condition) ? value1 : value2;

4
괄호가 필요하지 않습니다. 삼항 연산자는 다른 많은 언어에도 공통적입니다.
Ates Goral

1
괄호는 조건문에 구문 상 모호성이있을 때 도움이됩니다 (예 :?가 적용되는 조건 문의 구성 요소 결정).
눈꺼풀 없음


4

다음 obj || {default : true} 구문 :

, 하나 개의 매개 변수가 정의되지 않은 경우 안녕하세요 (neededOne && neededTwo && needThree) 또는 (false)를 인사 호출 한 후 거짓이 당신의 함수를 호출 때때로 유용


4

고정 된 구성 요소 부분 집합이있는 구문 분석 상황에서 :

var str = "John Doe";

"파괴 할당"synatx를 사용하여 결과를 변수에 직접 할당 할 수 있습니다.

var [fname, lname] = str.split(" ");
alert(lname + ", " + fname);

다음보다 조금 더 읽기 쉽습니다.

var a = str.split(" ");
alert(a[1] + ", " + a[0]);

번갈아:

var [str, fname, lname] = str.match(/(.*) (.*)/);

이것은 Javascript 1.7 기능입니다. 지금은 Mozilla 2.0+ 및 Chrome 6+ 브라우저입니다.


Safari Javascript 콘솔에서 이것을 시도했는데 구문 분석 오류가 발생합니다.
눈꺼풀 없음 2010 년

Snap, 나는 Firefox에서만 이것을 사용했다고 생각합니다. 브라우저 호환성 참고를 추가했습니다.
Chris Noe

Chrome 6에서는 작동하지 않습니다 SyntaxError: Unexpected token [..
RaYell 2010 년

약간의 연구 결과 크롬 1.7이 완전히 표준이 아니라는 사실이 밝혀지기 시작했습니다. let에도 문제가있는 것으로 알려졌습니다. stackoverflow.com/questions/300185/…
Chris Noe

Chrome 13에서는 여전히 작동하지 않습니다. 이것이 언제 구현 될지에 대한 단서가 있습니까?
pimvdb

3

즉시 호출 된 화살표 기능 :

var test = "hello, world!";
(() => test)(); //returns "hello, world!";


2

간단히 : ({})를 사용하여 익명 개체 리터럴을 만듭니다.

예 : 객체에 valueOf 메소드가 있는지 알아야합니다.

var hasValueOf = !! ({}). valueOf

보너스 구문 설탕 : 이중이 아닌 '!!' 거의 모든 것을 부울로 아주 간결하게 변환합니다.


1

나는 json 문자열을 eval ()하고 완전히 채워진 데이터 구조를 되 찾을 수 있다는 것을 좋아합니다. 나는 모든 것을 적어도 두 번 작성해야하는 것을 싫어한다 (IE의 경우 한 번, Mozilla의 경우 다시).


1

자주 사용되는 키워드 (또는 모든 메서드)를 ths와 같은 간단한 변수로 지정

  var $$ = document.getElementById;

  $$('samText');

3
this값이 손실 되기 때문에 (적어도 Chrome에서는) 작동하지 않습니다 . 대신 document.getElementById.bind(document). bind그것 없이는 단순히 HTMLDocument.prototype.getElementById함수를 할당하고 호출해야 할 정보가 없습니다 document.
pimvdb

1

세미- "유창한 인터페이스"를 제공하는 JavaScript의 Date 클래스. 이로 인해 Date 클래스에서 직접 날짜 부분을 추출 할 수 없습니다.

var today = new Date((new Date()).setHours(0, 0, 0, 0));

다음은 실제로 Date 객체가 아닌 숫자 값만 제공하기 때문에 완전한 Fluent 인터페이스가 아닙니다.

var today = new Date().setHours(0, 0, 0, 0);

1

기본 대체 :

var foo = {}; // empty object literal

alert(foo.bar) // will alert "undefined"

alert(foo.bar || "bar"); // will alert the fallback ("bar")

실제 예 :

// will result in a type error
if (foo.bar.length === 0)

// with a default fallback you are always sure that the length
// property will be available.
if ((foo.bar || "").length === 0) 

1

방금 발견 한 것은 함수를 호출하기 전에 null 확인입니다.

a = b && b.length;

이것은 다음과 같은 더 짧습니다.

a = b ? b.length : null;

가장 좋은 점은 속성 체인을 확인할 수 있다는 것입니다.

a = b && b.c && b.c.length;

1

나는 목록으로 작업하는 것이 얼마나 간단한 지 좋아합니다.

var numberName = ["zero", "one", "two", "three", "four"][number];

그리고 해시 :

var numberValue = {"zero":0, "one":1, "two":2, "three":3, "four":4}[numberName];

대부분의 다른 언어에서 이것은 상당히 무거운 코드입니다. 값 기본값도 아름답습니다. 예를 들어 오류 코드보고 :

var errorDesc = {301: "Moved Permanently",
                 404: "Resource not found",
                 503: "Server down"
                }[errorNo] || "An unknown error has occurred";

굉장해 보입니다. 이것의 기술적 이름은 무엇입니까?
TrySpace

0

int to string cast

var i = 12;
var s = i+"";

3
이것은 직선적 인 i.toString () 또는 String (i)을 수행하는 것보다 나에게 더 "당연한"것처럼 보이지 않습니다. Short! = 설탕.
Ates Goral

0
element.innerHTML = "";  // Replaces body of HTML element with an empty string.

요소의 모든 자식 노드를 삭제하는 바로 가기입니다.


6
그것은 실제로 Javascript가 아니며 DOM이며 현재는 표준이 아닙니다.
눈꺼풀 없음

0

불가능한 경우 문자열을 정수로 기본 0으로 변환합니다.

0 | "3" //result = 3
0 | "some string" -> //result = 0
0 | "0" -> 0 //result = 0

경우에 따라 유용 할 수 있습니다. 대부분 0이 나쁜 결과로 간주 될 때


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.