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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM