摘要:支持的類型的內(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 symbolbool, 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.lengthundefined 和 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)有包裝類
symbolES6新增的基本類型,只支持函數(shù)式賦值,不支持字面量和函數(shù)構(gòu)造。
var sim = Symbol("IBM") // ok sim // Symbol("IBM") typeof sim // "symbol" sim = new Symbol("IBM") // TypeError: Symbol is not a constructorfunction 和 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
摘要:前端日?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....
摘要:回調(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 自豪地采用谷歌...
摘要:高仿低配網(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...
摘要:高仿低配網(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...
閱讀 2607·2021-09-29 09:34
閱讀 3417·2021-09-23 11:21
閱讀 2595·2021-09-06 15:00
閱讀 1184·2019-08-30 15:44
閱讀 2093·2019-08-29 17:23
閱讀 3084·2019-08-29 16:44
閱讀 3123·2019-08-29 13:13
閱讀 2038·2019-08-28 18:12