我為什么突然想寫數(shù)據(jù)類型..
when talking about javascript , always come arcoss with ECMAScript ,and I always want to ask what is the ECMAScript , and javascript the same as it ? or dialect?
of course not ,the core of javascript based on it and javascript is not only for Client, but for Server like Nodejs (its good I think) , I cant say more because I dont know too... so end.
ok..say person language
實際上ECMAScript并沒有定義具體操作web pages 的方法,而javascript做了很多拓展,比如DOM BOM 來操作瀏覽器,今天在看ES6新規(guī)范,看到了symbol,set,map所以跑去看了一下數(shù)據(jù)類型才發(fā)現(xiàn)自己了解 的也挺少的,初學者,我也不太習慣寫文章,也罷,邊寫邊學..
js數(shù)據(jù)類型
js數(shù)據(jù)類型有原始數(shù)據(jù)類型(undefined null boolean number string symbol)
之前在一個前端面試題目中看到j(luò)s基本數(shù)據(jù)類型有哪些: undefined boolean number string object 感覺挺混亂,我的理解是對你定義的變量用 typeof(variable)返回的是前面五個之一,所以才被稱為基本數(shù)據(jù)類型吧? 至于null哪去了 typeof(null)->'object',據(jù)說是歷史遺留問題 : typeof-null 查的資料以后有興趣可以看 /攤手
Ps: typeof只能返回前面五個基本數(shù)據(jù)類型和function(如果想要知道實例是什么類型的對象可以了解一下instanceof運算符)
還有引用數(shù)據(jù)類型(object) 可以看看ECMA-262文檔
An Object is logically acollection of properties. Each property is either a data
property, or an accessor property.
大概意思就是:
js對象邏輯上是一大堆屬性的集合,每個屬性可以是:數(shù)據(jù)屬性和訪問器屬性
在Object上面繼承出很多類型Array() Function() RegExp Data()等等,這里就有一個和Object很像的Map數(shù)據(jù)結(jié)構(gòu)...
while Dynamic language means you dont need to tell js what type a variable is when declaring it as it work out for you auto.
寫多了C你會發(fā)現(xiàn)經(jīng)常被數(shù)據(jù)類型弄得宇宙無敵煩,往往定義出錯會導致結(jié)果相差甚遠,而且一些單片機內(nèi)部比如A/D取值精度也是很蛋疼..
初學者比如我就會覺得很神奇..變量在不同類型之間切換很方便 當然寫程序的時候申明了變量就賦予了特殊的意義 還是不要切來切去吧
細數(shù)原始數(shù)據(jù)類型
其實寫到這里..我有點寫不下去了..既然已經(jīng)寫了這么多了..還是好好把他們都描述一遍畢竟-以后就不用再去到處百度吧
-
undefined
undefined是屬性是一個值
var example
typeof (example); //undefined 聲明了變量未初始化
typeof (example); //undefined 未聲明變量
function example() {
//這是一段省略的程序
return 0; //控制臺輸入example() 輸出 0
return ; //控制臺輸入example() 輸出 undefined
//這是函數(shù)沒有返回一個確定的值
}
var example = new Object();
example.prototype; //新建對象沒有prototype這個值所以undefined
-
null
只有一個值null
undefined表示變量沒有初始化而null則表示找不到對象是一個空對象指針,可以用來清空對象
null == undefined ; //true undefined 是從null派生而來
null === undefined ; //false
-
boolean
布爾型數(shù)據(jù)有兩個值true or false 有兩種轉(zhuǎn)換方式
Boolean(value) ;//顯式轉(zhuǎn)換 返回一個bool值
var example ; //隱式轉(zhuǎn)換 很常見
if(example) {XXX} //example can be "null 0 false ""(empty string) undefined NaN"
ToBoolean轉(zhuǎn)換表
| 輸入 | 結(jié)果 |
|---|---|
| Undefined | false |
| Null | false |
| 布爾型 | 原值 |
| 數(shù)字型 | 當數(shù)值為0或NaN時為false,否則為true |
| 字符串型 | 如果字符串為空則為false,否則true |
| 對象 | true |
-
number
可以表示整數(shù)和浮點數(shù) 有兩個比較特別的值Infinity和-Infinity(無窮大)
Number()函數(shù)也可以轉(zhuǎn)換數(shù)字 如果返回值是一個非數(shù)值則會返回NaN以避免產(chǎn)生異常錯誤 parseInt()/parseFloat()可以接受參數(shù),進行進制轉(zhuǎn)換 缺省值是10
(0.1+0.2) == 0.3 -> false
NaN == NaN -> false
parseInt("0xff") -> 255
parseInt("123.1bl.2") -> 123
parseInt("123.1bl.2",2) -> 1
parseInt("123.1bl.2",8) -> 83
parseInt("0001111") -> 1111
toNumber轉(zhuǎn)換表
| 輸入 | 結(jié)果 |
|---|---|
| Undefined | NaN |
| Null | 0 |
| 布爾值 | true -> 1 false -> 0 |
| 數(shù)值 | 不轉(zhuǎn)換 |
| 字符串 | 見上面的代碼塊 |
| 對象 | DefaultValue |
-
string
不可描述 總之 很豐富 ]屬性以及方法也有很多 需要什么查什么 @.@
toString轉(zhuǎn)換表
| 輸入 | 結(jié)果 |
|---|---|
| Udefined | "unedfined" |
| Null | "null" |
| 布爾型 | 表達式如果是真則返回“true”,否則“false” |
| 數(shù)字型 | 轉(zhuǎn)換成數(shù)字的字符串表達 在控制臺測試可知輸出與輸入位數(shù)、精度 對于非數(shù)字的表達式,返回值是“NaN” |
| 字符串型 | 不進行處理 |
| 對象 | 在ECMAscript中,轉(zhuǎn)換首先調(diào)用toPrimitive函數(shù),調(diào)用對象DefaultValue方法,有就返回結(jié)果 String(Array()) -> "" String({a:1}) -> "[object Object]"
|
-
symbol
這個是ES6新規(guī)范 要不是他.. 我就不會想寫這篇文章了..
可是我還是看不懂.. 囤貨 -> 深入解析 ES6:Symbol
引用數(shù)據(jù)類型
不像C有結(jié)構(gòu)體C++有類,在javascript里面等同于"對象"這個名詞,其他引用類型都從Object引用類型繼承而來.
首先構(gòu)造對象的方法:
var father = { //直接初始化方法
name: "Lilei",
age: 36,
}
father.work = "doctor"; //為對象添加屬性 刪除可以賦undefined
father.worktime = function() { alert("1,2,3,4,5");};
function People(name, age, person) { //構(gòu)造函數(shù)法 參數(shù)可以是另一個對象
this.name = name;
this.age = age;
this.father = person; //這里就不寫閉包了..并不打算現(xiàn)在接觸....
}
var person1 = new People("Hanmeimei", 18,father) //new運算符在后面
People.prototype.work = "student"; //通過原型添加屬性或方法
People.work; //注意輸出 undefined
貼張圖解釋一下
new運算符
簡而言之: new運算符的作用就是構(gòu)造一個對象實例,構(gòu)造函數(shù)可以是像上面People一樣自定義(這時候?qū)?chuàng)建一個隱式引用鏈接到函數(shù)的prototype用于初始化實例對象的proto),也可以是js自帶的構(gòu)造函數(shù)比如Array()等,注意只有構(gòu)造函數(shù)具有prototype而實例沒有只有proto,new出來的對象上下文的this會指向這個對象實例。
原型和原型鏈
在javascript中原型實例指向一個他的原型的的鏈接,然后這個原型對象又有自己的原型,到null 為止,想象出來就是一條鏈子..
感覺和事件冒泡差不多,當我在自己的內(nèi)部找不到某個屬性或者方法的時候就會找自己原型函數(shù)的屬性和方法...
寫的好累 我要去學rails了,下次見 /微笑
2016/11/23
amilyxy