JSの問題が '名前'という変数に.split()の結果を代入しています

2016-04-09 5 views
3

FirefoxのコンソールでJSのsplit()文字列メソッドでいくつかのテストを行っていました。私は次のようでしたテスト中:JSの問題が '名前'という変数に.split()の結果を代入しています

test = 'first second third'.split(' ') 
-> Array [ "first", "second", "third" ] 
test 
-> Array [ "first", "second", "third" ] 
name = 'first second third'.split(' ') 
-> Array [ "first", "second", "third" ] 
name 
-> "first,second,third" 

を私は毎回私はそれがArrayを返さsplit()法と呼ばれるが、私はnameという変数にそれを保存した場合、それがstringではなくArrayとして保存されたことに気づきました。

どうしてですか?

答えて

1

編集者が正しく指摘したとおり、これはFunction.nameではなくwindow.nameではありません。

ニースキャッチ、上記のコメントは部分的に正しいですが、nameは予約語ではありませんが、実装に依存するJavaScriptオブジェクト、メソッド、またはプロパティの定義済みの名前の1つで、問題が発生する可能性があります。おそらくそれは予約語だったはずです。

出典:Reserved words...

は、具体的には、windowオブジェクトの一部です。ここで

__proto__ Property Names in Object Initializers: 
If IsAnonymousFunctionDefinition(AssignmentExpression) is true, then 
Let hasNameProperty be HasOwnProperty(propValue, "name"). 
ReturnIfAbrupt(hasNameProperty). 
If hasNameProperty is false, perform SetFunctionName(propValue, propKey). 

は、関連する手順は次のとおりです。Spec for name

SetFunctionName (F, name, prefix) 
If Type(name) is Symbol, then 
Let description be name’s [[Description]] value. 
If description is undefined, let name be the empty String. 
Else, let name be the concatenation of "[", description, and "]". 

の 'name' の文字列に連結される場所、それ以外の最後に注意してください。

+0

_ "名前をつけるために設定したものはすべて文字列になります!" _これは本当に 'Function.name'についてのものであれば、何も設定できませんでした。属性は** ** [[Writable]]:false ** "_ – CBroe

+0

_"コンソールで何もしないで名前を入力すると、空の文字列 "_ - ウィンドウオブジェクトが(私たちが私たちの後ろにフレームセットを残して以来、ほとんどの場合、そうなるでしょう...)。しかし、 'click me'を含む簡単な文書を作成し、そのリンクをクリックしてから、新しいウィンドウで 'name'をコンソールにもう一度入力してください..." foobar " – CBroe

+0

あなたは正解です、答えを編集します... – JordanHendrix

2

この問題は、setterおよび/またはgetterが定義されているため、window.nameからのみ発生します。関数内で変数nameを使用すると、この問題は発生しません。

window.nameが配列の出力を文字列に変更する方法を知りたい場合は、私が作成した簡単な例を次に示します。JSFiddle

+0

WTFはこれをダウン投票しましたか? (私から+1しても)それは受け入れられた答えよりも正しい - これは関数に関するものではなく、ウィンドウオブジェクトとそのnameプロパティです。 – CBroe

+0

「厳密モード」をプラグインして常に変数を宣言することをお勧めします。 –

2

JordanHendrix」の答えに追加して、もう少し具体的にするには:ここ

namewindow.nameある - すべてのウィンドウオブジェクトが持つプロパティ、主にリンクやフォーム上target属性と組み合わせて使用​​されます。

このプロパティは文字列値のみを受け入れるため、戻り値を分割する配列は文字列値に変換し直さなければなりません。これは、暗黙的にそのメソッドtoStringを呼び出すことによって行われます。そのメソッドは、すべての配列値をカンマで区切って結合しています。

関連する問題