中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

JavaScript中數據類型和聲明變量的方法有哪些

發布時間:2020-12-03 10:10:33 來源:億速云 閱讀:141 作者:小新 欄目:web開發

小編給大家分享一下JavaScript中數據類型和聲明變量的方法有哪些,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!

7種數據類型

基礎數據類型:存儲到棧內存中,操作的是值

null:空指針,所以typeof null ==>Object

undefined:定義了未賦值

Number:數字

String:字符串

Symbol:一種實例是唯一且不可改變的數據類型。

Boolean:布爾值

引用數據類型:儲存在堆內存種,操作的是空間地址

Object:具體可以是Array,Function,RegExp,Date

判斷數據類型(方法,優劣)

typeof:只能判斷基礎類型中的非Null,不能判斷引用數據類型(因為全部為object)它是操作符

typeof ''  // ==> string
typeof 1  //==> number
typeof true  //==>boolean
typeof undefined  //==>undefined
let b = Symbol() ; typeof b //==>symbol
-----------------下面的判斷不了實際類型了-----------------------
typeof function fn(){} //==>function
typeof null //==>object
typeof [1,2,3] //==>object
typeof {} //==>object

instanceof:用于測試構造函數的prototype屬性是否出現在對象的原型鏈中的任何位置,可以用它來判斷Array但是不夠優雅且有一定風險

let arr = [1,2,3]
arr instanceof Array //==>true
arr instanceof Object //==>true
instanceof操作符的問題在于,它只有一個全局執行環境,如果網頁有多個框架,那實際上就存在兩個以上的不同的全局執行環境,從而存在兩個以上不同版本的Array構造函數。如果從一個框架想另外一個框架傳入一個數組,那么傳入的數組與在第二個框架中原生創建的數組分別具備各自不同的構造函數 ----高程page88 (筆者白話問翻譯一下:風險來至原型鏈的重寫

constructor:原理也是基于原型鏈,風險同樣來之于原型鏈的重寫,比如當你在多個frame中來回穿梭的時候,這兩種方法就亞歷山大了。由于每個iframe都有一套自己的執行環境,跨frame實例化的對象彼此是不共享原型鏈的,因此導致上述檢測代碼失效!

isNaN:這個方法會先調用Number,所以不是很好用

   console.log(isNaN("1px"));   //先調用Number('1px'),返回NaN,然后再調用isNaN(NaN)返回true
   //燃鵝 '1px'客觀并不是NaN
    [1,2,3,1].constructor === Array; // true

-----------------------------------------------比較好的方法--------------------------------

Object.prototype.toString.call()

    Object.prototype.toString.call(null) // ==> [object Null]
    Object.prototype.toString.call([]) // ==> [object Array]

-------------------------------------------------優雅的方法---------------------

如果需要單獨判斷Array

Array.isArray([]) //==>true

如果需要單獨判斷null

let a = null
Object.is(a , null) //==>true

6種聲明變量的方法

ES5 只有兩種聲明變量的方法:var命令和function命令。ES6 除了添加let和const命令,后面章節還會提到,另外兩種聲明變量的方法:import命令和class命令。所以,ES6 一共有 6 種聲明變量的方法。 --es6
var:變量提升,沒有塊級作用域

說到var肯定要提變量提升:當前作用域,js(函數)執行前,瀏覽器會把帶var或者function進行提前聲明和定義

  1. 變量只聲明,函數是聲明+賦值,自執行函數定義和執行一起完成了

  2. 不受邏輯判斷條件影響

  3. return 下面的也提升,但是return 里面的不提升

  4. 重復的聲明可以,重新賦值即可,但是變量和方法名字不能沖突

const: 常量,地址不變,但是屬性可以變
let: 塊作用域,暫時性死區(TDZ),不進行變量提升,不允許重復聲明
//只要塊級作用域內存在let命令,它所聲明的變量就“綁定”(binding)這個區域,不再受外部的影響。所以下面代碼不報錯,外層作用域和里層作用域都有一個tmp
let tmp = 123;
    if (true) {
      let tmp =123;    
    }
//ES6 明確規定,如果區塊中存在let和const命令,這個區塊對這些命令聲明的變量,從一開始就形成了封閉作用域。凡是在聲明之前就使用這些變量,就會報錯。
    let tmp = 123;
    if (true) {
      tmp = 'abc'; // ReferenceError
      let tmp;    
    }
import:es6模塊化解決方案
class:es6繼承解決方案

類型轉化

這一塊內容太多,太雜了,其實我不怎么想寫,因為很少有人會這么寫代碼。但是這塊太重要了,面試必考。建議大家掌握這塊的核心內容以及原則,不要關注奇淫巧技。

1.自動裝包

三種包裝類型:Number,Boolean,String

let s1 = '123'
let s2 = s1.slice(2)         // a是基本類型,它是沒有slice方法的這里實際上后臺完成了一個自動裝包
---下面是實際發生的事---------
let s1 = new string('123')
let s2 = s1.slice(2)     
s1 = null      //注意這里用完就銷毀了

//所以如果添加某個屬性后面是調用不出來的
let s1 = '123'
s1.color = 'red'
console.log(s1.color) // ==> undefind

這些類型(構造函數)基本都重寫了它們的tostring方法

2.強行轉化為數字
  • Number :將其他數據類型的值強制轉換成number類型;

    console.log(Number({}));//NaN
    console.log(Number(null));// 0
    console.log(Number(undefined));// NaN
    console.log(Number([]));// 0
    console.log(Number(""));// 0
    console.log(Number(true));// 1
    console.log(Number(false));
  • parseInt :經常用于字符串提取數字的方法; 把字符串中從左到右依次識別,直到遇到一個非有效數字,停止,把找到的數字返回;

  console.log(parseInt("12px12"));// 12
  console.log(parseInt("12.666.777px12"));// 12
  console.log(parseInt("px12.666px12"));// NaN
  console.log(parseInt(""));// NaN
  console.log(parseInt(true));// NaN
  console.log(parseInt({}));// NaN
  console.log(parseInt([]));// NaN
  console.log(parseInt(null));// NaN
  console.log(parseInt(undefined));// NaN
  • toFixed : 保留小數點位數的方法,返回值是一個字符串

    console.log(Number("1px"));   //==> NAN
    console.log(parseInt("1px"));   //==> 1
    console.log(parseInt("p1px"));   //==> NaN
3.-轉化

會先把字符串轉換成數字(Number),然后再進行計算,注意NaN,undifined參與的任何計算都是NaN

  console.log("6" - 2);//==> 4
  console.log("5px"-"4")//==> NaN (NaN-4還是NaN)
4.+轉化

具體調用string還是number請看下表

            || undefined | null   | boolean | number | string | object |
=========================================================================
 undefined  || number    | number | number  | number | string | string | 
 null       || number    | number | number  | number | string | string | 
 boolean    || number    | number | number  | number | string | string | 
 number     || number    | number | number  | number | string | string | 
 string     || string    | string | string  | string | string | string | 
 object     || string    | string | string  | string | string | string |
    //字符串和任何類型相加都是調用String
    var  a = typeof 10 + true + [] + null + undefined+{};
    console.log(a); //==>numbertruenullundefined[object Object],{}
    console.log("6px"+undefined); ==> 6pxundefined
    console.log(NaN+"undefined");==> NaNundefined
    //經典面試題
    [1,2]+[2,1]  //==>都調用toString '1,2'+'2,1'===>'1,22,1'
5.布爾值Boolean

其他數據類型轉布爾類型是false有且只有五個值: 0  ""  NaN null  undefined  
所以boolean({}) 或者boolean([]) 都是真

6.==和===

===是全等,==是類型轉化后再判斷,規則比較復雜。這里我認為除了準備面試需要看看,平時基本不會用,所以這個知識性價比非常低,學了用不到也會忘,大家自己把握,詳細規則可以搜我其他文章
平時除了判斷a是否是undefined或者是null(jq源碼里面都用法)都時候其他情況下都用===

console.log(null==undefined) // true
console.log(undefined==undefined) // true

看完了這篇文章,相信你對JavaScript中數據類型和聲明變量的方法有哪些有了一定的了解,想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

阿拉善盟| SHOW| 营口市| 龙州县| 潞西市| 濮阳市| 平湖市| 肃宁县| 宣汉县| 红桥区| 瑞丽市| 辛集市| 云安县| 松潘县| 平定县| 郓城县| 溆浦县| 镇康县| 灵武市| 应用必备| 辽阳县| 老河口市| 韶关市| 阆中市| 堆龙德庆县| 平和县| 辉南县| 商洛市| 大港区| 兴仁县| 海阳市| 余姚市| 靖州| 神木县| 钟祥市| 浑源县| 韩城市| 远安县| 河曲县| 广水市| 乌鲁木齐市|