あなたが知らないJS(中)のタイプと読書ノート(一)に値します.
11192 ワード
タイプ
ほとんどの開発者は、JavaScriptのような動的言語はタイプこの仕様では、演算法則によって操作される値はそれぞれのタイプがあり、すべての起こり得るタイプを定義しており、ECMAScriptタイプはさらに に細分されている. ECMAScript言語のすべての値に対応する言語タイプがあります.ECMAScript言語タイプは を含みます.
あなたが知らないJSでは、「タイプ」を定義します.言語エンジンと開発者にとって、タイプは内部的な特徴があり、値を定義した行動は他の値と区別されます.
1.1タイプ
正確で合理的にタイプ転換を行うには、JavaScriptの中の各タイプとその内在的な行為を把握しなければなりません.ほとんどのJavaScriptプログラムは何らかの形式の強制的なタイプの転換に関わっています.
1.2内蔵タイプ
JavaScriptは7種類の内蔵タイプがあります.空き値(null) 未定義(undefined) ブール値 数字(number) 文字列(string) オブジェクト シンボル(smbol、ES 6追加)
JavaScriptの変数にはタイプがありません.値だけがあります.変数はいつでも任意のタイプの値を持つことができます.
1.3.1 undefinedとundeclared変数は、値を持たないときは である.は、スコープ内で宣言しましたが、まだ与えられていない変数です. です.はまだスコープ内で宣言されていない変数です. です.
このセキュリティ保護機構は、ブラウザで実行されているJavaScriptコードにとっても有用です.複数のスクリプトファイルは共有されているグローバル名前空間に変数をロードします.
配列文字列(string)と数字(number)は一番基本的な構成部分ですが、JavaScriptでは違った表現があります.いくつかの内蔵タイプを紹介します.それらを深く理解し、合理的に利用します.
2.1配列
他の強い言語とは異なり、JavaScriptでは、配列は任意の種類の値を収容することができます.
ときには、クラス配列(1つのグループは、数値インデックスの値)を本物の配列に変換する必要があります.
文字列はしばしば文字配列として扱われます.文字列の内部実装は配列があるかどうかはよく分かりませんが、JavaScriptの文字列と文字配列は同じことではありません.文字列が可変ではないということは、文字列のメンバー関数が元の値を変えずに新しい文字列を作成して返します.配列のメンバー関数は元の値で動作します. の多くの配列関数は文字列を処理するのに便利であり、文字列にはこれらの関数がないが、「借用」配列の非変更方法によって文字列を処理することができる. のもう一つの違いは文字列反転であり、配列には文字列にない変更可能なメンバー関数(reverse) がある.
2.3数字
JavaScriptは一つの数値タイプしかないです.number(数字)は「整数」と小数点以下の十進数を含んでいます.引用符をつけるのはJavaScriptが本当の意味での整数がないからです.
javaScriptの「整数」は小数の十進数がないので、42.0は「整数」42に等しいです.
2.3.1数字の文法
JavaScriptの中の数字の定数は普通10進数表記に使われます.
バイナリ浮動小数点数が最大の問題は、次のような状況が発生します.一般的に誤差範囲値を設定します.一般的に「機械精度」と呼ばれます.jsにとって、この値は一般的に です. ES 6は、 を直接使用することができる.
2.3.3整数の安全範囲
数字の提示方式は、「整数」のセキュリティ値の範囲が
「セキュリティ」によって表現できる最大の整数は
2.3.4整数検出
整数が整数かどうかを検出するには、ES 6の
JavaScriptデータの種類にはいくつかの特殊な値があります.
2.4.1値ではない値 nullは、空の値 を指します. undefinedは、 値がありません.
2.4.2 undefined
非厳密モードでは、グローバル識別子undefinedに値を割り当てることができる(設計はあまり考慮されていない)
つまり、コードの値(式の戻り値など)をundefinedとするなら、voidを使用することができます.
2.4.3特殊な数字
数字の種類にはいくつかの特殊な値があります.は数字ではありません. NaNは、数字の種類におけるエラーを指摘するための「警戒値」であり、すなわち「数学演算が成功しなかった.これは失敗して戻った結果」 である. 無限数 ゼロ値 JavaScriptは、従来の があります.
ES 6に新たにツール方法
2.5値と参照は、多くのプログラミング言語において、割当およびパラメータ伝達は、 を介して行われてもよい. JavaScriptにはポインタがありません.参照の動作メカニズムも同じではありません.JavaScriptにおいて変数は他の変数への参照にはなり得ません. JavaScript参照の指向は、値であり、10個の参照がある場合、これらの参照は同じ値を指し、 JavaScriptは、値と参照の割り当て/伝達を文法的に区別せず、完全に値の種類によって決定する .単純値(すなわちスカラベースタイプ値、scalar prmitive)は、常に値コピーによって値/転送を与え、 を含む.複合値(compund value)−オブジェクト(配列とパッケージオブジェクトを含む)と関数は、常に参照コピーによって値/転送 を与えられる.は、参照が変数ではなく、値そのものを指すため、他の参照の方向を変更することができない である.関数パラメータの戸惑い 参照xによって参照aの指向性を変更することはできません.aとxの共通参照値 だけ変更できます.私達は自分で値を使ってコピーするかそれとも引用コピーするかを決めることができません.すべての値の種類によって を決定します.
は、行列などの複合値を、値コピーによって伝達し、複素を作成する必要があり、このように伝達されるのは、元の値ではない.
ほとんどの開発者は、JavaScriptのような動的言語はタイプ
(type)
がないと考えています.ES 5.1の仕様がどのように定義されているかを見てみましょう.
と
Undefined Null Boolean String Number Object
あなたが知らないJSでは、「タイプ」を定義します.言語エンジンと開発者にとって、タイプは内部的な特徴があり、値を定義した行動は他の値と区別されます.
1.1タイプ
正確で合理的にタイプ転換を行うには、JavaScriptの中の各タイプとその内在的な行為を把握しなければなりません.ほとんどのJavaScriptプログラムは何らかの形式の強制的なタイプの転換に関わっています.
1.2内蔵タイプ
JavaScriptは7種類の内蔵タイプがあります.
// typeof ,
typeof undefined === 'undefined' // true
typeof true === 'boolean' // true
typeof 42 === 'number' // true
typeof '42' === 'string' // true
typeof {a: 1} === 'object' // true
// ES6
typeof symbol() === 'symbol' // true
typeof null === 'object' // true
// typeof , null 'object', 'null', bug ,
// null
const a = null
(!a && typeof a === 'object') // true
typeof function a(){ /* .. */ } === 'function' // true
// function( ) object ' '. : ' ', [[Call]],
typeof [1, 2, 3] === 'object' // true
//
1.3値とタイプJavaScriptの変数にはタイプがありません.値だけがあります.変数はいつでも任意のタイプの値を持つことができます.
1.3.1 undefinedとundeclared
undefined
var a;
typeof a; // 'undefined'
var b = 42;
var c;
b = c
typeof b; // 'undefined'
typeof c; // 'undefined'
ほとんどの開発者はundefined
をubdeclared( )
と同等にする傾向があるが、JavaScript
では全く別のものである.undefined
undeclared
var a;
a // undefined
b // ReferenceError: b is not defined ==> undeclared
:
typeof a; // 'undefined'
typeof b; // 'undefined' ==> , typeof ( )
1.3.2 typeof Udeclardこのセキュリティ保護機構は、ブラウザで実行されているJavaScriptコードにとっても有用です.複数のスクリプトファイルは共有されているグローバル名前空間に変数をロードします.
// TODO1
var DEBUG = true debug.js , , , DEBUG ReferenceError ,
typeof
//
if(DEBUG) console.log('debug is start')
//
if(typeof DEBUG !== 'undefined') console.log('debug id start')
// API ,
if(typeof atob === 'undefined') atob = function() { /* Todo... */ }
値配列文字列(string)と数字(number)は一番基本的な構成部分ですが、JavaScriptでは違った表現があります.いくつかの内蔵タイプを紹介します.それらを深く理解し、合理的に利用します.
2.1配列
他の強い言語とは異なり、JavaScriptでは、配列は任意の種類の値を収容することができます.
let a = [1, '2', [3]]
a.length // 3
a[0] === 1 // true
a[2][0] === 3 // true
配列宣言は値を追加できます.あらかじめサイズを設定する必要はありません.let a = []
a.length // 0
a[0] = 1
a[1] = '2'
a[2] = [3]
a.length // 3
!!!
delete , , , length
2.1.1クラス配列ときには、クラス配列(1つのグループは、数値インデックスの値)を本物の配列に変換する必要があります.
// DOM DOM && arguments ( )
// slice(...)
function foo() {
let arr = Array.prototype.slice.call(arguments)
arr.push('bam')
console.log(arr)
}
foo('baz', 'bar') // ['baz', 'bar', 'bam']
// ES6 Array.from(...)
let arr = Array.from(arguments)
2.2文字列文字列はしばしば文字配列として扱われます.文字列の内部実装は配列があるかどうかはよく分かりませんが、JavaScriptの文字列と文字配列は同じことではありません.
let a = 'foo'
let b = ['f', 'o', 'o']
// , length indexOf() concat()
a.legnth // 3
b.length // 3
a.indexOf('o') // 1
b.indexOf('o') // 1
let c = a.concat('bar') // 'foobar'
let d = b.concat(['b', 'a', 'r']) // ["f", "o", "o", "b", "a", "r"]
// ' '
a[1] = 0 // a ==> 'foo'
b[1] = 0 // b ==> ['f', 0, 'o']
// JavaScript ,
a.join // undefined
a.map // undefined
let c = Array.prototype.join.call(a, '-') // "f-o-o"
let d = Array.prototype.map.call(a, function(v) { // "F.O.O."
return v.toUpperCase() + '.'
}).join('')
2.3数字
JavaScriptは一つの数値タイプしかないです.number(数字)は「整数」と小数点以下の十進数を含んでいます.引用符をつけるのはJavaScriptが本当の意味での整数がないからです.
javaScriptの「整数」は小数の十進数がないので、42.0は「整数」42に等しいです.
2.3.1数字の文法
JavaScriptの中の数字の定数は普通10進数表記に使われます.
Array.prototype.reverse.call(a) //
数字の前の0は無視できます.後ろの0も無視できます.const a = 42;
const a = 42.3
特に大きくて小さい数字のデフォルトは指数形式で表示され、toExponential()
関数の出力結果と同じです.const a = 0.42
const b = .42
const c = 42.0
const d = 42
デジタル値はNumber
を呼び出すことができます.const a = 5E10 // a ==> 50000000000
a.toExponential(); // "5e+10"
2.3.2より小さい数値バイナリ浮動小数点数が最大の問題は、次のような状況が発生します.
const a = 42.59
a.toFixed(0) // 43
a.toFixed(1) // 42.6
小数点以下の数字を扱う時に注意が必要です.多くのプログラムは整数だけを処理する必要があります.この時、JavaScriptを使う数字の種類は絶対安全です.0.1 + 0.2 0.3
が等しいかどうかをどう判断しますか?2^-52
Number.EPSLION
において定義されており、0.1 + 0.2 === 0.3 // false
2.3.3整数の安全範囲
数字の提示方式は、「整数」のセキュリティ値の範囲が
Number.MAX_VALUE
よりも遥かに小さいことを決定している.「セキュリティ」によって表現できる最大の整数は
2^53 - 1
、すなわち9007199254740991
であり、ES 6ではNumber.MAX_SAFE_INTEGER
と定義され、最小の整数は-9007199254740991
であり、ES 6ではNumber.MIN_SAFE_INTEGER
と定義されている.2.3.4整数検出
整数が整数かどうかを検出するには、ES 6の
Number.isInteger()
方法が使用されてもよい.// ES6
if(!Number.EPSLION) {
Number.EPSLION = Nath.pow(2, -52)
}
function numbersCloseEnoughEqual(a, b) {
return Math.abs(a - b) < Number.EPSLION
}
let a = 0.1 + 0.2
let b = 0.3
numbersCloseEnoughEqual(a, b) // true
ES 6以前のバージョンpolifill Number.isInteger()
方法Number.isInterger(42) // true
Number.isInteger(42.000) // true
Number.isInteger(42.3) // false
安全な整数かどうかの値を検出し、ES 6のNumber.isSafeInteger()
方法を使用することができる.if(!Number.isInteger) {
Number.isInteger = function(num) {
return typeof num == 'number' && num % 1 == 0
}
}
2.4特殊な値JavaScriptデータの種類にはいくつかの特殊な値があります.
2.4.1値ではない値
undefined
タイプは一つの値しかないです.つまり、undefined
タイプも一つの値しかないです.つまり、null
です.その名前はタイプであり、値です.null
=>未割り当て(empty value)
=>値が与えられていないことを指しますが、現在は2.4.2 undefined
非厳密モードでは、グローバル識別子undefinedに値を割り当てることができる(設計はあまり考慮されていない)
Number.isSafeInteger(Number.MAX_SAFE_INTEGER) // true
Number.isSafeInteger(Math.pow(2, 53)) // fale
Number.isSafeInteger(Math.pow(2, 53) - 1) // true
(misssing value)
表式void
には戻り値がないので、void __
.undefined
は表式の結果を変えずに表式を返さないだけです.function foo() {
undefined = 2 //
}
function foo() {
'use strict'
undefined = 2 // TypeError
}
undefined
void
を利用して、void 0
(主にC言語から)を獲得します.undefined
とundefinedは実質的な違いがありません.つまり、コードの値(式の戻り値など)をundefinedとするなら、voidを使用することができます.
2.4.3特殊な数字
数字の種類にはいくつかの特殊な値があります.
void 0
は、「1つの数字ではない」という意味です.var a = 42
console.log(void a, a) // undefined 42
void 1
var a = 2 / 'foo' // NaN
typeof a === 'number' // true
NaN
とNaN !== NaN // true
var a = 1 / 0 // Infinity
var b = -1 / 0 // -Infinity
2.4.4特殊式ES 6に新たにツール方法
0
を追加し、上記のすべての状況を処理するために使用することができる.var a = 0 / -3
var b = 0 * -3
-0
およびObject.is()
を使用できるときは、できるだけ==
を使用しないでください.前者の効率がより高く、より一般的であるため、===
を使用してください.2.5値と参照
Object.is()
またはObject.is()
(value-copy)
var a = 2 / 'foo'
var b = -3 * 0
Object.is(a, NaN) // true
Object.is(b, -0) // true
Object.is(b, 0) // false
let a = 2
let b = 2 // b a
b++
a // 2
b // 3
(reference-copy)
let c = [1, 3 ,5]
let d = c // d [1, 3, 5]
d.push(7)
c // [1, 3, 5, 7]
d // [1, 3, 5, 7]
var a = [1, 2, 3]
var b = a
a // [1, 2, 3]
b // [1, 2, 3]
b = [4, 5, 6]
a // [1, 2, 3]
b // [4, 5, 6]
// b = [4, 5, 6] a [1, 2, 3]. b , a , js
function foo(x) {
x.push(4)
x; // [1, 2, 3, 4]
x = [4, 5, 6]
x.push(7)
x; // [4, 5, 6, 7]
}
let a = [1, 2, 3]
foo(a)
a; // [1, 2, 3, 4] [4, 5, 6, 7]
// a , a x, a [1, 2, 3]
// x , x = [4, 5, 6] a , a [1, 2, 3, 4]
function foo(x) {
x.push(4)
x; // [1, 2, 3, 4]
x.length = 0; //
x.push(4, 5, 6, 7)
x; // [4, 5, 6, 7]
}
let a = [1, 2, 3]
foo(a)
a; // [4, 5, 6, 7] [1, 2, 3, 4]
// x.length = 0 x.push(...) .