国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

重學(xué)前端學(xué)習(xí)筆記(六)--JavaScript類型有哪些你不知道的細(xì)節(jié)?

zlyBear / 3004人閱讀

摘要:的碼點(diǎn)被稱為基本字符區(qū)域。關(guān)于的介紹,我準(zhǔn)備用文檔阮一峰來做一些介紹,具體的可以參考文檔引入的原因的對(duì)象屬性名都是字符串,這容易造成屬性名的沖突。其他的一些屬性可以去看文檔阮一峰注意函數(shù)前不能使用命令,否則會(huì)報(bào)錯(cuò)。

筆記說明
重學(xué)前端是程劭非(winter)【前手機(jī)淘寶前端負(fù)責(zé)人】在極客時(shí)間開的一個(gè)專欄,每天10分鐘,重構(gòu)你的前端知識(shí)體系,筆者主要整理學(xué)習(xí)過程的一些要點(diǎn)筆記以及感悟,完整的可以加入winter的專欄學(xué)習(xí)【原文有winter的語音】,如有侵權(quán)請(qǐng)聯(lián)系我,郵箱:kaimo313@foxmail.com。
JavaScript類型有哪些你不知道的細(xì)節(jié)? winter提了幾個(gè)問題測(cè)試:能回答對(duì)幾個(gè)?

1、為什么有的編程規(guī)范要求用 void 0 代替 undefined?

2、字符串有最大長度嗎?

3、0.1 + 0.2 不是等于 0.3 么?為什么 JavaScript 里不是這樣的?

4、ES6 新加入的 Symbol 是個(gè)什么東西?

5、為什么給對(duì)象添加的方法能用在基本類型上?

如果有點(diǎn)猶豫,不妨看看下面的介紹,或者找找資料溫習(xí)一下。
類型

Undefined

Null

Boolean

String

Number

Symbol

Object

1、Undefined、Null

Undefined:

Undefined 類型表示未定義,它的類型只有一個(gè)值,就是 undefined

任何變量在賦值前是 Undefined 類型、值為 undefined

JavaScript 的代碼 undefined 是一個(gè)變量,而并非是一個(gè)關(guān)鍵字,這是 JavaScript 語言公認(rèn)的設(shè)計(jì)失誤之一

為了避免無意中被篡改,可以使用 void 0 來獲取 undefined 值。

Null:

Null 類型也只有一個(gè)值,就是 null,它的語義表示空值

與 undefined 不同,null 是 JavaScript 關(guān)鍵字

在任何代碼中,都可以用 null 關(guān)鍵字來獲取null值

2、String

String 用于表示文本數(shù)據(jù)

String 有最大長度是 2^53 - 1

字符串的最大長度,實(shí)際上是受字符串的編碼長度影響的。

Note: 現(xiàn)行的字符集國際標(biāo)準(zhǔn),字符是以 Unicode 的方式表示的,每一個(gè) Unicode 的碼點(diǎn)表示一個(gè)字符,理論上,Unicode 的范圍是無限的。UTF 是 Unicode 的編碼方式,規(guī)定了碼點(diǎn)在計(jì)算機(jī)中的表示方法,常見的有 UTF16 和 UTF8。Unicode 的碼點(diǎn)通常用 U+??? 來表示,其中 ??? 是十六進(jìn)制的碼點(diǎn)值。0-65536(U+0000 - U+FFFF)的碼點(diǎn)被稱為基本字符區(qū)域(BMP)。
3、Number

JavaScript 中的 Number 類型有 18437736874454810627(即 2^64-2^53+3) 個(gè)值

NaN,占用了 9007199254740990,這原本是符合 IEEE 規(guī)則的數(shù)字

Infinity,無窮大

-Infinity,負(fù)無窮大

根據(jù)雙精度浮點(diǎn)數(shù)的定義,Number 類型中有效的整數(shù)范圍是-0x1fffffffffffff 至 0x1fffffffffffff,所以 Number 無法精確表示此范圍外的整數(shù)

根據(jù)浮點(diǎn)數(shù)的定義,非整數(shù)的 Number 類型無法用 ==(=== 也不行)來比較

關(guān)于javaScript中 0.1 + 0.2 == 0.3 ? 這個(gè)問題的解釋:

console.log( 0.1 + 0.2 == 0.3);
>> false

輸出結(jié)果為false,說明兩邊不相等,這是浮點(diǎn)運(yùn)算特點(diǎn)導(dǎo)致的,實(shí)際上,這里錯(cuò)誤的不是結(jié)論,而是比較的方法,正確的比較方法是使用javaScript提供的最小精度值:

我們可以查找MDN文檔的Number可以找到屬性EPSILON

Number.EPSILON:兩個(gè)可表示數(shù)字之間的最小間隔
console.log( Math.abs(0.1 + 0.2 - 0.3) <= Number.EPSILON);
>> true

這樣的比較輸出結(jié)果為true檢查等式左右兩邊差的絕對(duì)值是否小于最小精度,才是正確的比較浮點(diǎn)數(shù)的方法

4、Symbol

關(guān)于Symbol的介紹,我準(zhǔn)備用ES6文檔-阮一峰來做一些介紹,具體的可以參考文檔

4.1、ES6 引入Symbol的原因
ES5 的對(duì)象屬性名都是字符串,這容易造成屬性名的沖突。ES6引入了一種新的原始數(shù)據(jù)類型Symbol,表示獨(dú)一無二的值。從根本上防止屬性名的沖突。
4.2、介紹
凡是屬性名屬于 Symbol 類型,就都是獨(dú)一無二的,可以保證不會(huì)與其他屬性名產(chǎn)生沖突。

4.2.1、Symbol 值通過Symbol函數(shù)生成,先來一段代碼:

let s = Symbol();
typeof s
>> "symbol"

上面代碼中,變量s就是一個(gè)獨(dú)一無二的值。sSymbol數(shù)據(jù)類型。

4.2.2、Symbol函數(shù)可以接受一個(gè)字符串作為參數(shù),表示對(duì) Symbol 實(shí)例的描述

let s1 = Symbol("foo");
let s2 = Symbol("bar");

s1
>> Symbol(foo)
s2
>> Symbol(bar)

s1.toString()
>> "Symbol(foo)"

s2.toString()
>> "Symbol(bar)"

上面代碼中,s1s2是兩個(gè) Symbol 值。如果不加參數(shù),它們?cè)诳刂婆_(tái)的輸出都是Symbol(),不利于區(qū)分。有了參數(shù)以后,就等于為它們加上了描述,輸出的時(shí)候就能夠分清,到底是哪一個(gè)值。

4.2.3、如果 Symbol 的參數(shù)是一個(gè)對(duì)象,就會(huì)調(diào)用該對(duì)象的toString方法,將其轉(zhuǎn)為字符串,然后才生成一個(gè) Symbol 值。

const obj = {
    a: "123123",
    toString() {
        return "iuoisigud";
    }
};
const sym = Symbol(obj);

sym // Symbol(iuoisigud)

4.2.4、Symbol函數(shù)的參數(shù)只是表示對(duì)當(dāng)前 Symbol 值的描述,因此相同參數(shù)的Symbol函數(shù)的返回值是不相等的。

// 沒有參數(shù)的情況
let s1 = Symbol();
let s2 = Symbol();

s1 === s2 // false

// 有參數(shù)的情況
let s1 = Symbol("foo");
let s2 = Symbol("foo");

s1 === s2 // false

4.2.5、Symbol 值不能與其他類型的值進(jìn)行運(yùn)算,會(huì)報(bào)錯(cuò)。

let sym = Symbol("My symbol");

"your symbol is " + sym
// TypeError: can"t convert symbol to string
`your symbol is ${sym}`
// TypeError: can"t convert symbol to string

4.2.6、Symbol 值可以顯式轉(zhuǎn)為字符串,也可以轉(zhuǎn)為布爾值,但是不能轉(zhuǎn)為數(shù)值。

let sym = Symbol("My symbol");

String(sym) // "Symbol(My symbol)"
sym.toString() // "Symbol(My symbol)"

let sym = Symbol();
Boolean(sym) // true
!sym  // false

Number(sym) // TypeError
sym + 2 // TypeError

4.2.7、其他的一些屬性可以去看ES6文檔-阮一峰

4.3、注意
Symbol函數(shù)前不能使用new命令,否則會(huì)報(bào)錯(cuò)。這是因?yàn)樯傻?Symbol 是一個(gè)原始類型的值,不是對(duì)象。也就是說,由于 Symbol 值不是對(duì)象,所以不能添加屬性。基本上,它是一種類似于字符串的數(shù)據(jù)類型
5、Object
Object 是 JavaScript 中最復(fù)雜的類型,也是 JavaScript 的核心機(jī)制之一。
為什么給對(duì)象添加的方法能用在基本類型上?

回答:“運(yùn)算符提供了裝箱操作,它會(huì)根據(jù)基礎(chǔ)類型構(gòu)造一個(gè)臨時(shí)對(duì)象,使得我們能在基礎(chǔ)類型上調(diào)用對(duì)應(yīng)對(duì)象的方法。”

比如原型上添加方法,也可以應(yīng)用于基本類型:

Symbol.prototype.hello = () => console.log("hello");

var a = Symbol("a");
console.log(typeof a); //symbol,a 并非對(duì)象
a.hello(); //hello,有效
6、類型轉(zhuǎn)換 6.1、臭名昭著的“ == ”運(yùn)算

因?yàn)?JS 是弱類型語言,所以類型轉(zhuǎn)換發(fā)生非常頻繁

“ == ”試圖實(shí)現(xiàn)跨類型的比較,它的規(guī)則復(fù)雜到幾乎沒人可以記住。

6.2、轉(zhuǎn)換規(guī)則

6.3、StringToNumber
字符串到數(shù)字的類型轉(zhuǎn)換,存在一個(gè)語法結(jié)構(gòu),類型轉(zhuǎn)換支持十進(jìn)制、二進(jìn)制、八進(jìn)制和十六進(jìn)制

比如:

Number("0xFF")
>> 255
6.4、裝箱轉(zhuǎn)換
裝箱(boxing):值類型實(shí)例到對(duì)象的轉(zhuǎn)換,它暗示在運(yùn)行時(shí)實(shí)例將攜帶完整的類型信息,并在堆中分配。

每一種基本類型 NumberStringBooleanSymbol 在對(duì)象中都有對(duì)應(yīng)的類,所謂裝箱轉(zhuǎn)換,正是把基本類型轉(zhuǎn)換為對(duì)應(yīng)的對(duì)象,它是類型轉(zhuǎn)換中一種相當(dāng)重要的種類。

例子:利用一個(gè)函數(shù)的 call 方法來強(qiáng)迫產(chǎn)生Symbol裝箱
var symbolObject = (function() {
    return this;
}).call(Symbol("a"));

console.log(typeof symbolObject); //object
console.log(symbolObject instanceof Symbol); //true
console.log(symbolObject.constructor == Symbol); //true
例子:使用內(nèi)置的 Object 函數(shù),我們可以在 JavaScript 代碼中顯式調(diào)用裝箱能力。
var symbolObject = Object(Symbol("a"));

console.log(typeof symbolObject); //object
console.log(symbolObject instanceof Symbol); //true
console.log(symbolObject.constructor == Symbol); //true
每一類裝箱對(duì)象皆有私有的 Class 屬性,這些屬性可以用 Object.prototype.toString 獲取:
var symbolObject = Object(Symbol("a"));

console.log(Object.prototype.toString.call(symbolObject));
>> [object Symbol]
6.5、拆箱轉(zhuǎn)換
拆箱(unboxing):是將引用類型轉(zhuǎn)換為值類型

6.5.1、在 JavaScript 標(biāo)準(zhǔn)中,規(guī)定了 ToPrimitive 函數(shù),它是對(duì)象類型到基本類型的轉(zhuǎn)換

toPrimitive(input, preferedType)

input是輸入的值,preferedType是期望轉(zhuǎn)換的類型,它可以是字符串,也可以是數(shù)字。

inputType Result
Undefined input argument
Null input argument
Boolean input argument
Number input argument
String input argument
Object 忽略 第二個(gè)參數(shù) hint PreferredType 直接調(diào)用內(nèi)置方法 [[DefaultValue]]

6.5.2、如果轉(zhuǎn)換的類型是number,會(huì)執(zhí)行以下步驟:參考博客

如果input是原始值,直接返回這個(gè)值;

否則,如果input是對(duì)象,調(diào)用input.valueOf(),如果結(jié)果是原始值,返回結(jié)果;

否則,調(diào)用input.toString()。如果結(jié)果是原始值,返回結(jié)果;

否則,拋出錯(cuò)誤。

6.5.3、如果轉(zhuǎn)換的類型是String,2和3會(huì)交換執(zhí)行,即先執(zhí)行toString()方法。

例子1:先將兩個(gè)操作數(shù)轉(zhuǎn)換為string,然后進(jìn)行拼接

[] + []
>> ""

[] -----> ""
[] -----> ""

[] + [] = ""

例子2:先將兩個(gè)操作數(shù)轉(zhuǎn)換為string,然后進(jìn)行拼接

[] + {}
>> "[object Object]"

// 解釋
[] -----> ""
{} -----> "[object Object]"

[] + {} = "[object Object]"

例子3:js解釋器會(huì)將開頭的 {} 看作一個(gè)代碼塊,而不是一個(gè)js對(duì)象

{} + []
>> 0

// 真正參與運(yùn)算的是 + []
// {} + [] 等價(jià)于 + []
7、規(guī)范類型

List 和 Record: 用于描述函數(shù)傳參過程。

Set:主要用于解釋字符集等。

Completion Record:用于描述異常、跳出等語句執(zhí)行過程。

Reference:用于描述對(duì)象屬性訪問、delete 等。

Property Descriptor:用于描述對(duì)象的屬性。

Lexical Environment 和 Environment Record:用于描述變量和作用域。

Data Block:用于描述二進(jìn)制數(shù)據(jù)。

8、補(bǔ)充閱讀 typeof 的運(yùn)算結(jié)果,與運(yùn)行時(shí)類型的規(guī)定有很多不一致的地方(typeof 的設(shè)計(jì)是有缺陷的)

個(gè)人總結(jié)

在整理知識(shí)點(diǎn)的時(shí)候,我就發(fā)現(xiàn),我可能是真的劃水醬_(:3」∠)_,里面大部分的東西很模糊,有點(diǎn)都不清不楚的,還有的沒有聽過,看來要好好打打基礎(chǔ)了,現(xiàn)在前端的發(fā)展過于太快了,而自己的基礎(chǔ)又不牢固,能跟著winter學(xué)習(xí)是我的幸運(yùn),不過在這里要感謝一個(gè)大佬的推薦,stormzhang,公眾號(hào)也是這個(gè),我的學(xué)習(xí)榜樣來的,哈哈哈哈哈。

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

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

相關(guān)文章

  • 重學(xué)前端學(xué)習(xí)筆記)--JavaScript類型哪些你不知道細(xì)節(jié)

    摘要:的碼點(diǎn)被稱為基本字符區(qū)域。關(guān)于的介紹,我準(zhǔn)備用文檔阮一峰來做一些介紹,具體的可以參考文檔引入的原因的對(duì)象屬性名都是字符串,這容易造成屬性名的沖突。其他的一些屬性可以去看文檔阮一峰注意函數(shù)前不能使用命令,否則會(huì)報(bào)錯(cuò)。 筆記說明 重學(xué)前端是程劭非(winter)【前手機(jī)淘寶前端負(fù)責(zé)人】在極客時(shí)間開的一個(gè)專欄,每天10分鐘,重構(gòu)你的前端知識(shí)體系,筆者主要整理學(xué)習(xí)過程的一些要點(diǎn)筆記以及感悟,完...

    Lsnsh 評(píng)論0 收藏0
  • 重學(xué)前端學(xué)習(xí)筆記)--JavaScript類型哪些你不知道細(xì)節(jié)

    摘要:的碼點(diǎn)被稱為基本字符區(qū)域。關(guān)于的介紹,我準(zhǔn)備用文檔阮一峰來做一些介紹,具體的可以參考文檔引入的原因的對(duì)象屬性名都是字符串,這容易造成屬性名的沖突。其他的一些屬性可以去看文檔阮一峰注意函數(shù)前不能使用命令,否則會(huì)報(bào)錯(cuò)。 筆記說明 重學(xué)前端是程劭非(winter)【前手機(jī)淘寶前端負(fù)責(zé)人】在極客時(shí)間開的一個(gè)專欄,每天10分鐘,重構(gòu)你的前端知識(shí)體系,筆者主要整理學(xué)習(xí)過程的一些要點(diǎn)筆記以及感悟,完...

    joyvw 評(píng)論0 收藏0
  • 重學(xué)前端學(xué)習(xí)筆記(二十)--try里面放return,finally還會(huì)執(zhí)行嗎?

    摘要:二類型執(zhí)行了但是沒有立即返回,而是先執(zhí)行了中的覆蓋了中的。普通語句執(zhí)行后,會(huì)得到為的,引擎遇到這樣的,會(huì)繼續(xù)執(zhí)行下一條語句。控制類語句分成兩部分對(duì)其內(nèi)部造成影響如。 筆記說明 重學(xué)前端是程劭非(winter)【前手機(jī)淘寶前端負(fù)責(zé)人】在極客時(shí)間開的一個(gè)專欄,每天10分鐘,重構(gòu)你的前端知識(shí)體系,筆者主要整理學(xué)習(xí)過程的一些要點(diǎn)筆記以及感悟,完整的可以加入winter的專欄學(xué)習(xí)【原文有wint...

    tolerious 評(píng)論0 收藏0
  • 重學(xué)前端學(xué)習(xí)筆記(二十)--try里面放return,finally還會(huì)執(zhí)行嗎?

    摘要:二類型執(zhí)行了但是沒有立即返回,而是先執(zhí)行了中的覆蓋了中的。普通語句執(zhí)行后,會(huì)得到為的,引擎遇到這樣的,會(huì)繼續(xù)執(zhí)行下一條語句。控制類語句分成兩部分對(duì)其內(nèi)部造成影響如。 筆記說明 重學(xué)前端是程劭非(winter)【前手機(jī)淘寶前端負(fù)責(zé)人】在極客時(shí)間開的一個(gè)專欄,每天10分鐘,重構(gòu)你的前端知識(shí)體系,筆者主要整理學(xué)習(xí)過程的一些要點(diǎn)筆記以及感悟,完整的可以加入winter的專欄學(xué)習(xí)【原文有wint...

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

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

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<