Javascriptのデータ型の旅_基礎知識

WBOY
リリース: 2016-05-16 15:36:10
オリジナル
1315 人が閲覧しました

JavaScript は型指定が弱い言語ですが、独自のデータ型 (数値、文字列、ブール、オブジェクト、Udefine、Null) もいくつか持っています。このうち、Object は複雑なデータ型であり、順序付けされていないキーと値のペアで構成されます。残りのいくつかの型は単純なデータ型です。注: 変数タイプの最初の文字は大文字ですが、変数値の最初の文字は小文字です。

JavaScript はカスタム型をサポートしていないため、JavaScript のすべての値はこれら 6 つの型のいずれかに属します。
ECMAScript 5.1 仕様によれば、JavaScript には 6 つのデータ型があります。つまり、Unknown、Null、Boolean、Number、String、Object です。最初の 5 つは基本型で、最後の 1 つはオブジェクト型です。

最新の ECMAScript 6 では、次のタイプが追加されました: シンボル (ECMAScript 6 の新しい定義)

基本データ型

未定義: 値は 1 つだけあり、未定義です。これは「値なし」を意味し、すべてのデータ型に適用されます。
Null: 値は null の 1 つだけです。これは「オブジェクトなし」を意味し、オブジェクト タイプにのみ適用されます。 (リテラル)
ブール値: true と false の 2 つの値があります
数値: 値は、IEEE 754 標準に準拠した 64 ビット浮動小数点数のコレクションであり、整数データ構造はありません。さらに、3 つの特別な値も含まれています: NaN、Infinity、-Infinity
文字列: 値は有限の Unicode 文字のコレクションです。 ' または " で囲む必要があります。

1. 文字列

JavaScript の文字列型はテキスト データを表すために使用されます。これは、16 ビットの符号なし整数値のセットの「要素」です。文字列内の各要素は文字列内の位置を占めます。最初の要素のインデックスは 0、次の要素のインデックスは 1、というようになります。文字列の長さはその要素の数です

C 言語とは異なり、JavaScript の文字列は不変です (注釈: たとえば、JavaScript の文字列操作は新しい文字列を返す必要があり、元の文字列は変更されていません)

JavaScript のすべてはオブジェクトベースです

文字列の作成には2種類あります

1. リテラルメソッドを使用して作成された文字列は、文字列 //string

の基本型です。

2. String() を使用して作成された文字列は、文字列 // string

の基本型です。

3. コンストラクター new String() を使用して作成された文字列は、オブジェクト型 //string

です。

var str1 = "javascript" //文字列
; var str2 = String("javascript") //文字列は推奨されません
var str3 = new String('javascript') //オブジェクト

;

オブジェクトと文字列の間にも違いがあります

s1 = "2 2" // 文字列プリミティブを作成します
s2 = new String("2 2"); // String オブジェクトを作成します
console.log(eval(s1)); // 数値 4
を返します console.log(eval(s2)); // 文字列「2 2」を返します
文字列オブジェクトの変換 valueof -》 string

console.log(eval(s2.valueOf())) // 数値 4 を返します

2. ブール値

元の値 true false と、値が true false のブール オブジェクトを混同しないでください

1. ブール型コンストラクターのパラメーターがブール値ではない場合、パラメーターはブール値に変換されます

2. パラメーターが 0、-0、null、false、NaN、未定義、または空の文字列 ("") の場合、生成されるブール オブジェクトの値は、オブジェクトまたは文字列を含むその他の値です。 " false" は、値が true

のブール型オブジェクトを作成します。
var x = new Boolean(false);
if(x){
 console.log(x.valueOf(),typeof x); // false object
}
ログイン後にコピー

上記は非常に魔法のようなコードで実行されます

新しいブール オブジェクトを作成して非ブール値をブール値に変換しないでください。ブール関数を直接使用するのが正しいです

var x = Boolean(expression);  // 这样用
var x = new Boolean(expression); // 而不要这样!
初始化的时候

//false
var bNoParam = new Boolean();
var bZero = new Boolean(0);
var bNull = new Boolean(null);
var bEmptyString = new Boolean("");
var bfalse = new Boolean(false);
//true
var btrue = new Boolean(true);
var btrueString = new Boolean("true");
var bfalseString = new Boolean("false");
var bSuLin = new Boolean("Su Lin");
ログイン後にコピー

3. 番号

ECMAScript 標準によれば、JavaScript の数値型は 1 つだけです。それは、IEEE 754 標準に基づく倍精度 64 ビット バイナリ値 (-(253 -1) ~ 253 -1) です。整数の特定の型は提供されません。浮動小数点数を表現できることに加えて、Infinity、-Infinity、NaN (Not-a-Number)

などの符号付き値も使用できます。

数値型には整数が 1 つだけあり、2 つの方法で表現できます。0 は -0 と 0 として表現できます (「0」は 0 の省略形です)。 実際には、これもほとんど影響はありません。 たとえば、0 === -0 は true です。 ただし、0 で割るときは注意が必要かもしれません:

42/0; // 無限
42/-0; // -無限

引数を数値に変換できない場合は、NaN が返されます。

非コンストラクター コンテキスト (つまり new 演算子なし) では、Number を使用して型変換を実行できます

isNAN 型判定

Number.isNaN(NaN);  // true
Number.isNaN(Number.NaN); // true
Number.isNaN(0 / 0)  // true
// e.g. these would have been true with global isNaN()
Number.isNaN("NaN");  // false
Number.isNaN(undefined); // false
Number.isNaN({});   // false
Number.isNaN("blabla"); // false
// These all return false
Number.isNaN(true);
Number.isNaN(null);
Number.isNaN(37);
Number.isNaN("37");
Number.isNaN("37.37");
Number.isNaN("");
Number.isNaN(" ");
ログイン後にコピー

原型链继承的关系

console.log(Number.prototype.__proto__ == Object.prototype); //true
console.log(Number.prototype.__proto__.__proto__ == Object.prototype.__proto__);//true
console.log(Object.prototype.__proto__ === null);//true
console.log(typeof Number);//function

使用 Number 转换 Date 对象

var d = new Date("December 17, 1995 03:24:00");
console.log(Number(d));

四、Null

null 是一个 JavaScript 字面量,表示空值(null or an "empty" value),即没有对象被呈现(no object value is present)。它是 JavaScript 原始值 之一。

null 是一个字面量 (而不是全局对象的一个属性,undefined 是 )

console.log(null); //null
console.log(undefined);//undefined
console.log(window.null);//undefined
console.log(window.undefined);//undefined

null与undefined的区别

console.log(foot);//Uncaught ReferenceError: foot is not defined
var foo;
console.log(foo);//undefined
var bar =null;
console.log(bar);//null
typeof null  // object (bug in ECMAScript, should be null)
typeof undefined // undefined
null === undefined // false
null == undefined // true
ログイン後にコピー

所以判断null,可以判断类型 + 值

五、Undefined

在JavaScript中,undefined这个词有多重含义.首字母大写的Undefined表示的是一种数据类型,小写的undefined表示的是属于这种数据类型的唯一的一个值.但这两种undefined都只能存在于文档或规范中,不能存在于JavaScript代码中.在JavaScript代码中,你看到的undefined最有可能是全局对象的一个属性,该属性的初始值是就是前面所说的原始值undefined,还有种情况就是,这个undefined是个局部变量,就像其他普通变量一样,没有任何特殊性,它的值不一定是undefined,但通常情况下都是的.下面我们所说的undefined,都指的是window.undefined这个属性.

在ES3中(Firefox4之前),window.undefined就是一个普通的属性,你完全可以把它的值改变成为任意的真值,但在ES5中((Firefox4之后),window.undefined成了一个不可写,不可配置的数据属性,它的值永远是undefined.

一个未初始化的变量的值为undefined,一个没有传入实参的形参变量的值为undefined,如果一个函数什么都不返回,则该函数默认返回undefined.

你可以使用严格相等运算符来判断一个值是否是undefined:

var foo;
console.log(foo === undefined);//true
console.log(typeof foo === 'undefined');//true
console.log(window.foo === undefined);//true
console.log(bar === undefined);//Uncaught ReferenceError: bar is not defined
console.log(typeof bar === 'undefined');//true
console.log(window.bar === undefined);//true
console.log(typeof undefined == 'undefined'); //true
console.log(typeof null == 'object');//true
console.log(null == undefined);//true
console.log(null === undefined);//false
ログイン後にコピー

总结

Null的值是null,表示一个空对象指针,没有指向任何对象
Undefined的值是undefined,表示申明变量或对象的属性却未初始化
undefined值是派生自null的,所以对他们执行相等测试会返回true
数值、布尔值、对象和字符串值都有toString()方法。但null和undefined值没有这个方法
多数情况下,调用toString()方法不必传递参数。但是,在调用数值的toString()方法时,可以传递一个参数:输出数值的基数

var num = 10;
alert(num.toString()); //"10"
alert(num.toString(2)); //"1010"
alert(num.toString(8)); //"12"
alert(num.toString(10)); //"10"
alert(num.toString(16)); //"a"

在不知道要转换的值是不是null或undefined的情况下,还可以使用转型函数String(),这个函数能够将任何类型的值转换为字符串。String()函数遵循下列转换规则:

  ● 如果值有toString()方法,则调用该方法(没有参数)并返回相应的结果

  ● 如果值是null,则返回"null"

  ● 如果值是undefined,则返回"undefined"

六、Object

Javascript中一切皆Object

// Objects
typeof {a:1} === 'object';
// 使用Array.isArray或者Object.prototype.toString.call方法可以从基本的对象中区分出数组类型
typeof [1, 2, 4] === 'object';
typeof new Date() === 'object';
// 下面的容易令人迷惑,不要这样使用!
typeof new Boolean(true) === 'object';
typeof new Number(1) ==== 'object';
typeof new String("abc") === 'object';
// 函数
typeof function(){} === 'function';
typeof Math.sin === 'function';
ログイン後にコピー

实例化一个空Object

var o = new Object();
var o = new Object(undefined);
var o = new Object(null);
var o = {};

原型

定义属性为__proto__: 值 或 "__proto__": 值 时,不会创建名为__proto__属性。如果给出的值是对象或者null,那么对象的[[Prototype]]会被设置为给出的值。(如果给出的值不是对象也不是null,那么对象的原型不会改变。)

var obj1 = {};
assert(Object.getPrototypeOf(obj1) === Object.prototype);
var obj2 = { __proto__: null };
assert(Object.getPrototypeOf(obj2) === null);
var protoObj = {};
var obj3 = { "__proto__": protoObj };
assert(Object.getPrototypeOf(obj3) === protoObj);
 var obj4 = { __proto__: "not an object or null" };
assert(Object.getPrototypeOf(obj4) === Object.prototype);
assert(!obj4.hasOwnProperty("__proto__"));
ログイン後にコピー

在对象字面值中,仅有一次变更原型的机会;多次变更原型,会被视为语法错误。

不使用冒号记法的属性定义,不会变更对象的原型;而是和其他具有不同名字的属性一样是普通属性定义。

var __proto__ = "variable";
var obj1 = { __proto__ };
assert(Object.getPrototypeOf(obj1) === Object.prototype);
assert(obj1.hasOwnProperty("__proto__"));
assert(obj1.__proto__ === "variable");
var obj2 = { __proto__() { return "hello"; } };
assert(obj2.__proto__() === "hello");
var obj3 = { ["__prot" + "o__"]: 17 };
assert(obj3.__proto__ === 17);
ログイン後にコピー

与JSON的区别

JSON 只允许"property": value syntax形式的属性定义。属性名必须用双引号括起来。且属性定义不允许使用简便写法。
JSON中,属性的值仅允许字符串,数字,数组,true,false,或者其他JSON对象。
JSON中,不允许将值设置为函数。
Date 等对象,经JSON.parse()处理后,会变成字符串。
JSON.parse() 不会处理计算的属性名,会当做错误抛出。

defineProperty

Object.defineProperty() 方法直接在一个对象上定义一个新属性,或者修改一个已经存在的属性, 并返回这个对象
// 使用 __proto__
Object.defineProperty(obj, "key", {
 __proto__: null, // 没有继承的属性
 value: "static" // 没有 enumerable
     // 没有 configurable
     // 没有 writable
     // 作为默认值
});
// 显式
Object.defineProperty(obj, "key", {
 enumerable: false,
 configurable: false,
 writable: false,
 value: "static"
});
// 回收同一对象
function withValue(value) {
 var d = withValue.d || (
 withValue.d = {
  enumerable: false,
  writable: false,
  configurable: false,
  value: null
 }
 );
 d.value = value;
 return d;
}
// ... 和 ...
Object.defineProperty(obj, "key", withValue("static"));
// 如果 freeze 可用, 防止代码添加
// value, get, set, enumerable, writable, configurable
// 到对象原型上
(Object.freeze||Object)(Object.prototype);
ログイン後にコピー

configurable当且仅当这个属性描述符值为 true 时,该属性可能会改变,也可能会被从相应的对象删除。默认为 false。

enumerabletrue 当且仅当该属性出现在相应的对象枚举属性中。默认为 false。

value 与属性相关的值。可以是任何有效的 JavaScript 值(数值,对象,函数等)。默认为 undefined。

writable true 当且仅当可能用 赋值运算符 改变与属性相关的值。默认为 false。

存取描述符同时具有以下可选键值:

get 一个给属性提供 getter 的方法,如果没有 getter 则为 undefined。方法将返回用作属性的值。默认为 undefined。
set 一个给属性提供 setter 的方法,如果没有 setter 则为 undefined。该方法将收到作为唯一参数的新值分配给属性。默认为 undefined。

ps:js中的变量定义

在JavaScript中,使用var来定义任何类型的变量,每一个变量只是用于保存数据的占位符。

var temp; //这句代码定义了一个变量,但其类型是未知的,可以存放任何类型的值,没有初始化的时候,test中存储是undefined。
var temp=2; //这句代码定义了一个变量,并直接初始化为数值型。
var temp="javascript"; // 这句代码定义了一个变量,并直接初始化微string型,单引号和双引号都可以,只要成对出现就行。

2、变量的作用域

在Javascript中,使用var定义的变量,其作用域是在定义该变量的方法或函数内。也就是说,使用var定义的变量是局部变量。
例:

function test()
{
 var temp="Hello, Javascript!";
}

test(); //方法调用的时候创建变量并初始化,执行结束后变量被销毁。
alert(temp); //undefined。因为变量temp已经被销毁,所以是未定义(undefined)。

如果在定义变量时,不使用var,那么定义的变量是全局变量。

例:

function test2() 
 { 
  temp2="Hello, Javascript!"; 
 } 
test2(); //调用方法时,创建变量并初始化,执行结束后变量依然存在。 
alert(temp2); //Hello, Javascript! 变量值依然存在 
ログイン後にコピー

以上内容是小编给大家介绍的Javascript中的数据类型之旅,希望大家喜欢。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート