成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

閑話JavaScript數(shù)據(jù)類型

jerryloveemily / 1648人閱讀

摘要:支持的類型的內(nèi)置數(shù)據(jù)類型羅列如下自定義自定義這三種類型的賦值是同類似的。這根不同,這因?yàn)槭菦](méi)有包裝類新增的基本類型,只支持函數(shù)式賦值,不支持字面量和函數(shù)構(gòu)造。

JavaScript支持的類型

JS的內(nèi)置數(shù)據(jù)類型羅列如下:

undefined
null
bool
number
string
function
object
    Function
        Date
        Error
        自定義function
    new Function
    new Date
    new Error
    new 自定義function
symbol
bool, number, string

bool, number, string這三種類型的賦值是同類似的。

字面量方式賦值
var b = true;
var n = 10;
var s = "hello";
函數(shù)式賦值

與字面量方式等價(jià)的函數(shù)式賦值

var b = Boolean(true);
var n = Number(10);
var s = String("hello");

可驗(yàn)證變量的類型:

typeof b; // "bool"
typeof n; // "number"
typeof s; // "string"
基本類型包裝類

倘若透過(guò)基本類型包裝類構(gòu)造,那么這些變量都變成object類型了。

var obj_b = new Boolean(true);
var obj_n = new Number(10);
var obj_s = new String("hello");

typeof obj_b; // "object"
typeof obj_n; // "object"
typeof obj_s; // "object"

基本類型包裝類實(shí)例(obj_b, obj_n, obj_s)可認(rèn)為是基本類型字面量(b, n, s),由值類型被封裝成了一個(gè)引用類型,二者之間可以做比較的。

obj_b.valueOf() == b  //true
obj_n.valueOf() == n  //true
obj_s.valueOf() == s  //true

看來(lái)基本類型包裝類(Number, Boolean, String)即能當(dāng)函數(shù)直接調(diào)用,也能做構(gòu)造方法,這正是JS函數(shù)的魔法。這里自定義一個(gè)函數(shù)MyNumber, 模仿Number的實(shí)現(xiàn)。

function MyNumber(value) {
    var _self = this;
    // 如果是new構(gòu)造出來(lái)的
    if (_self instanceof MyNumber) {
        _self.value = value;
        return _self;
    }
    return parseFloat(value);
}

MyNumber.prototype.valueOf = function() {
    return parseFloat(this.value);
}

MyNumber.prototype.doubledValue = function() {
    return this.valueOf() * 2;
}

var mnum = MyNumber("12abc");
console.log(mnum);       // 12
console.log(typeof mnum);// number

var obj_mnum = new MyNumber("12abc");
console.log(obj_mnum);  // { [Number: 12] value: "12abc" }
console.log(+obj_mnum); // 12. +用來(lái)轉(zhuǎn)化為number類型,所以返回.valueOf()的結(jié)果
console.log(typeof obj_mnum);        // object
console.log(obj_mnum.doubledValue()) //24

若不用new,也可用Object.create(..prototype),二者等價(jià)。

var obj_mnum = Object.create(MyNumber.prototype);
MyNumber.call(obj_mnum, "12abc")

console.log(obj_mnum);  // { [Number: 12] value: "12abc" }
console.log(+obj_mnum); // 12. +用來(lái)轉(zhuǎn)化為number類型,所以返回.valueOf()的結(jié)果
console.log(typeof obj_mnum);        // object
console.log(obj_mnum.doubledValue()) //24
基本類型字面量和基本類型包裝類實(shí)例的關(guān)系

二者之間可以做算數(shù)運(yùn)算:

obj_n + n //20
// 過(guò)程: obj_n是引用類型 
//       ->通過(guò)調(diào)用其valueOf()轉(zhuǎn)為值類型10 
//       -> 10 + 10 = 20

obj_b + obj_n // 11
// 過(guò)程:obj_b引用類型
//      -> 調(diào)用valueOf()轉(zhuǎn)為值類型true
//      -> 布爾true需要轉(zhuǎn)為number類型做算數(shù)運(yùn)算,調(diào)用Number(true),得到1
//      obj_n引用類型 -> 轉(zhuǎn)為值類型 10
//      所以 1 + 10 = 11

關(guān)于JS數(shù)據(jù)類型轉(zhuǎn)換詳情,請(qǐng)看Javascript中的類型轉(zhuǎn)換

基本類型何以能調(diào)用方法

嚴(yán)格來(lái)講,基本類型字面量是不能調(diào)用任何方法的。但是"hello".length會(huì)成功返回5. 這因?yàn)镴S解釋器在執(zhí)行這句代碼時(shí),會(huì)生成一個(gè)臨時(shí)的基本類型包裝類的實(shí)例,并調(diào)用其length。執(zhí)行完后,就銷毀了這個(gè)臨時(shí)變量。

var tmp = new String("hello");
tmp.length
undefined 和 null

變量聲明而不賦值,其值就是undefined

var a;
a === undefined; //true. a 嚴(yán)格等于 undefined
typeof a;        // "undefined"

若賦值為null:

var a = null;
a === null;      // true
a === undefined; // false, a 不再嚴(yán)格等于undefined
typeof a;        // "object"

可理解為,null是有值的,特殊的空值;而undfined是表示無(wú)值。

undefined 和 null的一些區(qū)別

1.. JSON.stringify會(huì)序列化null值,但不會(huì)序列化undefined

    var obj = {name: "tom", age: null}
    JSON.stringify(obj) // "{"name":"tom","age":null}"
    
    var obj = {name: "tom", age: undefined} //"{"name":"tom"}"
對(duì)象實(shí)例的字段聲明為undefined,是無(wú)意義的。

2.. undefined會(huì)觸發(fā)ES6的default value,而null不會(huì)。

    function greet(name="world") {
        console.log("hello", name)
    }
    greet()          //hello world
    greet(undefined) //hello world
    greet(null)      //hello null

這里也進(jìn)一步印證了, null本身是有值的,不過(guò)是個(gè)特殊的空值。而undefined是無(wú)值的。

值得一提的是,基本類型undefined/null是沒(méi)有任何方法的,也不能夠調(diào)用其任何方法。這根bool/number/string不同,這因?yàn)槭莡ndefined/null沒(méi)有包裝類

symbol

ES6新增的基本類型,只支持函數(shù)式賦值,不支持字面量和函數(shù)構(gòu)造。

var sim = Symbol("IBM") // ok
sim                     // Symbol("IBM")
typeof sim              // "symbol"
sim = new Symbol("IBM") // TypeError: Symbol is not a constructor
function 和 Function

JS函數(shù)可以通過(guò)new Function構(gòu)造,但通常用function關(guān)鍵字定義。二者的關(guān)聯(lián),已在獨(dú)家解析Javascript原型繼承 - 之函數(shù)原型和AOP有詳細(xì)的闡述。這里就簡(jiǎn)要說(shuō)明下,函數(shù)本身和函數(shù)構(gòu)造實(shí)例的一點(diǎn)區(qū)別。

type of Date // function. Date本身是函數(shù)
typeof new Date() // object. 通過(guò)new Date構(gòu)造出來(lái)的是object實(shí)例
new Date().__proto__ == Date.prototype //true. 
// new Date()既然是由Date函數(shù)構(gòu)造出來(lái)的,
// 所以new Date()的run-time? __proto__就是Date的design-time的prototype

// new Date()就是Date的構(gòu)造實(shí)例了
new Date() instanceof Date // true. 

關(guān)于 run-time __proto__和design-time prototype,請(qǐng)讀者參考獨(dú)家解析Javascript原型繼承

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/84057.html

相關(guān)文章

  • 2017-07-17 前端日?qǐng)?bào)

    摘要:前端日?qǐng)?bào)精選聽(tīng)說(shuō)你沒(méi)來(lái)總結(jié)個(gè)人使用過(guò)的移動(dòng)端布局方法新特性簡(jiǎn)介用寫(xiě)組件坦然面對(duì)應(yīng)對(duì)前端疲勞中文深入理解筆記函數(shù)前端架構(gòu)經(jīng)驗(yàn)分享系列教程之創(chuàng)建頁(yè)面元素龍?jiān)迫珬O盗薪坛讨ㄎ豁?yè)面元素龍?jiān)迫珬5谄谂c表單驗(yàn)證技術(shù)周刊期知乎 2017-07-17 前端日?qǐng)?bào) 精選 聽(tīng)說(shuō)你沒(méi)來(lái) JSConf 2017?總結(jié)個(gè)人使用過(guò)的移動(dòng)端布局方法 - Rni-L - SegmentFaultNode.js v8....

    caiyongji 評(píng)論0 收藏0
  • JavaScript 編程精解 中文第三版 十一、異步編程

    摘要:回調(diào)異步編程的一種方法是使執(zhí)行慢動(dòng)作的函數(shù)接受額外的參數(shù),即回調(diào)函數(shù)。執(zhí)行異步工作的函數(shù)通常會(huì)在完成工作之前返回,安排回調(diào)函數(shù)在完成時(shí)調(diào)用。它注冊(cè)了一個(gè)回調(diào)函數(shù),當(dāng)解析并產(chǎn)生一個(gè)值時(shí)被調(diào)用。 來(lái)源:ApacheCN『JavaScript 編程精解 中文第三版』翻譯項(xiàng)目原文:Asynchronous Programming 譯者:飛龍 協(xié)議:CC BY-NC-SA 4.0 自豪地采用谷歌...

    GeekQiaQia 評(píng)論0 收藏0
  • HTML+CSS+JAVASCRIPT 高仿低配網(wǎng)頁(yè)版網(wǎng)易云音樂(lè)播放器

    摘要:高仿低配網(wǎng)頁(yè)版網(wǎng)易云音樂(lè)播放器前言沒(méi)有使用任何框架,只是想用最簡(jiǎn)單純的代碼實(shí)現(xiàn)下前臺(tái)后臺(tái)是參考網(wǎng)上的例子寫(xiě)的,代碼是在的基礎(chǔ)上重新寫(xiě)的還有她的姊妹篇網(wǎng)易云音樂(lè)移動(dòng)端,請(qǐng)查看這里寫(xiě)在前頭的話鄙人野生前端一只,專業(yè),自學(xué)前端已經(jīng)一年多了 HTML+CSS+JAVASCRIPT 高仿低配網(wǎng)頁(yè)版網(wǎng)易云音樂(lè)播放器 showImg(https://segmentfault.com/img/remo...

    RaoMeng 評(píng)論0 收藏0
  • HTML+CSS+JAVASCRIPT 高仿低配網(wǎng)頁(yè)版網(wǎng)易云音樂(lè)播放器

    摘要:高仿低配網(wǎng)頁(yè)版網(wǎng)易云音樂(lè)播放器前言沒(méi)有使用任何框架,只是想用最簡(jiǎn)單純的代碼實(shí)現(xiàn)下前臺(tái)后臺(tái)是參考網(wǎng)上的例子寫(xiě)的,代碼是在的基礎(chǔ)上重新寫(xiě)的還有她的姊妹篇網(wǎng)易云音樂(lè)移動(dòng)端,請(qǐng)查看這里寫(xiě)在前頭的話鄙人野生前端一只,專業(yè),自學(xué)前端已經(jīng)一年多了 HTML+CSS+JAVASCRIPT 高仿低配網(wǎng)頁(yè)版網(wǎng)易云音樂(lè)播放器 showImg(https://segmentfault.com/img/remo...

    sean 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<