16

私は今混乱しています!JavaScriptの演算子。私の理解は!演算子はブール値でのみ動作します。しかし、私の回答の1つに対するコメントは、それは何でも動作し、ブール値を返すと言っています。これは、いくつかのテストを行った後にたまたま真実でした。

alert(!undefined); //true
alert(!function(){}); //false
alert(!{}); //false
alert(!null); //true
alert(!()); //crash
alert(!"false"); //false
alert(!false)​;​​​​​​​​​​​​ //true​​​​​​​​​​​​​​​​​​

誰かが私がの振る舞いを一般化するのを手伝ってもらえますか?オペレーター。

編集

さらに紛らわしいもの:

​alert( new String() == ""); //true
alert(!""); //true
alert(! new String()); //false

どのように?</ p>

4

5 に答える 5

20

!true から false に、またはその逆に変わります。奇妙な動作は、Javascript が文字どおり何かをtrueorに変換する方法に関係していますfalse

http://11heavens.com/falsy-and-truthy-in-javascript

C と同様に (さらに悪いことに)、すべての値を true または false に昇格できます。必要なグーグル用語は、「真実」と「虚偽」、または「真実」と「虚偽」です。Truthy は何かが true に変換されることを意味し、falsy は何かが false に変換されることを意味します。nullundefined0""NaN、および...を除くすべての値は真です。false

このリンクには、より楽しい例があります。

http://www.sitepoint.com/javascript-truthy-falsy/

そして、このサイトは、ここで面白い動作で病理学的なことをするのが本当に好きです:

http://wtfjs.com

==また、物事を比較可能にするために本当に懸命に努力しているのに対し、比較可能でない場合は===ただ返すことに注意してくださいfalse。Crockford in Javascript: The Good Parts==は、完全に使用しないことを推奨しています。

于 2012-05-22T21:58:35.500 に答える
8

これは、javascript に含まれ!ているものと含まれていないものの関数としての関数ではありません。trueキャスト (変数を特定の型に強制すること) に精通している場合は、次のことがかなり明確になるはずです。

!ブール値でのみ動作します。したがって、ブール値ではない変数に適用すると、適用する前にまずブール値に強制されます!。これをあなたの例に関連付けるには:

Boolean(undefined) == false 

undefined は、javascript の null のようなものです (いくつかの違いがありますが、それは別のトピックです)。ブール値が であることは理にかなっているはずですfalseundefined値が存在しないだけでなく、使用しようとしている変数が存在しないことを宣言します。

Boolean(function(){}) == true

関数は JavaScript のオブジェクトです。空の場合でも、関数オブジェクトに共通の基本的なプロパティがいくつかあるため、そのブール値はtrueです。それは何もないので、それは何かです。

Boolean({}) == true

空の関数と同様に、{}空のオブジェクトを定義します。ただし、javascript のオブジェクトに共通のプロパティがまだいくつかあります。カスタム プロパティはありません。

Boolean(null) == false

について述べたようにundefinednullは似ていますが、まったく同じではありません。値がないことを示します。

Boolean(()) // error

()それ自体では特に意味はありません。構文を正しくするためにそれらの間に何かが必要なので、これはあなたの偽/真の質問には関係ありません。()単独では、単なる構文エラーです。

Boolean("false") == true

"false"は文字列です。文字 f、a、l、s、e が含まれているからといって、ブール値と同じにはなりませんfalse。空でない文字列は何かであるため、 Boolean に強制されtrueます。文字列は、空の文字列が""強制的に変換されるが、前述のようにfalse空のオブジェクトが強制的に変換されるという点で、一種の特別なオブジェクトであることに注意してください。{}true

ブール値 (false) == false

これは明確なはずです。 falseはすでにブール値であるため、キャストしても値は変わりません。まだfalseです。

!そこから、各ケースに適用すると、どのように結果が得られるかがわかります。

さらに読むために、これはjavascriptの型強制に関するかなり良い記事です

アップデート:

あなたのString質問に関して。Stringオブジェクトと文字列リテラル (引用符で囲まれたもの) には違いがあります。文字列リテラルからオブジェクトを作成できますStringが、リテラルは自動的にオブジェクトにはなりません。同じことがJavaScriptの数字にも当てはまります。JS にはNumberオブジェクトがありますが、数値リテラルを定義することがよくあります。の動作は、Numberで見たものと一致していますString

alert( new Number() == 0); //true
alert(!0); //true
alert(! new Number()); //false

ただし、コメントで鋭く言及したように:

alert( new String() === ""); //false

タイプが同じではないため。オブジェクト対リテラル。

一般に、Boolean(some_object)常に評価されtrueますが、正確な値によってはBoolean(some_literal)false と評価される場合があります。

補遺

今週初めに足を撃ったという理由だけで、これは追加するのに役立つ情報になると思いました. ほとんどの言語では、空の配列 は[]強制的に に変換されfalseます。ただし、Javascript では配列はオブジェクトであるため、空の配列であってもtrue. 気をつけたい一台。js とさまざまなサーバー側言語を切り替えるときif(!maybe_empty_array){...}maybe_empty_array常にtrue. 代わりに、 を実行する必要がありますif(maybe_empty_array.length){...}。配列が空の場合、その長さは 0 であり、安全にfalse.

于 2012-05-22T22:11:04.833 に答える
5

「! 演算子の動作を一般化するのを誰か手伝ってくれませんか?」

もちろん。単一のオペランドを true に変換できる場合は false を返します。それ以外の場合は true を返します。

すべてのオブジェクト (「空の」オブジェクト、{}、または関数を含む)、空でない文字列、およびゼロ以外の数値はすべて true に変換できます。一方、null、未定義、空の文字列、ゼロはすべて false に変換されます。演算子は!反対を返すため、質問に表示される結果になります。

于 2012-05-22T22:03:24.250 に答える
3

! 単一のオペランドを true に変換できる場合、またはブール値以外の場合は false を返します。

!(x == y)
!"something" 

オペランドを false に変換できる場合は true:

!(x > y)
于 2012-05-22T22:02:53.363 に答える
0

これよりも一般化された説明を書くのは難しいでしょう:

var arr = [0, "", false, null, undefined, NaN];

for(var i = 0; i < 6; i++){
    console.log(!(arr[i]));//always true
}

他の値は生成されますfalse

于 2012-05-22T22:51:57.597 に答える