Programing

.join ()이 함수 인수와 함께 작동하지 않는 이유는 무엇입니까?

lottogame 2020. 11. 15. 10:50
반응형

.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"를 반환하지만 객체 중 하나에 만 결합 함수가 정의되어 있음을 알 수 있습니다.


argumentsjQuery 객체가 아니라 일반 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

반응형