首頁 web前端 js教程 Javascript中的資料類型之旅_基礎知識

Javascript中的資料類型之旅_基礎知識

May 16, 2016 pm 03:36 PM

雖然Javascript是弱型別語言,但是,它也有自己的幾種資料型別,分別是:Number、String、Boolean、Object、Udefined、Null。其中,Object屬於複雜資料類型,Object   由無序的鍵值對組成。其餘幾種都屬於簡單資料類型。注意:變數類型首字母大寫,而變數值首字母是小寫的。

JavaScript不支援自訂類型,所以JavaScript中的所有值都屬於這六種類型之一。
根據ECMAScript 5.1的規範,javascript共有六種資料型,分別為:Undefined, Null, Boolean,Number, String、Object。前五種屬於基本類型,最後一種屬於Object類型。

最新的ECMAScript 6 又加了一種類型:Symbol (ECMAScript 6 新定義)

基本資料型別

Undefined:只有一個值,為undefined,意味著“空值(no value)”,適用於所有資料類型。
Null:只有一個值,為null,意味著“空物件(no object)”,只適用於物件類型。 (literal)
Boolean:有兩個值,為true與false
Number:的值是遵循IEEE 754標準的64位元浮點數的集合,沒有整數資料結構。另外還包含三個特殊的值:NaN、Infinity、-Infinity
String:值是有窮個Unicode字元的集合。必須用'或"括起來。

一、String

JavaScript的字串類型用來表示文字資料。它是一組16位元的無符號整數值的「元素」。字串中的每個元素佔據了字串的位置。第一個元素的索引為0,下一個是索引1,依此類推。字串的長度是它的元素的數量

與 C 語言不同,JavaScript 中字串是不可變的(譯註:如,JavaScript 中對字串的操作一定回傳了一個新字串,原始字串並沒有被改變)

Javascript中一切都是object-based

建立string,也有兩種類型

1、使用字面量方式建立的字串,為基本類型的string //string

2、使用String()建立的字串,為基本類型的string  // string

3、使用建構子 new String()的方式建立的字串,為物件類型的 //string

var str1 = "javascript"; //string
var str2 = String("javascript"); //string 不建議
var str3 = new String('javascript'); //object

object 和 string也是有區別的

s1 = "2 2";               // creates a string primitive
s2 = new String("2 2");   // creates a String object
console.log(eval(s1));      // returns the number 4
console.log(eval(s2));      // returns the string "2 2"
字串物件的轉換 valueof -》 string

console.log(eval(s2.valueOf())); // returns the number 4

二、boolean

不要將原始值true false,和值為true false的Boolean物件混淆

1、如果Boolean建構子的參數不是一個布林值,則該參數會被轉換成一個布林值

2、如果參數是0, -0, null,false, NaN, undefined, 或空字串(""),產生的Boolean物件的值為false. 其他任何值,包括任何物件或字串" false", 都會建立一個值為true的Boolean物件

var x = new Boolean(false);
if(x){
 console.log(x.valueOf(),typeof x); // false object
}
登入後複製

上面會執行,很神奇的程式碼

不要透過新建Boolean物件的方法將一個非布林值轉換成布林值. 直接使用Boolean函數才是正確的

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");
登入後複製

三、Number

根據 ECMAScript 標準,JavaScript 中只有一種數字類型:基於 IEEE 754 標準的雙精度 64 位元二進位格式的值(-(253 -1) 到 253 -1)。它並沒有為整數給出特定的類型。除了能夠表示浮點數外,還有一些帶符號的值: Infinity,-Infinity 和 NaN (非數值,Not-a-Number)

數字型別只有一個整數,它有兩種表示法: 0 可表示為 -0 和 0("0" 是 0 的簡寫)。 在實踐中,這也幾乎沒有影響。 例如 0 === -0 為真。 但是,你可能要注意除以0的時候:

42 / 0; // Infinity
42 / -0; // -Infinity

如果參數無法轉換為數字,則傳回 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中的数据类型之旅,希望大家喜欢。

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

前端熱敏紙小票打印遇到亂碼問題怎麼辦? 前端熱敏紙小票打印遇到亂碼問題怎麼辦? Apr 04, 2025 pm 02:42 PM

前端熱敏紙小票打印的常見問題與解決方案在前端開發中,小票打印是一個常見的需求。然而,很多開發者在實...

誰得到更多的Python或JavaScript? 誰得到更多的Python或JavaScript? Apr 04, 2025 am 12:09 AM

Python和JavaScript開發者的薪資沒有絕對的高低,具體取決於技能和行業需求。 1.Python在數據科學和機器學習領域可能薪資更高。 2.JavaScript在前端和全棧開發中需求大,薪資也可觀。 3.影響因素包括經驗、地理位置、公司規模和特定技能。

神秘的JavaScript:它的作用以及為什麼重要 神秘的JavaScript:它的作用以及為什麼重要 Apr 09, 2025 am 12:07 AM

JavaScript是現代Web開發的基石,它的主要功能包括事件驅動編程、動態內容生成和異步編程。 1)事件驅動編程允許網頁根據用戶操作動態變化。 2)動態內容生成使得頁面內容可以根據條件調整。 3)異步編程確保用戶界面不被阻塞。 JavaScript廣泛應用於網頁交互、單頁面應用和服務器端開發,極大地提升了用戶體驗和跨平台開發的靈活性。

如何使用JavaScript將具有相同ID的數組元素合併到一個對像中? 如何使用JavaScript將具有相同ID的數組元素合併到一個對像中? Apr 04, 2025 pm 05:09 PM

如何在JavaScript中將具有相同ID的數組元素合併到一個對像中?在處理數據時,我們常常會遇到需要將具有相同ID�...

如何實現視差滾動和元素動畫效果,像資生堂官網那樣?
或者:
怎樣才能像資生堂官網一樣,實現頁面滾動伴隨的動畫效果? 如何實現視差滾動和元素動畫效果,像資生堂官網那樣? 或者: 怎樣才能像資生堂官網一樣,實現頁面滾動伴隨的動畫效果? Apr 04, 2025 pm 05:36 PM

實現視差滾動和元素動畫效果的探討本文將探討如何實現類似資生堂官網(https://www.shiseido.co.jp/sb/wonderland/)中�...

console.log輸出結果差異:兩次調用為何不同? console.log輸出結果差異:兩次調用為何不同? Apr 04, 2025 pm 05:12 PM

深入探討console.log輸出差異的根源本文將分析一段代碼中console.log函數輸出結果的差異,並解釋其背後的原因。 �...

JavaScript難以學習嗎? JavaScript難以學習嗎? Apr 03, 2025 am 12:20 AM

學習JavaScript不難,但有挑戰。 1)理解基礎概念如變量、數據類型、函數等。 2)掌握異步編程,通過事件循環實現。 3)使用DOM操作和Promise處理異步請求。 4)避免常見錯誤,使用調試技巧。 5)優化性能,遵循最佳實踐。

前端開發中如何實現類似 VSCode 的面板拖拽調整功能? 前端開發中如何實現類似 VSCode 的面板拖拽調整功能? Apr 04, 2025 pm 02:06 PM

探索前端中類似VSCode的面板拖拽調整功能的實現在前端開發中,如何實現類似於VSCode...

See all articles