JS學(xué)習(xí)筆記2

JS中的數(shù)據(jù)類型
在JS中一共有六種數(shù)據(jù)類型
* String 字符串
* Number 數(shù)值
* Boolean 布爾值
* Null 空值
* Undefined 未定義
* Object 對象

number
* Number.MAX_VALUE
* 1.7976931348623157e+308
* Number.MIN_VALUE 大于0的最小值
* 5e-324
*NaN 是一個特殊的數(shù)字,表示Not A Number,使用typeof檢查一個NaN也會返回number
*JS中浮點數(shù)的計算準確性得不到保證

null
使用typeof檢查一個null值時,會返回object

undefined
Undefined(未定義)類型的值只有一個,就undefind
當聲明一個變量,但是并不給變量賦值時,它的值就是undefined

數(shù)據(jù)類型轉(zhuǎn)換
將其他的數(shù)據(jù)類型轉(zhuǎn)換為String
方式一:
- 調(diào)用被轉(zhuǎn)換數(shù)據(jù)類型的toString()方法
-number也有toString()方法,可以帶一個參數(shù)指定轉(zhuǎn)換后的進制,默認為u十進制

- 該方法不會影響到原變量,它會將轉(zhuǎn)換的結(jié)果返回
- 但是注意:null和undefined這兩個值沒有toString()方法,
                    如果調(diào)用他們的方法,會報錯

方式二:
- 調(diào)用String()函數(shù),并將被轉(zhuǎn)換的數(shù)據(jù)作為參數(shù)傳遞給函數(shù)
- 使用String()函數(shù)做強制類型轉(zhuǎn)換時,對于Number和Boolean實際上就是調(diào)用的toString()方法,但是對于null和undefined,就不會調(diào)用toString()方法,它會將 null 直接轉(zhuǎn)換為 "null",將 undefined 直接轉(zhuǎn)換為 "undefined"

將其他的數(shù)據(jù)類型轉(zhuǎn)換為Number
轉(zhuǎn)換方式一:
使用Number()函數(shù)
- 字符串 --> 數(shù)字
1.如果是純數(shù)字的字符串,則直接將其轉(zhuǎn)換為數(shù)字
2.如果字符串中有非數(shù)字的內(nèi)容,則轉(zhuǎn)換為NaN
3.如果字符串是一個空串或者是一個全是空格的字符串,則轉(zhuǎn)換為0
- 布爾 --> 數(shù)字
true 轉(zhuǎn)成 1
false 轉(zhuǎn)成 0
- null --> 數(shù)字 0
- undefined --> 數(shù)字 NaN
轉(zhuǎn)換方式二:
- 這種方式專門用來對付字符串
- parseInt() 把一個字符串轉(zhuǎn)換為一個整數(shù)(可以在parseInt()中傳遞一個第二個參數(shù),來指定數(shù)字的進制)
- parseFloat() 把一個字符串轉(zhuǎn)換為一個浮點數(shù)

將其他的數(shù)據(jù)類型轉(zhuǎn)換為Boolean
* - 使用Boolean()函數(shù)
* - 數(shù)字 ---> 布爾
* - 除了0和NaN,其余的都是true
*
* - 字符串 ---> 布爾
* - 除了空串,其余的都是true
*
* - null和undefined都會轉(zhuǎn)換為false
*
* - 對象也會轉(zhuǎn)換為true

運算符

  • 任何值做- * /運算時都會自動轉(zhuǎn)換為Number
    * 我們可以利用這一特點做隱式的類型轉(zhuǎn)換
    * 可以通過為一個值 -0 *1 /1來將其轉(zhuǎn)換為Number
    * 原理和Number()函數(shù)一樣,使用起來更加簡單
  • 對于非Number類型的值,
    * 它會將先轉(zhuǎn)換為Number,然后在運算
    * 可以對一個其他的數(shù)據(jù)類型使用+,來將其轉(zhuǎn)換為number 如:1 + + “2” = 3;
    * 它的原理和Number()函數(shù)一樣

相等運算符

  • == 表示相等 !=表示不等(可以是發(fā)生自動數(shù)據(jù)類型轉(zhuǎn)換后相等)
  • ===表示全等 !==表示不全等I(等號左右兩邊數(shù)據(jù)類型必須嚴格一致)
    undefined 衍生自 null,做相等判斷是會返回true
    NaN不和任何值相等,包括它本身(可以通過isNaN()函數(shù)來判斷一個值是否為NaN)

優(yōu)先級
與(&&)的優(yōu)先級高于或(||)的優(yōu)先級,通常情況下,用()來改變運算的優(yōu)先級

計時器

  • console.time("計時器的名字")可以用來開啟一個計時器,console.timeEnd()用來停止一個計時器,需要一個計時器的名字作為參數(shù),可以用這種方法獲取指定代碼塊的執(zhí)行時間

JS中的對象

  • 對象的分類:
    1.內(nèi)建對象
    - 由ES標準中定義的對象,在任何的ES的實現(xiàn)中都可以使用
    - 比如:Math String Number Boolean Function Object....
    2.宿主對象

    • 由JS的運行環(huán)境提供的對象,目前來講主要指由瀏覽器提供的對象
      • 比如 BOM DOM
        3.自定義對象
    • 由開發(fā)人員自己創(chuàng)建的對象
  • 使用工廠方法創(chuàng)建的對象,使用的構(gòu)造函數(shù)都是Object,內(nèi)部使用的是new Object()方法創(chuàng)建對象,而使用構(gòu)造函數(shù)創(chuàng)建對象,則是用this指向正在創(chuàng)建的對象,對象作為返回值傳出去,構(gòu)造函數(shù)的首字母大寫

  • in 運算符,通過該運算符可以檢查一個對象中是否含有指定的屬性,有則返回true,否則返回false;

  • 如果要使用特殊的屬性名,不能采用.的方式來操作,而是采用[] 進行屬性的操作,更加靈活

JS中變量的存儲

  • 基本數(shù)據(jù)類型的值直接在棧內(nèi)存中存儲,比較時比較值的大小
  • 對象是保存到堆內(nèi)存中的,每創(chuàng)建一個新的對象,就會在堆內(nèi)存中開辟出一個新的空間,而變量保存的是對象的內(nèi)存地址(對象的引用),如果兩個變量保存的是同一個對象引用,當一個通過一個變量修改屬性時,另一個也會受到影響,比較時比較二者的地址是否相同

函數(shù) function

  • 函數(shù)也是一個對象

  • 函數(shù)中可以封裝一些功能(代碼),在需要時可以執(zhí)行這些功能(代碼)

  • 函數(shù)中可以保存一些代碼在需要的時候調(diào)用

  • 使用typeof檢查一個函數(shù)對象時,會返回function

  • 調(diào)用函數(shù)時解析器不會檢查實參的類型,函數(shù)的實參可以是任意的數(shù)據(jù)類型,調(diào)用函數(shù)時,解析器也不會檢查實參的數(shù)量,多余實參不會被賦值,如果實參的數(shù)量少于形參的數(shù)量,則沒有對應(yīng)實參的形參將是undefined

  • 使用 return 來設(shè)置函數(shù)的返回值,如果return語句后不跟任何值就相當于返回一個undefined,如果函數(shù)中不寫return,則也會返回undefined

  • 立即執(zhí)行函數(shù)(即匿名函數(shù)對象)

    • 函數(shù)定義完,立即被調(diào)用,這種函數(shù)叫做立即執(zhí)行函數(shù)
    • 立即執(zhí)行函數(shù)往往只會執(zhí)行一次
  • 枚舉對象中的屬性
    使用for ... in ,語句語法:

              for(var 變量 in 對象){
              
                  }
    

for...in語句 對象中有幾個屬性,循環(huán)體就會執(zhí)行幾次,每次執(zhí)行時,會將對象中的一個屬性的名字賦值給變量

作用域

  • 全局作用域
    1.直接編寫在script標簽中的JS代碼,都在全局作用域
    2.全局作用域在頁面打開時創(chuàng)建,在頁面關(guān)閉時銷毀
    3.在全局作用域中有一個全局對象window,它代表的是一個瀏覽器的窗口,它由瀏覽器創(chuàng)建我們可以直接使用
    4.在全局作用域中:創(chuàng)建的變量都會作為window對象的屬性保存,創(chuàng)建的函數(shù)都會作為window對象的方法保存
    5.全局作用域中的變量都是全局變量,在頁面的任意的部分都可以訪問的到

  • 函數(shù)作用域
    1.調(diào)用函數(shù)時創(chuàng)建函數(shù)作用域,函數(shù)執(zhí)行完畢以后,函數(shù)作用域銷毀
    2.- 每調(diào)用一次函數(shù)就會創(chuàng)建一個新的函數(shù)作用域,他們之間是互相獨立的
    3.- 在函數(shù)作用域中可以訪問到全局作用域的變量,在全局作用域中無法訪問到函數(shù)作用域的變量
    4.- 當在函數(shù)作用域操作一個變量時,它會先在自身作用域中尋找,如果有就直接使用,如果沒有則向上一級作用域中尋找,直到找到全局作用域,如果全局作用域中依然沒有找到,則會報錯ReferenceError
    5.- 在函數(shù)中要訪問全局變量可以使用window對象

this
解析器在調(diào)用函數(shù)每次都會向函數(shù)內(nèi)部傳遞進一個隱含的參數(shù),這個參數(shù)就是this,this指向一個對象,這個對象我們稱為函數(shù)執(zhí)行的上下文對象,根據(jù)調(diào)用方式不同,this指向的對象也不同
1.以函數(shù)的形式調(diào)用時,this永遠都是window
2.以方法的形式調(diào)用時,this就是調(diào)用方法的那個對象

原型

  • 原型 prototype
    *
    * 我們所創(chuàng)建的每一個函數(shù),解析器都會向函數(shù)中添加一個屬性prototype,這個屬性對應(yīng)著一個對象,這個對象就是我們所謂的原型對象
    * 如果函數(shù)作為普通函數(shù)調(diào)用prototype沒有任何作用
    *
    * 當函數(shù)以構(gòu)造函數(shù)的形式調(diào)用時,它所創(chuàng)建的對象中都會有一個隱含的屬性,指向該構(gòu)造函數(shù)的原型對象,我們可以通過__proto__來訪問該屬性
    *
    * 原型對象就相當于一個公共的區(qū)域,所有同一個類的實例都可以訪問到這個原型對象,我們可以將對象中共有的內(nèi)容,統(tǒng)一設(shè)置到原型對象中。
    *
    * 當我們訪問對象的一個屬性或方法時,它會先在對象自身中尋找,如果有則直接使用,如果沒有則會去原型對象中尋找,如果找到則直接使用
    *
    * 以后我們創(chuàng)建構(gòu)造函數(shù)時,可以將這些對象共有的屬性和方法,統(tǒng)一添加到構(gòu)造函數(shù)的原型對象中,這樣不用分別為每一個對象添加,也不會影響到全局作用域,就可以使每個對象都具有這些屬性和方法了

  • 使用in檢查對象中是否含有某個屬性時,如果對象中沒有但是原型中有,也會返回true。可以使用對象的hasOwnProperty()來檢查對象自身中是否含有該屬性

  • 當我們直接在頁面中打印一個對象時,事實上是輸出的對象的toString()方法的返回值
    如果我們希望在輸出對象時不輸出[object Object],可以為對象添加一個toString()方法

垃圾回收(GC)
JS中有自動的垃圾回收機制,會自動將這些垃圾對象從內(nèi)存中銷毀,我們需要做的只是要將不再使用的對象設(shè)置null即可

數(shù)組的常用方法

  • push(),該方法可以向數(shù)組的末尾添加一個或多個元素,并返回數(shù)組的新的長度

  • pop(),該方法可以刪除數(shù)組的最后一個元素,并將被刪除的元素作為返回值返回

  • unshift(),向數(shù)組開頭添加一個或多個元素,并返回新的數(shù)組長度

  • shift(),可以刪除數(shù)組的第一個元素,并將被刪除的元素作為返回值返回

  • foreach()遍歷數(shù)組(該方法不兼容IE8及以下)
    forEach()方法需要一個函數(shù)作為參數(shù)
    * 像這種函數(shù),由我們創(chuàng)建但是不由我們調(diào)用的,我們稱為回調(diào)函數(shù)
    * 數(shù)組中有幾個元素函數(shù)就會執(zhí)行幾次,每次執(zhí)行時,瀏覽器會將遍歷到的元素以實參的形式傳遞進來,我們可以來定義形參,來讀取這些內(nèi)容
    * 瀏覽器會在回調(diào)函數(shù)中傳遞三個參數(shù):
    * 第一個參數(shù),就是當前正在遍歷的元素
    * 第二個參數(shù),就是當前正在遍歷的元素的索引
    * 第三個參數(shù),就是正在遍歷的數(shù)組

        arr.forEach(function(value , index , obj){
              console.log(value);
          });
    
  • slice(),可以用來從數(shù)組提取指定元素,該方法不會改變元素數(shù)組,而是將截取到的元素封裝到一個新數(shù)組中返回,包含兩個參數(shù),開始索引和結(jié)束索引,截取時遵循左閉右開的原則,當?shù)诙€參數(shù)省略時則會截取其后所有元素,當?shù)诙€參數(shù)為負數(shù)時,表示從后往前數(shù),-1表示倒數(shù)第一個

  • splice(),可以用于刪除數(shù)組中的指定元素,使用splice()會影響到原數(shù)組,會將指定元素從原數(shù)組中刪除,并將被刪除的元素作為返回值返回,可以包含多個參數(shù),第一個參數(shù)表示開始索引,第二個參數(shù)表示要刪除的元素數(shù)量,第三個及其后的參數(shù)可選,表示在開始索引前添加的元素

  • concat()可以連接兩個或多個數(shù)組,并將新的數(shù)組返回,該方法不會對原數(shù)組產(chǎn)生影響

  • join(),該方法可以將數(shù)組轉(zhuǎn)換為一個字符串,該方法不會對原數(shù)組產(chǎn)生影響,而是將轉(zhuǎn)換后的字符串作為結(jié)果返回,該方法可以指定一個參數(shù)作為分隔符,默認使用,作為分隔符

  • reverse(),該方法用來反轉(zhuǎn)數(shù)組,該方法會改變原數(shù)組

  • sort(),可以用來對數(shù)組中的元素進行排序,默認會按照Unicode編碼進行排序,該方法會改變原數(shù)組

    若想改變排序規(guī)則,我們可以在sort()添加一個回調(diào)函數(shù),回調(diào)函數(shù)中需要定義兩個形參,瀏覽器將會分別使用數(shù)組中的元素作為實參去調(diào)用回調(diào)函數(shù),瀏覽器會根據(jù)回調(diào)函數(shù)的返回值來決定元素的順序: 如果需要升序排列,則返回 a-b;如果需要降序排列,則返回b-a;

函數(shù)的方法

  • call()和apply(),這兩個方法都是函數(shù)對象的方法,需要通過函數(shù)對象來調(diào)用,當對函數(shù)調(diào)用call()和apply(),都會調(diào)用函數(shù)執(zhí)行,格式為函數(shù)名.call()和函數(shù)名.apply()。
    在調(diào)用call()和apply()可以將一個對象指定為第一個參數(shù),此時這個對象將會成為函數(shù)執(zhí)行時的this
    call()方法可以將實參在對象之后依次傳遞
    apply()方法需要將實參封裝到一個數(shù)組中統(tǒng)一傳遞
    參考鏈接:js中call()和apply()方法的區(qū)別和用法詳解 - 簡書 (jianshu.com)

arguments
1.函數(shù)的上下文對象 this
2.封裝實參的對象 arguments
- arguments是一個類數(shù)組對象,它也可以通過索引來操作數(shù)據(jù),也可以獲取長度
* - 在調(diào)用函數(shù)時,我們所傳遞的實參都會在arguments中保存
* - arguments.length可以用來獲取實參的長度
* - 我們即使不定義形參,也可以通過arguments來使用實參,
* 只不過比較麻煩
* arguments[0] 表示第一個實參
* arguments[1] 表示第二個實參 。。。
* - 它里邊有一個屬性叫做callee,這個屬性對應(yīng)一個函數(shù)對象,就是當前正在指向的函數(shù)的對象

Date對象

  • 如果直接使用構(gòu)造函數(shù)創(chuàng)建一個Date對象,則會封裝為當前代碼執(zhí)行的時間。 例:var d = new Date();
  • 創(chuàng)建一個指定的時間對象,需要 在構(gòu)造函數(shù)中傳遞一個表示時間的字符串作為參數(shù),日期的格式 月份/日/年 時:分:秒
    getDate(),獲取當前日期對象是幾日
    getDay(),獲取當前日期對象時周幾,0表示周日
    getMonth(),獲取當前時間對象的月份,返回0-11,0表示1月
    getFullYear(),獲取當前日期對象的年份
    getTime(),獲取當前日期對象的時間戳,時間戳,指的是從格林威治標準時間的1970年1月1日,0時0分0秒到當前日期所花費的毫秒數(shù)(1秒 = 1000毫秒)注:計算機底層在保存時間時使用都是時間戳
    使用Date.now()可以獲取當前代碼執(zhí)行的時間戳,可以利用這一特點來測試代碼執(zhí)行的性能

Math工具類

  • Math和其他的對象不同,它不是一個構(gòu)造函數(shù),它屬于一個工具類不用創(chuàng)建對象,它里邊封裝了數(shù)學(xué)運算相關(guān)的屬性和方法。如:Math.PI 表示的圓周率
    Math.abs()可以用來計算一個數(shù)的絕對值
    Math.ceil()可以對一個數(shù)進行向上取整,小數(shù)位只有有值就自動進1
    Math.floor()可以對一個數(shù)進行向下取整,小數(shù)部分會被舍掉
    Math.round()可以對一個數(shù)進行四舍五入取整
    Math.random()可以用來生成一個0-1之間的隨機數(shù),遵循左閉右開的原則
    max()獲取多個值中最大值,min()獲取多個值中的最小值
    Math.pow(x,y)返回x的y次冪
    Math.sqrt()求一個數(shù)的開根號

包裝類
在JS中為我們提供了三個包裝類,通過這三個包裝類可以將基本數(shù)據(jù)類型的數(shù)據(jù)轉(zhuǎn)換為對象

  • String()
    * - 可以將基本數(shù)據(jù)類型字符串轉(zhuǎn)換為String對象

  • Number()
    * - 可以將基本數(shù)據(jù)類型的數(shù)字轉(zhuǎn)換為Number對象

  • Boolean()
    * - 可以將基本數(shù)據(jù)類型的布爾值轉(zhuǎn)換為Boolean對象

  • 方法和屬性之能添加給對象,不能添加給基本數(shù)據(jù)類型
    * 當我們對一些基本數(shù)據(jù)類型的值去調(diào)用屬性和方法時,
    * 瀏覽器會臨時使用包裝類將其轉(zhuǎn)換為對象,然后在調(diào)用對象的屬性和方法
    * 調(diào)用完以后,在將其轉(zhuǎn)換為基本數(shù)據(jù)類型
    例:

         var s = 123;         
          console.log(typeof s);//number
          s = s.toString();
          s.hello = "你好";
          console.log(typeof s);//string
          console.log(s.hello);//undefined
          console.log(s);//123
    

字符串

  • 在底層字符串是以字符數(shù)組的形式保存的
    length屬性獲取字符串長度
    charAt()獲取指定索引的字符
    charCodeAt()獲取指定位置字符的字符編碼(Unicode編碼)
    String.formCharCode()可以根據(jù)字符編碼去獲取字符
    concat()可以用來連接兩個或多個字符串,作用與 “+”一樣
    indexof()如果字符串中含有該內(nèi)容,則會返回其第一次出現(xiàn)的索引(從0開始),如果沒有找到指定的內(nèi)容,則返回-1。可以指定一個第二個參數(shù),指定開始查找的位置。該方法可以檢索一個字符串中是否含有指定內(nèi)容
    lastIndexOf(),用法與indexof()類似,返回指定文本在字符串中最后一次出現(xiàn)的索引,方向從后往前,也可以指定開始查找的位置
    toUpperCase()將一個字符串轉(zhuǎn)換為大寫并返回;toLowerCase()將一個字符串轉(zhuǎn)換為小寫并返回

  • slice()可以從字符串中截取指定的內(nèi)容,該方法不會影響原字符串,而是將截取到內(nèi)容返回
    * - 參數(shù):
    * 第一個,開始位置的索引(包括開始位置)
    * 第二個,結(jié)束位置的索引(不包括結(jié)束位置)
    * - 如果省略第二個參數(shù),則會截取到后邊所有的
    * - 也可以傳遞一個負數(shù)作為參數(shù),負數(shù)的話將會從后邊計算

  • substring()- 可以用來截取一個字符串,可以slice()類似
    * - 參數(shù):
    * - 第一個:開始截取位置的索引(包括開始位置)
    * - 第二個:結(jié)束位置的索引(不包括結(jié)束位置)
    * - 不同的是這個方法不能接受負值作為參數(shù),
    * 如果傳遞了一個負值,則默認使用0
    * - 而且他還自動調(diào)整參數(shù)的位置,如果第二個參數(shù)小于第一個,則自動交換

  • substr()
    * - 用來截取字符串,返回截取到的字符串
    * - 參數(shù):
    * 1.截取開始位置的索引
    * 2.截取的長度

  • split()
    根據(jù)指定字符可以將一個字符串拆分為一個數(shù)組
    參數(shù):需要一個字符串作為參數(shù),將會根據(jù)該字符串去拆分數(shù)組,如果傳遞一個空串作為參數(shù),則會將每個字符都拆分為數(shù)組中的一個元素

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容