.join ()이 함수 인수와 함께 작동하지 않는 이유는 무엇입니까?
이것이 작동하는 이유 ( "one, two, three"반환) :
var words = ['one', 'two', 'three'];
$("#main").append('<p>' + words.join(", ") + '</p>');
이 작업 ( "목록 : 111"반환) :
var displayIt = function() {
return 'the list: ' + arguments[0];
}
$("#main").append('<p>' + displayIt('111', '222', '333') + '</p>');
그러나 이것은 아닙니다 (공백을 반환합니다) :
var displayIt = function() {
return 'the list: ' + arguments.join(",");
}
$("#main").append('<p>' + displayIt('111', '222', '333') + '</p>');
.join ()을 사용하려면 내 "인수"변수를 어떻게해야합니까?
arguments
개체가 배열이 아니기 때문에 작동하지 않습니다 . join
방법 이 없습니다 .
>>> var d = function() { return '[' + arguments.join(",") + ']'; }
>>> d("a", "b", "c")
TypeError: arguments.join is not a function
arguments
배열 로 변환하려면 다음을 수행하십시오.
var args = Array.prototype.slice.call(arguments);
이제 join
작동합니다.
>>> var d = function() {
var args = Array.prototype.slice.call(arguments);
return '[' + args.join(",") + ']';
}
>>> d("a", "b", "c");
"[a,b,c]"
또는 makeArray
"거의 배열" arguments
을 배열로 바꾸려고 시도하는 jQuery의를 사용할 수 있습니다 .
var args = $.makeArray(arguments);
다음은 Mozilla 참조 (이런 종류에 대해 제가 가장 좋아하는 리소스)가 이에 대해 말하는 내용입니다.
arguments
객체 배열 아니다. 배열과 유사하지만을 제외한 배열 속성이 없습니다length
. 예를 들어 pop 메서드가 없습니다. ...
arguments
객체는 함수 본문 내에서 사용할 수 있습니다. 함수 선언 외부에서 arguments 객체에 액세스하려고하면 오류가 발생합니다.
다른 Array.prototype
메서드 에 관심이없고 단순히를 사용하려는 join
경우 배열로 변환하지 않고 직접 호출 할 수 있습니다.
var displayIt = function() {
return 'the list: ' + Array.prototype.join.call(arguments, ',');
};
또한 구분 기호를 정의하지 않으면 사양에 따라 쉼표가 사용됩니다.
jQuery 유틸리티 기능을 사용하십시오. makeArray
arguments
배열이 아니라 객체입니다. 그러나 "배열과 유사"하기 때문에 jQuery 유틸리티 함수 makeArray
를 호출하여 작동 시킬 수 있습니다.
var displayIt = function() {
return 'the list: ' + $.makeArray(arguments).join(",");
}
$("#main").append('<p>' + displayIt('111', '222', '333') + '</p>');
다음을 출력합니다.
<p>the list: 111,222,333</p>
이 jQuery .joinObj 확장 / 플러그인을 사용할 수 있습니다 .
그 바이올린에서 볼 수 있듯이 다음과 같이 사용할 수 있습니다.
$.joinObj(args, ",");
또는
$.(args).joinObj(",");
플러그인 코드 :
(function(c){c.joinObj||(c.extend({joinObj:function(a,d){var b="";if("string"===typeof d)for(x in a)switch(typeof a[x]){case "function":break;case "object":var e=c.joinObj(a[x],d);e!=__proto__&&(b+=""!=b?d+e:e);break;default:"selector"!=x&&"context"!=x&&"length"!=x&&"jquery"!=x&&(b+=""!=b?d+a[x]:a[x])}return b}}),c.fn.extend({joinObj:function(a){return"object"===typeof this&&"string"===typeof a?c.joinObj(this,a):c(this)}}))})(jQuery);
typeof를 사용하여 여기서 무슨 일이 일어나는지 볼 수 있습니다.
>>> typeof(['one', 'two', 'three'])
"object"
>>> typeof(['one', 'two', 'three'].join)
"function"
>>> typeof(arguments)
"object"
>>> typeof(arguments.join)
"undefined"
여기서 typeof는 두 경우 모두 "object"를 반환하지만 객체 중 하나에 만 결합 함수가 정의되어 있음을 알 수 있습니다.
arguments
jQuery 객체가 아니라 일반 JavaScript 객체입니다. 전화하기 전에 연장하십시오 .join()
. 나는 당신이 쓸 것이라고 생각합니다.
return 'the list:' + $(arguments)[0];
(저는 jQuery에 너무 익숙하지 않고 Prototype에만 익숙하므로 이것이 완전히 가짜가 아니기를 바랍니다.)
편집 : 틀 렸습니다! 그러나 그의 대답에서 Doug Neiner는 내가 성취하려는 것을 설명합니다.
I don't know if there's a simple way to convert arguments into an array, but you can try this:
var toreturn = "the list:";
for(i = 0; i < arguments.length; i++)
{
if(i != 0) { toreturn += ", "; }
toreturn += arguments[i];
}
At the moment you can't join array arguments, because they aren't an array, shown here
so you have to either first turn them into an array like this,
function f() {
var args = Array.prototype.slice.call(arguments, f.length);
return 'the list: ' + args.join(',');
}
or like this, a bit shorter
function displayIt() {
return 'the list: ' + [].join.call(arguments, ',');
}
if you are using something like babel or a compatible browser to use es6 features, you can also do this using rest arguments.
function displayIt(...args) {
return 'the list: ' + args.join(',');
}
displayIt('111', '222', '333');
which would let you do even cooler stuff like
function displayIt(start, glue, ...args) {
return start + args.join(glue);
}
displayIt('the start: ', '111', '222', '333', ',');
참고URL : https://stackoverflow.com/questions/2091138/why-doesnt-join-work-with-function-arguments
'Programing' 카테고리의 다른 글
표현 트리의 실제 사용 (0) | 2020.11.15 |
---|---|
registerNatives () 메소드는 무엇을합니까? (0) | 2020.11.15 |
인라인 vs __inline vs __inline__ vs __forceinline? (0) | 2020.11.15 |
Android SQLite의 "_id"필드 정보 (0) | 2020.11.15 |
Apache에서 기본적으로 Perfect Forward Secrecy를 활성화하려면 어떻게해야합니까? (0) | 2020.11.15 |