2017-06-24 7 views
-5
  1. 私は両方ともログインしましたが、同じ結果が返されましたが、少し差が である必要があります。
+0

なぜ違いが見込まれますか?あなたが何かについて混乱しているなら...理由を説明してください – charlietfl

+0

これには((typeof name!= "undefined")&& (typeof name.valueOf()== "string")&& (name.length> 0)) 1つ私はvalueOf()を削除し、結果は同じであり、私はそれについて無力でした。 –

答えて

1

いいえ、誰かがJavaScript環境に何か愚かなことをしない限り、違いはありません。

"andrei"は文字列プリミティブであるため、 typeof "andrei""string"です。 "andrei".valueOf()を実行している場合は、文字列プリミティブを Stringオブジェクト(理論*)に強制しています。そのオブジェクトのプロパティにアクセスしているため( valueOf)、そのオブジェクトのプリミティブ値  —がプリミティブな文字列ですしたがって、 typeof "andrei".valueOf()"string"です。

もちろん、String.prototype.valueOfを、番号やオブジェクトなどを返すことでString.prototype.valueOf契約を破ったデフォルト以外のものに置き換えることができます。しかし、それは奇妙な土地にあります。 「理論的に」


*

- JavaScriptエンジンは、操作は物事が仕様に応じていないように動作せない最適化を提供し、最適化するのは自由です。したがって、JavaScriptエンジンは .valueOf()を文字列プリミティブに呼び出すことを最適化することができます。 String.prototype.valueOfはプリミティブと同じ結果になるため、デフォルト値(エンジンが容易に認識できる)と同じです。私は彼らが を行うかどうかわからない、を行うことができます。この1 I deleted valueOf()と結果は同じだったと私はそのことについてcouriousた中

if((typeof name !="undefined") && (typeof name.valueOf()=="string") && (name.length>0)) 

:質問に対するあなたのコメントを再


Ah!これは、2つの理由のために、さまざまなことだ:

  1. nameが文字列ではないかもしれません。物事の多くはlengthプロパティ  —文字列、関数、基本的な配列、配列を入力、DOMのコレクションを持って、スクリプトに定義されたオブジェクトの任意の数の...

  2. nameStringオブジェクト(それはそうだが、人々かもしれString.prototypeの拡張メソッドを記述しない限り、通常Stringオブジェクトを使用しないでください。この場合、thisStringオブジェクトを参照します)。

このようにtypeof name.valueOf()=="string"部分を削除すると、条件が変更されます。 Re:.valueOf()部分:そのコードの作成者は、少し編集的であるか、またはnameStringオブジェクトである可能性があります(そのタイプは"object"で、"string"ではありません)。 valueOfを使用すると、代わりにプリミティブをチェックしていることが保証されます。

驚いたことに、彼らはnullがそのコードで例外を引き起こすので、意外にも(文脈なしで)十分に編集的ではありませんでした。

各条件の周りの()も全く必要ありません。同様nullの取り扱い

は次のようになります。

if (name != null && typeof name.valueOf() == "string" && name.length > 0) 
+0

ありがとう、本当に良い説明、私は一般的に物事についての質問が好き、なぜ私は私の質問に-3スコアを得たか?私は怠け者か何か他の人であったからではないと思う。私はこの種のものに少し慣れていて、学ぶのが楽しいですが、このコミュニティでひどく見たいと思っていません。 –

+0

次回は、[興味のある方法のドキュメント](https://developer.mozilla.org)/ja-JP/docs/Web/JavaScript/Reference/Global_Objects/String/valueOf) – impulsgraw

+0

@AndreiSerban:わかりません。しかし、あなたの質問を明確かつ完全に提示する時間を取ることは、常に助けになります。それにはポイントがないときに番号付きのリストを使用しないなどのことが含まれます。おそらく、あなたが 'valueOf'が理解していることについて話すことで、違いがなければならないと考える理由があるでしょうか(少なくとも、幸せなコーディング、 –

0

String.prototype.valueOf()方法は(ようとString.prototype.toString()はありません)文字列プリミティブオブジェクト自体を返すためJavaScriptで"string".valueOf()返す値と"string"の間には、実際の違いはありません。 (EXのために起因comparsionへ) - Stringクラスのプロトタイプ非修飾オブジェクトのインスタンスである

typeof "string" === typeof "string".valueOf() //true 

(String).valueOf()(String)を使用しての唯一の性能差は、単純な(String)を呼び出すこと(String)はという、当然のことながら(高速であることです)。

+0

お時間をいただきありがとうございます! –

関連する問題