亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

深入探討javascript中的數據類型

2019-11-20 13:01:10
字體:
來源:轉載
供稿:網友

學一門編程語言,無非兩方面:一是語法,二是數據類型。類C語言的語法不外乎if、while、for、函數、算術運算等,面向對象的語言再加上object。
語法只是語言設計者預先做的一套規則,不同語言語法不盡相同,但都有一些共通點,對于熟悉一兩門編程語言的人,學其他的編程語言時,語法往往不是問題(當然,如果你一直學的是類C語言,那么首次接觸lisp時肯定也要花些時間),學習的重點往往是數據類型及其相關操作上,不是有句老話:“數據結構+算法=程序”!其次,有些語言的語法本身就存在設計問題(javascript更甚),我們沒必要深究這些點,當然,如果你自詡geek,可以把玩把玩。

本文將對javascript中的數據類型做一個詳盡的介紹。

弱類型 vs 強類型

鑒于javascript的設計理念,javascript被設計成一種弱類型的語言。
說到這里,難免要說一下,弱類型與強類型的區別。
一些人會誤以為這兩者的差別就是“強類型的語言在聲明一個變量時需要指明它的類型,而弱類型的則不用”。其實這種觀點是錯誤的。比如下面這個Java代碼片段:

復制代碼 代碼如下:

String s = "hello";
int l = s.getBytes().length;

編譯器是怎么知道.length是合法的表達式呢?這是因為編譯器知道s的數據類型為String,當調用String的getBytes方法時,返回值的數據類型為byte[],所以.length是合法的表達式。
這兩者真正的區別是:

在強類型的語言,每個表達式的類型都能夠在編譯時確定,并且只允許適用于該類型的操作;
弱類型的語言允許對任意類型施加任何操作,只是這個操作有可能在運行時報錯。
數據類型

根據ECMAScript 5.1的規范,javascript中共有六種數據類型,分別為:Undefined, Null, Boolean, Number, String、Object。前五種屬于基本類型,最后一種屬于對象類型。

基本數據類型

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

null與undefined

null與undefined都表示“沒有值(non-value)”的概念,如果嚴格區分:
- null表示空
- undefined表示不存在。沒有初始化的變量、函數中缺失的參數、函數沒有顯式return值時都為此值

在其他語言中,一般只用一個null來表示空值,javascript中為什么多了個undefined呢?這是歷史原因造成的:

javascript采用了Java的語法,把類型分為了基本類型與對象類型,Java中用null來表示空對象,javascript想當然的繼承了過來;在C語言中,null在轉為數字時為0,javascript也采取同樣的方式:

復制代碼 代碼如下:

> Number(null)
0
> 5 + null
5

在javascript1.0時,還沒有異常處理(exception handling),對于一些異常情況(沒有初始化的變量、調用函數時缺失的參數等),需要標明為一種特殊的值,null本來是個很好的選擇,但是Brendan Eich同時想避免下面兩件事:
- 這個特殊值不應該有引用的特性,因為那是對象特有的
- 這個特殊值不應該能轉為0,因為這樣不容易發現程序中的錯誤
基于這兩個原因,Brendan Eich選擇了undefined,它可以被強轉為NaN。

復制代碼 代碼如下:

> Number(undefined)
NaN
> 5 + undefined
NaN

兩者在于JSON對象打交道時,結果也迥然不同:

復制代碼 代碼如下:

> JSON.parse(null)
null
> JSON.parse(undefined)
//Firfox SyntaxError: JSON.parse: unexpected character at line 1 column 1 of the JSON data
//Chrome SyntaxError: Unexpected token u
> JSON.stringify(null)
"null"
> JSON.stringify(undefined)
undefined

對象類型

javascript作為一門腳本語言,本身功能十分精簡,很多功能(文件讀寫、網絡等)都是由宿主環境提供。宿主環境與javascript語言的橋梁是對象,宿主環境通過提供一系列符合javascript語法的對象,提供各種各樣的功能。

在javascript面向對象編程這篇文章(如果你不知道prototype是什么,強烈建議看看這篇文章)里,我多次強調了對象在javascript中就是一系列的鍵值對,就像Java中的HashMap一樣,不過,javascript中對象的屬性可以有一些描述符(property descriptor),這在HashMap中是沒有的。

屬性描述符

屬性描述符分為兩類:

數據描述符(data descriptor),包含一系列boolean值,用以說明該屬性是否允許修改、刪除。
訪問描述符(accessor descriptor),包含get與set函數。
這兩種描述符都是對象,它們都擁有下面兩個boolean屬性:

configurable 用以指定該描述符是否允許修改、刪除。默認為false。
enumerable 用以指定在遍歷對象(使用for...in循環或Object.keys方法)的屬性時,是否訪問該屬性。默認為false。
除了上面這兩個共有屬性外,數據描述符還有下面兩個屬性:
- value 用以指定該屬性的值,默認為undefined
- writable 用以指定該屬性的值是否允許改變該屬性的值,默認為false

訪問描述符還有下面兩個屬性:
- get 用以指定訪問該屬性時的訪問器(getter,本質是個函數),該訪問器的返回值為該屬性的值。默認為undefined
- set 用以指定訪問該屬性時的賦值器(setter,本質是個函數),該賦值器的接受一個參數。默認為undefined

我們可以使用Object.defineProperty來設置對象的屬性描述符。例如:

復制代碼 代碼如下:

// using __proto__
Object.defineProperty(obj, 'key', {
  __proto__: null, // no inherited properties
  value: 'static'  // not enumerable
                   // not configurable
                   // not writable
                   // as defaults
});

通過上面這個例子可以看出,描述符具有繼承的特點,我們這里顯式的把描述符對象的__proto__設為null,就避免了從Object.prototype中繼承相應屬性。當然我們也可以顯式地設置描述符的所有屬性:

復制代碼 代碼如下:

// being explicit
Object.defineProperty(obj, 'key', {
  enumerable: false,
  configurable: false,
  writable: false,
  value: 'static'
});

這樣的效果和第一段代碼的效果是一樣的。

下面再舉一個訪問描述符的例子:

復制代碼 代碼如下:

// Example of an object property added with defineProperty with an accessor property descriptor
var bValue = 38;
Object.defineProperty(obj, 'key', {
  get: function() { return bValue; },
  set: function(newValue) { bValue = newValue; },
  enumerable: true,
  configurable: true
});

需要注意的是,不能混淆了訪問描述器與數據描述器。下面這樣寫是錯誤的:

復制代碼 代碼如下:

// You cannot try to mix both:
Object.defineProperty(obj, 'conflict', {
  value: 0x9f91102,
  get: function() { return 0xdeadbeef; }
});
// throws a TypeError: property descriptors must not specify a value
// or be writable when a getter or setter has been specified

typeof

如果想在運行時獲知某變量的類型,可以使用typeof操作符。typeof的返回值如下表:

其中有一處需要注意,那就是typeof null == "object",按照ECMAScript 5.1標準,Null類型應該是個基本類型,為什么這里返回object呢?原因是這樣的:

在javascript 1.0中,javascript中的值是用一個類型標志(type tag)和一個實際值這樣的結構表示的,對象的類型標志為0,null在C語言中表示NULL指針(0x00),所以null的類型標志就為0了。

以上就是本文的全部內容了,有需要的小伙伴參考下吧。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美一级大胆视频| 国产91精品久久久| 中文字幕综合在线| 中文字幕av一区二区三区谷原希美| 不卡毛片在线看| 成人欧美一区二区三区黑人| 一本色道久久综合狠狠躁篇的优点| 91九色视频导航| 91日本在线观看| 在线播放日韩专区| 久热精品视频在线| 国产欧美精品xxxx另类| 欧美日韩一区二区免费视频| 在线播放国产一区中文字幕剧情欧美| 国产99在线|中文| 中文字幕视频一区二区在线有码| 成人黄色午夜影院| 日韩免费在线看| 8050国产精品久久久久久| 色一区av在线| 国产精品日韩电影| 国产午夜一区二区| 国产精品va在线| 色婷婷久久一区二区| 国产精品偷伦视频免费观看国产| 欧美激情小视频| 一区二区三区四区在线观看视频| 日韩久久免费电影| 91成品人片a无限观看| 亚洲视频在线观看免费| 日韩av电影在线免费播放| 国产一区二区三区免费视频| 久热爱精品视频线路一| 亚洲人成人99网站| 黄色91在线观看| 欧美激情久久久久| 欧美高清自拍一区| 日本久久亚洲电影| 精品调教chinesegay| 亚洲成人激情在线观看| 欧美伦理91i| 欧美激情在线观看| 久久精品人人爽| 久久的精品视频| 91国产视频在线播放| 欧美性xxxx在线播放| 欧美做受高潮1| 九九热在线精品视频| 91免费视频国产| 国产视频丨精品|在线观看| 久久久视频在线| 欧美高清在线观看| 亚洲欧美一区二区三区四区| 一区二区三区四区精品| 成人在线视频福利| 亚洲精选在线观看| 亚洲色图av在线| 国产精品一区二区性色av| 欧美性xxxxxxxxx| 欧美在线日韩在线| 91亚洲一区精品| 亚洲人午夜色婷婷| 日韩中文在线不卡| 国产亚洲精品久久久久久| 一本大道亚洲视频| 欧美电影免费观看高清完整| 国产视频在线观看一区二区| 欧美日韩成人网| 国产精品久久av| 久青草国产97香蕉在线视频| 国产精品福利在线观看网址| 国产中文日韩欧美| 久久精品男人天堂| 亚洲一区二区三区四区在线播放| 精品丝袜一区二区三区| 国产精品视频99| 在线播放日韩av| 亚洲午夜av久久乱码| 91av在线不卡| 日韩激情视频在线播放| 精品国产91久久久| 国产精品igao视频| 日韩电影免费在线观看中文字幕| 久久99精品视频一区97| 色婷婷av一区二区三区久久| 欧美日韩国产综合视频在线观看中文| 日韩中文在线视频| 日韩成人免费视频| 欧美www视频在线观看| 日韩最新在线视频| 亚洲第一精品夜夜躁人人躁| 疯狂蹂躏欧美一区二区精品| 亚洲精品国产精品国产自| 欧洲成人免费aa| 欧美性少妇18aaaa视频| 欧美多人乱p欧美4p久久| 亚洲男人的天堂网站| 欧美国产日本高清在线| 国产精品女视频| 欧美激情videos| 久久天堂av综合合色| 国产精品美女免费| 欧美激情视频一区二区| 欧美乱大交xxxxx另类电影| 精品久久久久久久久久ntr影视| 日韩精品高清视频| 一区二区三区四区精品| 91中文字幕在线观看| 国产视频在线一区二区| 中文字幕精品www乱入免费视频| 日本伊人精品一区二区三区介绍| 欧美日韩亚洲网| 精品视频在线播放| 精品国产网站地址| 91av在线不卡| 亚洲jizzjizz日本少妇| 日韩欧美中文免费| 亚洲国产精彩中文乱码av在线播放| 8050国产精品久久久久久| 日韩一区二区三区国产| 亚洲午夜精品久久久久久久久久久久| 性欧美长视频免费观看不卡| 国外成人在线播放| 欧美一级片久久久久久久| 国产999精品| 久久精品久久久久久国产 免费| 欧美二区在线播放| 欧美黑人一级爽快片淫片高清| 国产日韩精品在线播放| 91精品国产沙发| 91人成网站www| 一区二区三区回区在观看免费视频| 久久99国产精品久久久久久久久| 国产精品十八以下禁看| 亚洲剧情一区二区| 一区二区三区在线播放欧美| 日韩av资源在线播放| 欧美伊久线香蕉线新在线| 韩日精品中文字幕| 伊人久久久久久久久久久久久| 精品久久久久久久久久久久久| 久久久中精品2020中文| 96国产粉嫩美女| 一本一道久久a久久精品逆3p| 欧美三级免费观看| 夜夜嗨av色综合久久久综合网| 91av视频在线播放| 少妇高潮 亚洲精品| 国产一区二中文字幕在线看| 久久精品中文字幕| 在线观看视频99| 按摩亚洲人久久| 国产精品欧美日韩一区二区| 91精品国产777在线观看| 国产不卡精品视男人的天堂| 中文字幕亚洲综合久久| 欧美成人精品激情在线观看| 亚洲欧洲高清在线| 欧美性猛交xxxx乱大交3| 国产盗摄xxxx视频xxx69| 欧美国产日韩视频| 国产精品第七影院| 精品视频在线播放免| 亚洲国产毛片完整版|