1.18 すべてのコンストラクタのインスタンスはコンストラクタ関数にポイントする const 「 ucto 「プロバティを持つ d e.net/ 、 se 、 N var myNumber = new Number('23' ) ; var myNumberL = 23 ; / / リテラル宣言 var myString = new String('male'); ・〃リテラル宣言 var myStringL = = new B001ean('true' ) ; var myBoolean var myB001eanL = true; / / リテラル宣言 var my0bject = new 0bject() ; var my0bjectL = { } ; / / リテラル宣言 var myArray = new Array( ) ; var myArrayL = [ ] ; / / リテラル宣言 = new Function(); var myFunction var myFunctionL = function() { } ; / / リテラル宣言 var myDate = new Date(); var myRegExp = new RegExp(' /. / ' ) ; var myRegExpL = /. / ; / / リテラル宣言 = new Error(); var myError ( onsole. 10g ( / / すべて true を返す myObjectL. constructor = = 0bject, myObject. constructor = = 0bject, myBooleanL. constructor = = B001ean, myBoolean. constructor = myStringL. constructor = = String, myString. constructor = = String, myNumberL. constructor = = Number, myNumber. constructor = = Number, = B001ean, myDate. constructor = = Date, myFunctionL. constructor = = Function, myFunction. constructor = = Function, myArrayL. constructor = = Array, myArray .constructor = = Array, myRegExp. constructor = = RegExp, myError. constructor = myRegExpL. constructor = = RegExp, ー Er て 0 て 29 ( onst て uctor プロバティはユーザ定義のコンストラクタ関数でも同様に動作しま す。次の例ではコンストラクタ関数 CustomConstructor() を定義し、 new を使ってイ ンスタンスを生成しています。インスタンスが生成されると constructor プロバティ
凵 1 プリミティプ型の文字列、数値、真偽値はオブジェクトのように扱うとオブジェクトのようにふるまう一幻 1.11 プリミテイプ型の文字列、数値、真偽値はオプジェク トのように扱うとオプジェクトのようにぶるまう コンストラクタによって生成されたオプジェクトを使うようにプリミテイプ値を使 うと、 JavaScript はその命令を実行するためにプリミテイプ値を一時的にオプジェク トに変換します ( プリミテイプ値を補完する「ラッパーオプジェクト」が生成されま す ) 。そのオプジェクトは命令が実行された後に破棄され、値はプリミテイプ型に戻 ります。プリミテイプ値をオプジェクトとして扱った際にどのように動作するかを次 の例で見てみます。 〃プリミティブ値を宣言 var myNu11 = null; var myUndefined = undefined; var primitiveBoolean2 var primitiveBooleanl = true; var primitiveNumber1 = 10 ; var primitiveString1 = " f00 " ・ = B001ean( 'true' ) ; / / new 演算子を使っていないのでプリミティブ値となる var primitiveNumber2 = Number('10' ) ; / / new 演算子を使っていないのでプリミテイプ値となる var primitiveString2 = String('f00 ・ ) ; / / new 演算子を使っていないのでプリミティブ値となる ( onsole. log(myUndefined. t0String() ) ; console. log(myNu11. t0String()); い。以下はエラーになる。 * / / * null と undefined は対応する ? コンストラクタを持っていないため、オブジェクトに変換されな console. 10g(primitiveB001eanI. t0String(), primitiveB001ean2. t0String()) ; / / 出力 : "true" "true" ( onsole. 10g(primitiveNumber1. t0String(), primitiveNumber2. t0String()) ; ” 10 " / / 出力 : " 10 " console. 10g(primitiveString1. t0String(), primitiveString2. t0String()) ; / / 出力 : " f00 ”” f00 " スし、プリミティブ値がオプジェクトに一時的に変換されることを実証する。 * / / * toString() プロバテイメソッド ( すべてのオブジェクトが object. prototype から継承 ) にアクセ
150 ー 12 章 BooIean() 12.6 いくつかの値は false 、 それ以外はすべて true に変換 12.2 節で一度述べていますが、 B001ean() コンストラクタ関数を使用した値の変換 に関わるためここでもう一度述べておく価値はあると思います。 真偽を判定するコンテクストにおいて、値が 0 、 - 0 、 null 、 false 、 NaN 、 undefined 、そして空の文字列 ( 物であれば false とみなされます。これ以外のす べての有効な JavaScript の値は true とみなされます。 ワ、 sfiddle. netnsev / / 以下はすべて false ( onsole. 10g ( B001ean ( 0 ) ) ; ( onsole. 10g ( B001ean ( - の ) ; console. 10g(B001ean(fa1se) ) ; console. log(B001ean(' console. 10g(B001ean(undefined) ) ; ( onsole. 10g ( B001ean ( null ) ) ; / / 以下はすべて true ( onsole. 10g ( B001ean ( 1789 ) ) ; console. 10g(B001ean('fa1se ・ ) ) ; は異なる console. 10g(B001ean(Math)); console. 10g(B001ean(Array())); / / als ざという文字列は、真偽値プリミティブの false と JavaScript ではどの値が false としてみなされるのかどうかを知っておくことが重 要です。それにより、どのような値が true とみなされるかどうかもわかります。
ー 147 12 章 B00 厄 an() 12.1 B00 厄 an() オプジェクト B001ean() コンストラクタは t て ue もしくは false を表す真偽値オプジェクトの生 成と、真偽値プリミテイプ値の生成に使用されます。 次の例では、 JavaScript での真偽値の生成方法を列挙します。 ツ/ ・ sfiddle. net/ ・ se ・ 8G7 / / new 演算子と Boolean() コンストラクタを使った生成方法 ( 非推奨 ) var myBooIeanI = new B001ean(fa1se); / / using new keyword console. log(typeof myB001ean1); / / 出力 : 'object' / / new 演算子を使わすに Boolean() コンストラクタを使用してプリミテイプ真偽値を生成 var myBoolean2 = Boolean( の ; console. log(typeof myB001ean2) ; / / 出力 : ・ b001ean ' / / リテラルでプリミティブ値を生成 ( コンストラクタは裏で使用されている ) var myB001ean3 = false; console. log(typeof myB001ean3); / / 出力 : ・ b001ean' console. 10g(myB001ean1, myB001ean2, myB001ean3); / / 出力 : false{} false false 122 B00 厄 anO のバラメータ BooIean ( ) コンストラクタは、 JavaScript で有効な値を引数として 1 っとり、 の引数は次のルールで true か false に変換されます。 0 、 -0 、 null 、 false 、 NaN 、 undefined 、そして空の文字列 ( 当は false に、これ以外のすべての有効な
148 ー 12 章 BooIean() JavaScript の値は true に変換されます ( 12.6 節で説明します ) 。 次の例では 2 つの真偽値オプジェクトを生成します。ひとつは true 、 もうーっは false です。 / / B001ean() の引数に渡された 0 は false に変換される = new B001ean( の ; var f00 console. 10g ( f00 ) ; / / 出力 : false / / B001ean() の引数に渡された Math オブジェクトは true に変換される = new B001ean(Math) ; var bar ( onsole. 10g ( b 訂 ) ; / / 出力 : true e.ne se とメソッドにアクセスすることができます。 ソッドを持っています。プリミテイプ値のラッパーオプジェクトも同様のプロバティ B001ean ( ) オプジェクトによって生成されたオプジェクトは以下のプロバティとメ メソッド ( B00 厄 a ル p 「 0t0 pe のプロバティ ) 124 B00 厄 an() のインスタンスのプロバティと ・ prototype プロ / ヾティ とメソッドを除く ) B001ean() オプジェクトは次のプロバティを持っています ( 継承されたプロバティ 12.3 B00 厄 an() のプロバティとメソッド NOTE 文字列を生成することができます。 'object' として返します。また、この理由がなくとも、リテラルを使った方が早く簡単に 算子はそれが文字列オブジェクトか否かにかかわらず、複雑なオブジェクトの型をすべて 算子で型を確認する場合に問題が起こるため、通常この方法は避けるべきです。 typeof 演 成します。 String() や Number() の場合と同様、この方法で文字列を生成すると typeof 演 new 演算子を使って B001ean() コンストラクタを実行すると真偽値「オブジェクト」を生
32 ー 1 章 JavaSc 「 ipt オブジェクト B001ean ( ) のインスタンスでさえも同じことができます。 : / / ・引 e trse ・ / / どのネイティブコンストラクタのインスタンスであっても同様にインスタンスプロバティを 追加できる var myString = new String() ; var myNumber = new Number(); = new B001ean(true); var myBoolean var my0bject = new 0bject(); var myArray = new Array(); = new Function('return 2 + 2 つ ; var myFunction test' ・ prop,myFunction. prop, myRegExp ・ prop); 'test' 'test' 'test' 〃出力 : ・ test', myRegExp ・ prop = 'test ・・ myFunction. prop = 'test ・・ myArray. prop = ' test ' ・ my0bject. prop = ' test ' ・ myB001ean. prop = myNumber. prop = 'test ' ・ myString ・ prop = ' test ' ・ var myRegExp = new RegExp('\bt[a-z] + \b console. 10g(myString ・ prop,myNumber. prop,myB001ean. prop,my0bject. prop,myArray. 'test' 'test' 'test' = true; = true,• / / 注意 : プリミティブ値にはプロバティを追加できない myNumber. prop myString ・ prop var myBoolean = true; var myNumber var myString = ' string ' ; = true; ンスタンス」と呼んではいるものの、結局はただのオプジェクトにすぎないことを覚 は一般的に行われます。コンストラクタ関数によって生成されたインスタンスを「イ コンストラクタ関数によって生成されたオプジェクトにプロバティを追加すること console. log(myString. prop, myNumber. prop, myB001ean. prop) ; / / 出力 : undefined, undefined, undefined myB001ean. prop
12.5 真偽値オブジェクトは格納されている値が囿 se であっても t 「 ue と評価される一 149 インスタンスプロ / ヾティ ・ constructor インスタンスメソッド ・ toString()—真偽値が true の場合はプリミテイプ型の文字列 'true ・ を、それ以外の場合は竏 als ざを返す。 ・ va1ue0f()—プリミテイプ型の真偽値を返す。 12.5 真偽値オプジェクトは格納されている値が false であっても true と評価される B001ean ( ) コンストラクタに生成された ( プリミテイプ型ではない ) 真偽値オプ ジェクトは、あくまでもオプジェクトであって、たとえそれが false の値を持ってい るとしても評価時には true に変換されてしまいます。次の例で、このことを実証し ます。 社 : / sfiddle. etrse ・ a/vAta / / false の真偽値オブジェクトを生成 var fa1seVa1ue = new B001ean(fa1se); console. 10g(fa1seValue); / / 真偽値オブジェクトが出力される if (fa1seVa1ue) { / / 真偽値オブジェクトの内容が false であっても、オブジェクト自体は常 に true 値とみなされる console. log('falseVa1ue is truthy' ) ; もし真偽値ではない値を真偽値に変換したいのであれば、 new 演算子を使用せずに B001ean() に値を渡してください。すると B001ean() はプリミテイプ値 (true もし くは false) を返します。
26 ] 章 JavaSc 「 ipt オブジェクト d 0 / / プリミティブ値 var myNu11 = null; var myUndefined = undefined; var primitiveString1 = "string ・ var primitiveString2 = String('string' ) ; var primitiveNumber1 = 10 ; var primitiveNumber2 = Number(' 10 ・ ) ; var primitiveBoolean1 = true; = B001ean('true' ) ; var primitiveBoolean2 ・・ ? 気をつけて ! console. log(typeof myNull); / / 出力 object ( 0n501e. log(typeof myUndefined) ; / / 出力 . undefined ( onsole. log(typeof primitiveString1, typeof primitiveString2) ; / / 出力 : string string ( onsole. log(typeof primitiveNumber1, typeof primitiveNumber2) ; / / 出力 : number number ( onsole. log(typeof primitiveB001ean1, typeof primitiveB001ean2) ; / / 出力 : boolean boolean / / オブジェクト var myNumber = new Number(23) ; var myString = new String('male ・ ) ; = new B001ean(fa1se); var myBoolean var my0bject = new 0bject() ; var myArray = new Array(' f00 ' var myFunction = new Function()x ・ var myDate = new Date() ; var myRegExp = new RegExp('\\bt[a-z] + \\b' ) ; var myE てて 0 て = new Error('Error! ' ) ; 'return X ( onsole. log(typeof myNumber) ; / / 出力・ object console. log(typeof myString) ; / / 出力 . 0bject console. log(typeof myB001ean); / / 出力 . object ( onsole. log(typeof my0bject) ; / / 出力 object ( onsole. log(typeof myArray) ; / / 出力 object console. log(typeof myFunction); / / 出力 : function ( onsole. log(typeof myDate) ; / / 出力・ object ( onsole. log(typeof myRegExp) ; / / 出力・ object console. log(typeof myError); 〃出力 object 気をつけて ! typeof 演算子を使う場合は、対象の値の種類によって、返される値が異なること についてよく知っておくべきです。
1 .8 null 、 undefined 、 'st 「 ing' 、 低いレイヤの単位です。 10 、 t 「 ue 、 f 引 se はオブジェクトではなくプリミテイプ型 17 20 阯 ・ String() や Number() 、 B001ean() の各コンストラクタはオブジェクトを生成しますが、 同時にプリミティブ値を生成することもできる、二度美味しいコンストラクタです。 これらのコンストラクタは常にオプジェクトを返すわけではなく、 new 演算子を付与 せずに実行した場合はプリミティブ値を返しますす。 1.8 null. undefined 、 lstringl• IO 、 true 、 false はオプジェクトではなくプリミテイプ型 null と undefined は JavaScript の値として宣言する際にコンストラクタを必要と せず、また new 演算子を必要ともしません。 null もしくは undefined を使用する際 は、これらがまるで定数であるかのように使用するだけです。文字列、数値、真偽値 といった他のプリミテイプ値については、コンストラクタから返される値ではありま すが、やはりオプジェクトではありません。 以下のコードでプリミテイプ型と他のネイテイプ JavaScript オプジェクトを比較 します。 / / コンストラクタ関数に new 演算子を付与していないことに留意してください。 / / プリミティブ値を生成する際には、オブジェクトは生成されません。 = B001ean('true' ) ; 竏 00 " ・ var primitiveBoolean2 var primitiveBoolean1 = true; var primitiveNumber2 = Number(' 10 ' ) ; var primitiveNumber1 = 10 ; var primitiveString2 = string(' f00 ・ ) ; var primitiveString1 = す訳注ただし、実際にコンストラクタとして使われることはありません。 'boolean,boolean ・ ( onsole. log(typeof primitiveB001ean1, typeof primitiveB001ean2) ; / / 出力 console. log(typeof primitiveNumber1, typeof primitiveNumber2) ; / / 出力 : ・ number, number, ( onsole. log(typeof primitiveString1, typeof primitiveString2) ; / / 出力 : ・ string, string //confirm the typeof is not object
16 ー 1 章 JavaSc 「 ipt オブジェクト (irreducible 、これ以上単純化されない ) であるためプリミティブ値であるとみな されています。つまり、数値は数値そのもの、文字列は文字列そのもの、真偽値は true もしくは false 、そして null と undefined はただの null と undefined である ということです。これらの値はシンプルであり、他の型の値を組み合わせて構成され た値を表しません。 下記の例を試してみて、文字列、数値、真偽値、 null 、 undefined の各値がそれぞ れオプジェクトになりうるかどうかを確かめてください。そしてそれをあなたがすで に知っている Object ( ) や Array ( ) のインスタンス、もしくは他の複雑なオプジェク トと比較してみてください。 ブ値もしくはオブジェクトによって構成されており、そのため複数の値を持った複雑なセットに / * 配列やオブジェクトといった複合型 ( 1.12 節で詳しく解説 ) の値は、 1 つ以上のプリミティ console. 10g(myString, myNumber, myB001ean, myNull, myUndefined) ; var myUndefined = undefined; var myNu11 = null; var myB001ean = false; var myNumber = 10 ; var myString = string とてもシンプルに言うと、プリミテイプ値は JavaScript の世界の情報における一番 console. 10g(myArray) ; var myArray = ['string' , 10 , false, null, undefined]; console. 10g(my0bject) ; myUndefined : undefined myNu11: null, myB001ean : false, myNumber: 10 , myString: ' string var my0bject なりうることに留意してください。