[javascript] JavaScript의 숨겨진 기능? [닫은]

모든 프로그래머가 알아야 할 JavaScript의 “숨겨진 기능”은 무엇입니까?

다음 질문에 대한 답변의 우수한 품질을 본 후 JavaScript를 요청할 때가되었다고 생각했습니다.

자바 스크립트가 현재 가장 중요한 클라이언트 측 언어 임에도 불구하고 (Google에 물어보기 만해도) 대부분의 웹 개발자가 얼마나 강력한 지 알고있는 것은 놀라운 일입니다.



답변

함수에 매개 변수를 정의 할 필요는 없습니다. 함수의 arguments배열과 같은 객체를 사용할 수 있습니다 .

function sum() {
    var retval = 0;
    for (var i = 0, len = arguments.length; i < len; ++i) {
        retval += arguments[i];
    }
    return retval;
}

sum(1, 2, 3) // returns 6


답변

Douglas Crockford의 훌륭한 책 JavaScript : The Good Parts 의 대부분을 인용 할 수 있습니다
. 있습니다.

하지만, 당신을 위해 하나 할게요 항상 사용 ===하고 !==대신 ==하고!=

alert('' == '0'); //false
alert(0 == ''); // true
alert(0 =='0'); // true

==전이되지 않습니다. 사용 ===하면 예상대로 이러한 모든 진술에 대해 거짓을 줄 것입니다.


답변

함수는 JavaScript에서 일류 시민입니다.

var passFunAndApply = function (fn,x,y,z) { return fn(x,y,z); };

var sum = function(x,y,z) {
  return x+y+z;
};

alert( passFunAndApply(sum,3,4,5) ); // 12

함수형 프로그래밍 기술을 사용하여 우아한 자바 스크립트 작성 .

특히 함수는 매개 변수로 전달 될 수 있습니다. 예를 들어 Array.filter () 는 콜백을 허용합니다.

[1, 2, -1].filter(function(element, index, array) { return element > 0 });
// -> [1,2]

특정 함수의 범위 내에서만 존재하는 “비공개”함수를 선언 할 수도 있습니다.

function PrintName() {
    var privateFunction = function() { return "Steve"; };
    return privateFunction();
}


답변

in 연산자를 사용하여 객체에 키가 있는지 확인할 수 있습니다 .

var x = 1;
var y = 3;
var list = {0:0, 1:0, 2:0};
x in list; //true
y in list; //false
1 in list; //true
y in {3:0, 4:0, 5:0}; //true

객체 리터럴이 너무 추한 경우이를 매개 변수가없는 함수 팁과 결합 할 수 있습니다.

function list()
 { var x = {};
   for(var i=0; i < arguments.length; ++i) x[arguments[i]] = 0;
   return x
 }

 5 in list(1,2,3,4,5) //true


답변

변수에 기본값 지정

||대입 식에서 논리 또는 연산자 를 사용하여 기본값을 제공 할 수 있습니다 .

var a = b || c;

a변수의 값을 얻을 것이다 c경우 만 b입니다 falsy (경우 null, false, undefined, 0, empty string, 또는 NaN), 그렇지 않은 경우 a의 값을 얻을 것이다b .

이것은 제공되지 않는 경우 인수에 기본값을 지정하려는 경우 함수에서 유용합니다.

function example(arg1) {
  arg1 || (arg1 = 'default value');
}

이벤트 핸들러의 IE 대체 예 :

function onClick(e) {
    e || (e = window.event);
}

다음과 같은 언어 기능이 오랫동안 우리와 함께 있었으며 모든 JavaScript 구현이이를 지원하지만 ECMAScript 5th Edition 까지는 사양의 일부가 아닙니다 .

debugger

설명 : § 12.15 디버거 문

이 문장을 사용하면 다음 과 같이 코드에 프로그래밍 방식 으로 중단 점 을 넣을 수 있습니다 .

// ...
debugger;
// ...

디버거가 있거나 활성 상태이면 해당 줄에서 바로 중단됩니다.

그렇지 않으면 디버거가 없거나 활성화되어 있으면이 명령문은 관찰 가능한 효과가 없습니다.

여러 줄 문자열 리터럴

설명 : § 7.8.4 문자열 리터럴

var str = "This is a \
really, really \
long line!";

당신은 조심해야 캐릭터 때문에 옆에 \ 있어야 당신은 뒤에 공백이있는 경우, 라인 종결 될 \예를 들어, 코드는 것 보면 정확히 같은,하지만이 인상됩니다 SyntaxError.


답변

JavaScript에는 블록 범위가 없습니다 (하지만 클로저가 있으므로 호출해도됩니까?).

var x = 1;
{
   var x = 2;
}
alert(x); // outputs 2


답변

[]대신에 객체 속성에 액세스 할 수 있습니다.

이를 통해 변수와 일치하는 속성을 찾을 수 있습니다.

obj = {a:"test"};
var propname = "a";
var b = obj[propname];  // "test"

이 이름을 사용하여 이름이 유효한 식별자가 아닌 객체 속성을 가져 오거나 설정할 수 있습니다.

obj["class"] = "test";  // class is a reserved word; obj.class would be illegal.
obj["two words"] = "test2"; // using dot operator not possible with the space.

어떤 사람들은 이것을 알고 사용하게하지 평가 () A는이 같은, 정말 나쁜 생각을 :

var propname = "a";
var a = eval("obj." + propname);

이것은 읽기가 어렵고 (jslint를 사용할 수 없음) 오류를 찾기가 어렵고 실행 속도가 느리고 XSS 악용으로 이어질 수 있습니다.