javascriptの中のvalue

4294 ワード

You Don't Know JS Value学習ノート
Aray
var a = [ ];

a["13"] = 42;

a.length; // 14

javascriptでは、keyが数字文字列だけであれば、10進数のkeyに変換され、長さが変化することに留意すべきである.
Aray-like
jsにはよく使われる2つのクラスの配列オブジェクトがあります.一つはdomノードを検索する結果のオブジェクトで、一つは関数のargments属性です.クラスのオブジェクトを行列オブジェクトに変換するには、一般的に2つの方法があります.

function foo() {
    var arr = Array.prototype.slice.call( arguments )
    arr.push( "bam" );
    console.log( arr );
}

foo( "bar", "baz" ); // ["bar","baz","bam"]

ES 6による新属性Aray.fromの変換:
var arr = Array.from( arguments )

ストリングス
javascriptでは配列は可変データタイプであり、文字列は可変データタイプではない.
var a = "foo";
var b = ["f","o","o"];

a[1] = "O";
b[1] = "O";

a; // "foo"
b; // ["f","O","o"]

//       。
文字列の可変性がないと、文字列の固有関数が自身を変えることができなくなります.新しい文字列を返します.
c = a.toUpperCase();
a === c;    // false
a;          // "foo"
c;          // "FOO"

b.push( "!" );
b;          // ["f","O","o","!"]

もちろん、私達もArayの固有の関数を借りて文字列を処理することができます.自分のAray関数を変えないといけません.!!!
a.join;         // undefined
a.map;          // undefined

var c = Array.prototype.join.call( a, "-" );
var d = Array.prototype.map.call( a, function(v){
    return v.toUpperCase() + ".";
} ).join( "" );

c;              // "f-o-o"
d;              // "F.O.O."
独自のAray.reverse方法を変えて文字列を操作してみます.

Array.prototype.reverse.call( "strong" ) 

//Uncaught TypeError: Cannot assign to read only property '0' of object '[object String]'

文字列を逆に出力する方法です.
var c = a
    // split `a` into an array of characters
    .split( "" )
    // reverse the array of characters
    .reverse()
    // join the array of characters back to a string
    .join( "" );

c; // "oof"

Number
数字の文法
jsは一つの数字タイプしかありません.numberは「整数」と小数形式を含みます.整数が引用符を打つのはjsの中で厳密な意味の整数がないからです.これも昔からjsが非難されているところです.
jsの整数は小数の十進数がないことです.したがって、42.0および整数42に等しい.
ほとんどの現代プログラミング言語と同様に、jsのデジタルタイプはIEEE 754標準に基づいて実現され、この標準は通常「浮動小数点数」とも呼ばれる.jsは64ビットのバイナリを使用しています.

var b = 42.

このような書き方はjsでは可能ですが、可読性のためには、このように書くことは勧められません.
Number.prototypeのtoFixed()方法は、小数部の表示桁数を指定できます.

var a = 42.59

a.toFixed( 0 ); // "43"
a.toFixed( 1 ); // "42.6"
a.toFixed( 2 ); // "42.59"
a.toFixed( 3 ); // "42.590"
a.toFixed( 4 ); // "42.5900"
//     0  。
toPrecsion(.)メソッドは、有効な数ビットの表示桁数を指定するために使用される(四捨五入):
var a = 42.59;
a.toPrecision( 1 ); // "4e+1"
a.toPrecision( 2 ); // "43"
a.toPrecision( 3 ); // "42.6"
a.toPrecision( 4 ); // "42.59"
a.toPrecision( 5 ); // "42.590"
a.toPrecision( 6 ); // "42.5900"

より小さい数値
ほとんどのプログラミング言語では、次の問題に直面しています.

0.1 + 0.2 === 0.3; // false

解決方法は誤差範囲を設定することです.マシン精度といいます.この値は通常2^-52(2.22044604925033 e-16)です.
ES 6から、この値はNumber.EPSILONに定義される.
function numbersCloseEnoughToEqual(n1,n2) {
 return Math.abs( n1 - n2 ) < Number.EPSILON;
}

検査整数
es 6では、Number.isInteger関数を提供して検査を行います.まず、整数フォーマットかどうかチェックして、jsが許可する範囲内にあるかどうかを確認します.
Number.isInteger( 42 );     // true
Number.isInteger( 42.000 ); // true
Number.isInteger( 42.3 );   // false

Number.isSafeInteger( Number.MAX_SAFE_INTEGER );    // true
Number.isSafeInteger( Math.pow( 2, 53 ) );          // false
Number.isSafeInteger( Math.pow( 2, 53 ) - 1 );      // true

32ビットは符号整数があります.
最大53桁の整数がありますが、32桁の数字しか使えない数字がありますので、これらの安全範囲は小さいです.Math.pow(-2,31)(-2147483648,約-21億)からMath.pow(2,31)-1(21473647,約21億)になります.a 124 0は、変数aの中の数値を32ビットの符号付き整数に変換することができ、それは32ビットの整数にしか適用されないからである.したがって、0と操作すれば、aの32ビットの数を切り取ります.
nullとundefined
undefinedとは、一度も値を与えないことを意味します.nullは値を与えたことがありますが、まだありません.nullは特別なキーワードです.識別子ではなく、変数として使用できません.しかし、undefinedは識別子であり、変数として使用されたり、値が割り当てられたりすることができる.
function foo() {
 undefined = 2; //        !
}
foo();
function foo() {
 "use strict";
 undefined = 2; // TypeError!
}
foo();