ここで重要なのは、jQueryメソッドの連鎖性です。セレクターが何にも一致しない場合、 jQueryメソッドはundefined
チェーンを切断するため、戻りません。検討:
$( '#doesntExist' ).addClass( 'foo' ).fadeIn();
何にも一致しないセレクターが返される場合、独自のメソッドがないundefined
ため、チェーンが切断されます。undefined
これで、要素が見つかったかどうかに関係なく、すべてのメソッドが実行されます(そして何もしません)。
.val()
一方、要素の値を返すことが目的であるため、異なります。他の多くのjQueryメソッドとは異なり、チェーンすることはできません。これは、メソッドがチェーンできるようにするには、jQueryオブジェクトを返す必要があるためです。たとえば、要素が存在する$( '#foo' ).val().addClass( 'bar' )
かどうかに関係なく機能しません。#foo
この観点から.val()
、空の文字列を返すと、チェーン可能なメソッドと一致しなくなります。要素が見つからない場合、他のメソッドが空の文字列を返すことはなく、undefinedを返すと、メソッドがチェーン可能性を壊さないためです。そもそもチェーン。
(ちなみに、.css()
andなどの値を返すすべてのメソッドについても同じことが言えます.data()
。)
通常、要素の値が空であるか、要素がまったく存在しないかを知る方が便利ですが、常に文字列を取得したい場合は、独自のメソッドを追加できます。
$.fn.stringVal = function() {
return( this.val() || '' );
};