2
var obj = [ "one", "two", "three"];

$.each(obj, function() {
   console.log(this);
});

私が得る出力は

{ '0': 'o', '1': 'n', '2': 'e' }
{ '0': 't', '1': 'w', '2': 'o' }
{ '0': 't', '1': 'h', '2': 'r', '3': 'e', '4': 'e' }

「1」「2」「3」になると思いますが、次のような奇妙な結果が出ます。誰でも説明できますか?

4

6 に答える 6

5

this常にそこにあるオブジェクトです。文字列オブジェクトは、キーと値のペアで構成されます。キーはインデックスであり、値は文字列内のそのインデックスの文字です。Object("foo")そのようなオブジェクトを自分で作成してみてください。

厳密モードを使用すると、次のことを抑制できます。

$.each(obj, function() {
  "use strict";
  console.log(this);
});
于 2012-08-17T14:39:43.467 に答える
4

javascript(jQueryだけでなく)ではthis、現在のスコープにバインドされたオブジェクトを参照する特別なキーワードです(変更されていない場合)。関数内$.eachで、ループ関数(渡す関数)のスコープコンテキストは、ループしているアイテムにバインドされます。それは事実かもしれませんが、それは信頼できず、非常に有用でも興味深いものでもありません。

観察:

var clams = { 'tomato!':'gross' };
var items = ["one", "two", "three"];


$.each(items, function (index, item) {
    console.log('this',this);
    console.log('item', item);    
}.bind(clams));

試してみてください:http://jsfiddle.net/LBfet/

thisループ内で使用することは可能ですが$.each、ドキュメントが提供する方法で使用することをお勧めします。つまり、ループ関数は署名をサポートしますcallback(indexInArray, valueOfElement)

ドキュメント:http ://api.jquery.com/jQuery.each/

それを癖だと考えてください。

もっと読む

于 2012-08-17T14:51:11.097 に答える
2

ここで起こっていることは、jQueryがコールバック内の.call値をに設定するために使用していることです。this$.each

.call呼び出されると、の値がthisオブジェクトに変換されます(JavaScript仕様:http ://es5.github.com/#x10.4.3に従って)。

これは、jQueryドキュメントにも記載されています:http://api.jquery.com/jQuery.each/

値にはキーワードを使用してアクセスすることもできますthisが、Javascriptは、単純な文字列または数値であっても、常にthis値をオブジェクトとしてラップします。

「厳密モード」(これは最新のWebブラウザーでのみ機能し、IEでは機能しません:http://caniuse.com/#feat=use-strict)は実際にこの動作を変更しthis、プリミティブにすることができます(これは仕様に記載されています:http://es5.github.com/#x15.3.4.4):

$.each(obj, function() {
  "use strict";
  console.log(this);
});

.valueOf()オブジェクトをそれぞれのプリミティブに変換するために使用することもできます。

$.each(obj, function() {
  console.log(this.valueOf());
});
于 2012-08-17T15:00:34.483 に答える
1

基本に至るまで、javascript文字列はオブジェクトです。このオブジェクトは、文字の配列に分解されます。これが、配列のような文字列オブジェクトで同じ関数のいくつかを呼び出すことができる理由です。

この場合、文字列リテラルを操作するたびに、文字列オブジェクトに変更されます。文字列オブジェクトは文字の配列です。これにより、toUpperCase()やtoLowerCase()などの関数を使用するときに簡単に大文字化できます- (他の関数と一緒に)

this他の人が述べているように、を使用することはオブジェクトとして参照されます。文字列が配列にどのように似ているかを示すための小さなテストコードを次に示します。

var testStr = "test";
var obj = [ "one", "two", "three"];
console.log(testStr.charAt[1]); // Will return 'e'
console.log(testStr[1]); // Will return 'e'
console.log(obj[1]); // Will return 'two'
console.log(testStr.length) // Will return 4
console.log(obj.length) // Will return 3

の場合の文字列リテラルは、var testStr = "string"関数のないプリミティブデータ型です。ただし、文字列オブジェクトは、関数および非プリミティブデータ型でデータを操作するために使用されます。

次に、文字列オブジェクトを作成してコンソールに出力します (これは、文字列リテラルを操作すると発生し、文字列オブジェクトに変換されます)

strTest = new String("TEST String");
console.log(strTest);

あなたが得るでしょう:

String
0: "T"
1: "E"
2: "S"
3: "T"
4: " "
5: "S"
6: "t"
7: "r"
8: "i"
9: "n"
10: "g"
length: 11
__proto__: String
    anchor: function anchor() { [native code] }
    big: function big() { [native code] }
    blink: function blink() { [native code] }
    bold: function bold() { [native code] }
    camelCase: function (){return this.replace(/-\D/g,function(match){return match.charAt(1).toUpperCase();});}
    capitalize: function (){return this.replace(/\b[a-z]/g,function(match){return match.toUpperCase();});}
    charAt: function charAt() { [native code] }
    charCodeAt: function charCodeAt() { [native code] }
    checkAllAvailableTags: function (){var b=this,d;for(d in c)c.hasOwnProperty(d)&&(b=b.replace(d,c[d]));return b}
    clean: function (){return this.replace(/\s{2,}/g,' ').trim();}
    concat: function concat() { [native code] }
    constructor: function String() { [native code] }
    contains: function (string,s){return(s)?(s+this+s).indexOf(s+string+s)>-1:this.indexOf(string)>-1;}
    escapeRegExp: function (){return this.replace(/([.*+?^${}()|[\]\/\\])/g,'\\$1');}
    fixed: function fixed() { [native code] }
    fontcolor: function fontcolor() { [native code] }
    fontsize: function fontsize() { [native code] }
    hexToRgb: function (array){var hex=this.match(/^#?(\w{1,2})(\w{1,2})(\w{1,2})$/);return(hex)?hex.slice(1).hexToRgb(array):false;}
    hyphenate: function (){return this.replace(/\w[A-Z]/g,function(match){return(match.charAt(0)+'-'+match.charAt(1).toLowerCase());});}
    indexOf: function indexOf() { [native code] }
    italics: function italics() { [native code] }
    lastIndexOf: function lastIndexOf() { [native code] }
    length: 0
    link: function link() { [native code] }
    localeCompare: function localeCompare() { [native code] }
    match: function match() { [native code] }
    replace: function replace() { [native code] }
    rgbToHex: function (array){var rgb=this.match(/\d{1,3}/g);return(rgb)?rgb.rgbToHex(array):false;}
    search: function search() { [native code] }
    slice: function slice() { [native code] }
    small: function small() { [native code] }
    split: function split() { [native code] }
    strike: function strike() { [native code] }
    sub: function sub() { [native code] }
    substr: function substr() { [native code] }
    substring: function substring() { [native code] }
    sup: function sup() { [native code] }
    test: function (regex,params){return(($type(regex)=='string')?new RegExp(regex,params):regex).test(this);}
    toFloat: function (){return parseFloat(this);}
    toInt: function (){return parseInt(this,10);}
    toLocaleLowerCase: function toLocaleLowerCase() { [native code] }
    toLocaleUpperCase: function toLocaleUpperCase() { [native code] }
    toLowerCase: function toLowerCase() { [native code] }
    toString: function toString() { [native code] }
    toUpperCase: function toUpperCase() { [native code] }
    trim: function trim() { [native code] }
    trimLeft: function trimLeft() { [native code] }
    trimRight: function trimRight() { [native code] }
    valueOf: function valueOf() { [native code] }
    __proto__: Object
于 2012-08-17T14:50:30.243 に答える
0

これオブジェクトであるため、toStringメソッドを使用してその内容を出力できます。

$.each( obj, function() {
    console.log( this.toString() );
});
于 2012-08-17T14:52:36.910 に答える
0

出力が何であるか:pimvdbが言うように:これはオブジェクトへのポインターです。jQueryは、匿名関数をコールバックとして各値に適用します。その値がオブジェクトでない場合、jQはそれを1つにします。したがって、3つのオブジェクトがログに記録されます。

それに加えて、コンピューターにとって、文字列は対処するのが最も難しいものの1つです。これは単なる一連の文字(配列)です。そのため、Cや他の多くの言語では、文字列タイプは存在しません(存在しませんでした)。文字列は配列であり、配列はJavaScriptの拡張オブジェクトであるため(最初のバージョンには配列さえありませんでした)、取得した出力が得られます。
ただし、それほど大きな問題ではありません。

obj = [ "one", "two", "three"];

$.each(obj, function()
{
   console.log(this+'');
});

これを(ある程度)解決します。しかし、追加するtypeof thisと、それがまだオブジェクトであることがわかります。追加するとthis instanceof String、trueになります。それらの厄介な文字列オブジェクト(それらは厄介です)を取り除き、きれいな文字列定数を取得するには:

obj = [ "one", "two", "three"];

$.each(obj, function(i,el) {
   console.log(el);
});

これで、関数をメソッドとして適用する代わりに、jQはキーと値のペアを引数として渡します。ここで、iはキー、vは値です。

于 2012-08-17T14:52:41.107 に答える