[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 악용으로 이어질 수 있습니다.