JavaScript規定了幾種語言型別?
JavaScript中的每一個值都有它自己的型別,JavaScript規定了七種語言型別:
1.Undefined
2.Null
3.Boolean
4.String
5.Number
6.Symbol
7.Object
Undefined和Null
:為什麼有的程式設計規範要求用 void 0 代替 undefined?
undefined
undefined型別表示未定義,它的值只有一個:undefined 任何變數賦值前都是undefined型別,值為undefined(而不是null) undefined是一個變數,而非一個關鍵字 需要表達這個值,可以用全域性變數undefined,或者void運算 undefined是一個變數,我們避免無意中被篡改,建議使用void 0來獲取undefined(等價於void (0) )。我們一般不會把變數賦值為undefined,這樣可以保證所有的值為undefined的變數,都是從未賦值的自然狀態。
void運算
語法:void express 或者 void (express) void運算子所做的是,執行表示式express,然後不論表示式是否有返回值,一律返回undefined。 void運算子如果使用括號,括號內必須有表示式,如果是void()會被視為執行名為void的函式,報錯:SyntaxError。
死連結
我們有時候會用href="#"來表示死連結,但是這樣會導致頁面跳到最上面的檢視,#包含了一個位置資訊,預設的錨是#top,也就是網頁的上端。在頁面很長的時候會使用#來定位頁面的具體位置,格式為:#+id
href=javascript:void(0)用來禁止a標籤的跳轉行為,javascript:是偽協議,表示url的內容通過JavaScript執行,void(0)表示不作任何操作。
<a href="javascript: void(0)" onClick="window.open()"><!--點選連結後頁面不動,只打開連結--> <a href="#" onClick="javascript: return false"><!--作用一樣-->
Null
只有一個值,就是null 表示空值,是關鍵字,可以放心使用null關鍵字來獲取null值
String string的意義並非“字串”,而是字串的UTF16編碼,字串的最大長度實際上是受字串編碼長度影響的。最大長度:253 - 1 。 字串是永遠無法變更的,一旦字串被構造出來,無法用任何方式改變字串的內容。 字串把每個UTF16單元當做一個字元來處理,所以處理非BMP(超出 U+0000 - U+FFFF 範圍)的字元時,應該格外小心。這個設計繼承自Java,現實中很少用到BMP之外的字元。
Number
為什麼在 JavaScript 中,0.1+0.2 不等於0.3?
number型別有264- 253+3 個值。 基本符合 IEEE 754-2008 規定的雙精度浮點數規則,但也有額外幾個表達的語言場景(比如不讓除以0出錯,引入了無窮大)。 NaN,佔用了 9007199254740990,這原本是符合 IEEE 規則的數字 Infinity,無窮大 -Infinity,負無窮大 有+0和-0,加法運算中沒有區別,但是除法要區分,“忘記檢測除以 -0,而得到負無窮大”的情況經常會導致錯誤,而區分 +0 和 -0 的方式,正是檢測 1/x 是 Infinity還是-Infinity 根據雙精度浮點數定義,有效的整數範圍是 -0x1fffffffffffff 至 0x1fffffffffffff,無法精確表示此範圍外的整數。 根據雙精度浮點數定義,非整數的Number型別無法用==來比較(三個等號也不行),正確的比較方法是用JavaScript提供的最小精度值:
console.log( 0.1 + 0.2 == 0.3);//false //正確的比較方法
console.log( Math.abs(0.1 + 0.2 - 0.3) <= Number.EPSILON);//true
Symbol
表示獨一無二的值,它是一切非字串的物件key的集合。 Symbol 值通過Symbol函式生成。這就是說,物件的屬性名現在可以有兩種型別,一種是原來就有的字串,另一種就是新增的 Symbol 型別。凡是屬性名屬於 Symbol 型別,就都是獨一無二的,可以保證不會與其他屬性名產生衝突。 Symbol函式可以接受一個字串作為引數,表示對 Symbol 例項的描述,但是即使描述相同,Symbol值也不相等。
let s1 = Symbol('foo'); let s2 = Symbol('foo');
s1 === s2 // false
一些標準中提到的 Symbol,可以在全域性的 Symbol 函式的屬性中找到。例如,我們可以使用 Symbol.iterator 來自定義 for…of 在物件上的行為: var o = new Object
o[Symbol.iterator] = function() {
var v = 0
return {
next: function() {
return { value: v++, done: v > 10 }
}
}
};
for(var v of o)
console.log(v); // 0 1 2 3 ... 9
Object
問題:為什麼給物件新增的方法能用在基本型別上?
JavaScript物件的定義是“屬性的集合”。屬性分為資料屬性和訪問器屬性,二者都是 key-value 結構,key可以是字串或者Symbol型別。 JavaScript的“類”僅僅是執行時物件的一個私有屬性,而JavaScript中是無法自定義型別的。 Number、String 和 Boolean,三個構造器是兩用的,當跟 new 搭配時,它們產生物件,當直接呼叫時,它們表示強制型別轉換。 Symbol 函式比較特殊,直接用 new 呼叫它會丟擲錯誤,但它仍然是Symbol物件的構造器。 我們在原型上新增方法,都可以應用於基本型別。 Symbol.prototype.hello = () => console.log("hello");
var a = Symbol("a");
console.log(typeof a); //symbol,a 並非物件
a.hello(); //hello,有效
上述問題的答案是:運算子提供了裝箱操作,它會根據基礎型別構造一個臨時物件,使得能夠在基礎型別上呼叫對應物件的方法。
裝箱和拆箱
裝箱轉換:基本型別–>物件
每一種基本型別,都在物件中有對應的類,裝箱機制會頻繁產生臨時物件。 使用object函式,可以顯示呼叫裝箱能力。 每一類裝箱物件皆有私有的 Class 屬性,這些屬性可以Object.prototype.toString 獲取。在 JavaScript 中,沒有任何方法可以更改私有的Class 屬性,因此 Object.prototype.toString 是可以準確識別物件對應的基本型別的方法,它比 instanceof 更加準確。 call函式本身會產生裝箱操作,需要配合typeof來區分基本型別還是物件型別。 拆箱轉換:物件–>基本型別
ToPrimitive 函式,它是物件型別到基本型別的轉換 拆箱轉換會嘗試呼叫 valueOf 和 toString 來獲得拆箱後的基本型別。如果valueOf 和 toString都不存在,或者沒有返回基本型別,則會產生TypeError。 物件的運算
var o = {
valueOf : () => {console.log("valueOf"); return {}},
toString : () => {console.log("toString"); return {}}
}
o * 2
// valueOf
// toString
// TypeError
String的拆箱
var o = {
valueOf : () => {console.log("valueOf"); return {}},
toString : () => {console.log("toString"); return {}}
}
o + ""
// toString
// valueOf
// TypeError
原文:https://blog.csdn.net/zhenghaohan1999/article/details/86697162
相關推薦
JavaScript規定了幾種語言型別?
JavaScript中的每一個值都有它自己的型別,JavaScript規定了七種語言型別: 1.Undefined 2.Null 3.Boolean 4.String 5.Number 6.Symbol 7.Object Undefined和Null :為什麼有的程式設計規範要求用 void 0 代替 un
C語言幾種整形型別的區別
今天寫了一道演算法題,碰到long int型別定義的變數,竟然不知道什麼意思。。。 查資料,總結分享如下: int資料型別的位數為16位,short int資料型別的位數也是16位。而long int的位數為32位,可用來儲存比較大的整數。 sho
C#, Java, PHP, Python和Javascript幾種語言的AES加密解密實現
博客 部分 結果 cat stx add 控制 res code 特別提示:本人博客部分有參考網絡其他博客,但均是本人親手編寫過並驗證通過。如發現博客有錯誤,請及時提出以免誤導其他人,謝謝!歡迎轉載,但記得標明文章出處:http://www.cnblogs.com/ma
JavaScript有這幾種測試分類
要去 images 定位 真的 需要 drive google ext 測試環境 譯者按: 也許你討厭測試,但是你不得不面對它,所以至少區分一下單元測試、集成測試與功能測試?對吧… 原文: What are Unit Testing, Integration Testing
幾種語言循環1000000000次的時間
nds main double println num tdi turn 3.0 int 先申明這個並不是測試各種語言的好壞,頂多是和編譯優化程度有關。 c語言: #include <stdio.h>#include <time.h> int m
JS幾種資料型別轉換(最全)
一、轉為字串:使用 .toString或者String。 1、 .toString()方法:注意,不可以轉null和underfined //轉為字串-->toString方法 var bool=true; console.log(bool.toString()); //注意,toSt
JavaScript有這幾種測試
譯者按: 也許你討厭測試,但是你不得不面對它,所以至少區分一下單元測試、整合測試與功能測試?對吧... 原文: What are Unit Testing, Integration Testing and Functional Testing? 譯者: Fundebug 為了保證可讀性,本文采用意譯而非
service幾種訪問型別( LoadBalancer 外網訪問,ClusterIP k8s叢集內訪問,LoadBalancer VPC內網負載均衡)
一、叢集外訪問(負載均衡) kind: ServiceapiVersion: v1 spec: ports: - protocol: TCP port: 4341 targetPort: 8080 nodePort: 30875
flex和java幾種資料型別的轉換
專案中遇到java和flex通訊是資料轉換的問題,flex這東西用的不多,很容易就忘記了。所以就算是記錄下備忘吧。 java <---> felx String-----String Map-----Object(Map格式一般是Map<String,Object&
JS的幾種資料型別
在JavaScript中,一共有六種資料型別,如下圖所示: 一、數字型別(Number) 1、最基本的資料型別; 2、不區分整型數值和浮點型數值; 3、能表示的最大值是±1.7976931348623157乘以10的308次方;能表示的最小值是±5 乘以10的-324次方; 4、包含十
模運算(附加幾種資料型別的資料範圍判斷)-hdu3123
題目連結:http://acm.hdu.edu.cn/showproblem.php?pid=3123 預備知識點: (a+b)%m=[(a%m)+(b%m)]%m(a*b)%m=[(a%m)*(b%m)]%m所以(0!+1!+2!+.....+n!)%m=[(0!%m+1!%m)%m+(1!%m)*(2
網際網路技術學習29——redis幾種資料型別
Redis一共分5中基本資料型別: String、Hash、List、Set、ZSet String型別 String型別是包含很多種型別的特殊型別,並且是二進位制安全的。比如對序列化的物件進行儲存,比如一張圖片進行二進位制儲存,比如一額簡單的字串數值等等。 設定值 set nam
【轉】MySQL— 索引 Mysql幾種索引型別的區別及適用情況
【轉】MySQL— 索引 目錄 一、索引 二、索引型別 三、索引種類 四、操作索引 五、建立索引的時機 六、命中索引 七、其它注意事項 八、LIMIT分頁 九、執行計劃 十、慢查詢日誌 一、索引 MySQL索引的建立對於MySQL的高效執行是很重要的,
應該在同一個Kafka主題中放入幾種事件型別嗎?
採用Apache Kafka等流平臺,有個很重要的問題是:將使用哪些主題?特別是,如果要將一堆不同的事件作為訊息釋出到Kafka,是將它們放在同一主題中,還是將它們拆分為不同的主題? 主題最重要的功能是允許使用者指定它想要使用的訊息子集。在一個極端情況下,所有資料都放在一個主題中可不是一個好主意,因為這意味
sql中的幾種連線型別
一、連線型別簡介 在sql中單表查詢的機率相對來說比較少,隨著資料庫的日益複雜,多表關聯的情況越來越多,在多表關聯的情況下存在多種關聯的型別, 1、自關聯(join或inner join) 2、左外關聯(left join或left outer join) 3、右外關聯(right join或right ou
幾種不同型別陣列與指標的關係
1)整形陣列與指標 int a[5]={1,2,3,4,5}; int *p=a;//其實指標p也相當於是陣列名,p[i]=a[i];指向陣列首地址,即a[0]地址; cout<<p;即輸出陣列a的首地址;(與cout<<&a[0]等價 ) cout<&
常見的幾種異常型別Exception
常見異常型別; 算數異常類:ArithmeticExecption 空指標異常型別:NullPointerException 型別強制轉換型別:ClassCastException 陣列負下標異常:NegativeArrayException 陣列下標越界異常:A
常見的幾種異常型別 Exception
常見異常型別:Java中的異常分為兩大類: 1.Checked Exception(非Runtime Exception) 2.Unchecked Exception(Runtime Exce
java中常用的幾種快取型別介紹
在平時的開發中會經常用到快取,比如locache、redis等,但一直沒有對快取有過比較全面的總結。下面從什麼是快取、為什麼使用快取、快取的分類以及對每種快取的使用分別進行分析,從而對快取有更深入的瞭解。 1.什麼是快取 在使用快取前我們應該瞭解什麼是快取,下面是維基百科上面對於快取的定義:
MySQL幾種資料型別精度和標度的情況
1、整型 int預設是int(11),建立欄位int(5),當儲存的資料長度大於5時,可以正常儲存,儲存的資料完整顯示; 2、浮點型 float(M,D)和double(M,D) 如果不寫精度和標度,則會按照實際精度值顯示,如果有精度和標度,則會自動將四捨五入的結果插入,不