1

私が理解していることからstring、JavaScript の (基本) 型はプリミティブ型です。つまり、その変数はスタックに割り当てられます。

スタック上で型を割り当て可能にするには、固定サイズが必要であると考えていましbooleannumber.

それを仮定するのはどういうわけか間違っていますか、stringそれとも JavaScript プリミティブ型で s を作成するために使用される他の内部マジックですか?


編集: JavaScript が緩やかに型付けされていると考えると、これはより複雑になります。関数の過程でローカル変数に割り当てられる可能性のあるもののサイズが固定されていないことを考えると、どのようにローカル変数をスタックに割り当てることができるのか疑問に思います

しかし、これに対する(おそらく単純化された)答えは、すべてのローカル変数にスタック上の固定最大サイズを割り当てることができるということかもしれません。これがnumber型のサイズであると私が考える8バイトであり、他のすべてのプリミティブ型を収容するのに十分な大きさである必要があります(string) とメモリ アドレス (ローカル変数に参照型が割り当てられている場合)。ただし、文字列を 8 バイト (または任意のサイズ) に制限することはできません。これにより、文字列 (プリミティブ型のものであっても) はスタックに割り当てられない (できない) と結論付けられます。したがって、JavaScript の「プリミティブ型」という用語は、スタックに必ず割り当てられる型ではなく、「基本/ビルディング ブロック」型を意味するために使用されます (本「Professional JavaScript.. .」 ニコラス・ザカス著)。

これについて話している良い情報源への他の見方やポインタを持っている人はいますか?

4

3 に答える 3

1

文字列は、オブジェクトであると同時にプリミティブでもあります。

行うとき:

var s = "this is a string";

あなたは実際に行います:

var s = new string("this is a string");

カーテンの後ろ。

1つ目は文字を含むプリミティブ配列で、2つ目はそれを参照します。

文字列は不変です。つまり、文字列を変更することはできません。それを変更しようとすると(つまり、逆にしようとすると)、オブジェクト参照が指す新しい文字列プリミティブが作成されます。

于 2012-09-14T12:12:22.413 に答える
0
  1. 文字列はスタックに割り当てられません
  2. 変数が割り当てられている場所では、プリミティブとオブジェクトが区別されません
  3. 文字列はプリミティブではなく、「文字列」クラスです。

プリミティブと型の違いは、型にはメソッドがあり、それらに新しいプロパティを割り当てることができることです。

var a = 1, b = {}, s = '';
a.foo = 1; // doesn't work, but no error either
b.foo = 1; // works
s.foo = 1; // doesn't work, but no error either

console.log(a.foo);
console.log(b.foo);
console.log(s.foo);
​

与える

undefined
1
undefined

全体として、JavaScriptで「プリミティブ」を使用することが理にかなっているのかどうかはわかりません。これは、線がぼやけているためです。

文字列は「値オブジェクト」であり、どのプロパティも変更できないことを意味します。たとえば、文字列内の文字を置き換えると、新しい文字列が取得されます。古い文字列は変更されません。

于 2012-09-14T12:08:23.900 に答える
0

Javascript インタープリターで変数を表すために使用されるストレージは、スタックのように見える必要はありません。実装に依存します。

于 2012-09-14T12:05:43.510 に答える