最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript基本類型與引用類型區(qū)別解析

 更新時間:2025年11月17日 14:34:21   作者:指尖跳動的光  
文章介紹了JavaScript中基本類型和引用類型的區(qū)別,包括它們的存儲位置、賦值行為、比較方式、可變性、類型數(shù)量、方法支持等特性,同時,還討論了基本類型和引用類型在函數(shù)參數(shù)傳遞、深拷貝與淺拷貝、性能優(yōu)化以及檢測方法等方面的區(qū)別和注意事項,感興趣的朋友一起看看吧

1. 基本類型(Primitive Types)

1.1 特點

  • 按值訪問:直接存儲在棧內存中,變量保存的是數(shù)據(jù)的實際值。
  • 不可變:修改基本類型的值會創(chuàng)建一個新值,原值不會被改變。
  • 類型固定:JavaScript 的基本類型共有 7 種:
    • number(數(shù)字)
    • string(字符串)
    • boolean(布爾值)
    • null(空值)
    • undefined(未定義)
    • symbol(ES6 新增,唯一標識符)
    • bigint(ES2020 新增,大整數(shù))

1.2 示例

let a = 10;
let b = a; // 賦值時復制實際值
b = 20;    // 修改 b 不影響 a
console.log(a); // 10
console.log(b); // 20

1.3 關鍵行為

  • 賦值:復制實際值,兩個變量獨立。
  • 比較:比較的是值是否相等。
    let x = "hello";
    let y = "hello";
    console.log(x === y); // true(值相同)
    
  • 方法調用:字符串、數(shù)字等基本類型調用方法時,會臨時轉換為對象(如 “abc”.toUpperCase()),但原值不變。
    • 字符串調用方法
      let str = "hello";
      console.log(str.length); // 5
      console.log(str.toUpperCase()); // "HELLO"
      
      • str 是一個基本類型的字符串,但可以調用 length 屬性和 toUpperCase() 方法。
      • 引擎內部會臨時將 str 轉換為 new String(“hello”) 對象,調用方法后,臨時對象被丟棄。
    • 數(shù)字調用方法
      let num = 3.14;
      console.log(num.toFixed(2)); // "3.14"
      
      • num 是基本類型的數(shù)字,但可以調用 toFixed() 方法。
      • 引擎臨時將其轉換為 new Number(3.14) 對象,調用方法后銷毀。
    • 布爾值調用方法
      let bool = true;
      console.log(bool.toString()); // "true"
      
      • bool 是基本類型的布爾值,但可以調用 toString() 方法。
      • 引擎臨時將其轉換為 new Boolean(true) 對象,調用方法后銷毀。

2. 引用類型(Reference Types)

2.1 特點

  • 按引用訪問:存儲在堆內存中,變量保存的是數(shù)據(jù)的內存地址(引用)。
  • 可變:修改引用類型的屬性會直接影響原對象。
  • 類型動態(tài):包括所有對象類型:
    • Object(普通對象)
    • Array(數(shù)組)
    • Function(函數(shù))
    • Date(日期)
    • RegExp(正則表達式)
    • Map、Set 等(ES6 新增)

2.2 示例

let obj1 = { name: "Alice" };
let obj2 = obj1; // 賦值時復制引用(地址)
obj2.name = "Bob"; // 修改 obj2 會影響 obj1
console.log(obj1.name); // "Bob"
console.log(obj2.name); // "Bob"

2.3 關鍵行為

  • 賦值:復制引用(地址),兩個變量指向同一對象。
  • 比較:比較的是引用地址是否相同(即使內容相同,地址不同也返回 false)。
    let arr1 = [1, 2];
    let arr2 = [1, 2];
    console.log(arr1 === arr2); // false(地址不同)
    console.log(arr1 === arr1); // true(同一對象)
    
  • 方法調用:直接修改原對象(如 arr.push(3) 會改變原數(shù)組)。

3. 核心區(qū)別總結

特性基本類型引用類型
存儲位置棧內存(直接存儲值)堆內存(存儲地址,變量保存引用)
賦值行為復制實際值(獨立)復制引用(共享同一對象)
比較方式比較值是否相等比較引用地址是否相同
可變性不可變(修改創(chuàng)建新值)可變(直接修改原對象)
類型數(shù)量固定 7 種動態(tài)(所有對象類型)
方法支持臨時轉換為對象調用方法(原值不變)直接調用方法修改原對象

4. 常見場景與注意事項

4.1 函數(shù)參數(shù)傳遞

  • 基本類型:函數(shù)內修改參數(shù)不影響外部變量。
    function changeValue(num) {
      num = 100;
    }
    let a = 10;
    changeValue(a);
    console.log(a); // 10(未改變)
    
  • 引用類型:函數(shù)內修改對象屬性會影響外部變量。
    function changeObj(obj) {
      obj.name = "Bob";
    }
    let person = { name: "Alice" };
    changeObj(person);
    console.log(person.name); // "Bob"(被修改)
    

4.2 深拷貝 vs 淺拷貝

  • 淺拷貝:僅復制引用(如 let arr2 = arr1),修改嵌套對象會互相影響。
  • 深拷貝:完全復制對象(如使用 JSON.parse(JSON.stringify(obj)) 或工具庫如 Lodash 的 _.cloneDeep)。

4.3 性能優(yōu)化

  • 基本類型(如頻繁操作的數(shù)字、字符串)適合存儲在棧中,訪問速度快。
  • 引用類型(如大型對象、數(shù)組)適合堆存儲,但需注意避免意外共享引用。

5. 檢測方法

5.1 基本數(shù)據(jù)類型-》檢測類型

  1. typeof 運算符
    • 適用于大多數(shù)基本類型,但 null 會返回 “object”(歷史遺留問題)。
      typeof "hello"; // "string"
      typeof 42; // "number"
      typeof true; // "boolean"
      typeof undefined; // "undefined"
      typeof Symbol("foo"); // "symbol"
      typeof 10n; // "bigint"
      typeof null; // "object" ?? 特殊情況
      
  2. 嚴格等于 === 檢測 null 和 undefined
    let x = null;
    let y = undefined;
    console.log(x === null); // true
    console.log(y === undefined); // true
    
  3. Object.prototype.toString.call()(最準確)
    Object.prototype.toString.call("hello"); // "[object String]"
    Object.prototype.toString.call(42); // "[object Number]"
    Object.prototype.toString.call(true); // "[object Boolean]"
    Object.prototype.toString.call(null); // "[object Null]"
    Object.prototype.toString.call(undefined); // "[object Undefined]"
    Object.prototype.toString.call(Symbol("foo")); // "[object Symbol]"
    Object.prototype.toString.call(10n); // "[object BigInt]"
    

5.2 引用數(shù)據(jù)類型-》檢測類型

  1. typeof 運算符
    • typeof 對引用類型通常返回 “object”(除了 function):
      typeof {}; // "object"
      typeof []; // "object"
      typeof function() {}; // "function" ?? 特殊情況
      typeof new Date(); // "object"
      typeof /regex/; // "object"
      
  2. instanceof 運算符
    • 檢測對象是否是某個構造函數(shù)的實例:
      [] instanceof Array; // true
      {} instanceof Object; // true
      function() {} instanceof Function; // true
      new Date() instanceof Date; // true
      
    • 局限性:
      • 不能檢測基本類型(如 “str” instanceof String 返回 false)。
      • 跨框架(iframe)時可能不準確(不同全局對象的構造函數(shù)不同)。
  3. constructor 屬性
    • 返回對象的構造函數(shù):
      "hello".constructor === String; // true
      (42).constructor === Number; // true
      [].constructor === Array; // true
      ({}).constructor === Object; // true
      
    • 局限性:
      • 如果對象是 null 或 undefined,會報錯(Cannot read property ‘constructor’ of null)。
      • 可以被手動修改(obj.constructor = Foo),不可靠。
  4. Object.prototype.toString.call()(最準確)
    Object.prototype.toString.call([]); // "[object Array]"
    Object.prototype.toString.call({}); // "[object Object]"
    Object.prototype.toString.call(function() {}); // "[object Function]"
    Object.prototype.toString.call(new Date()); // "[object Date]"
    Object.prototype.toString.call(/regex/); // "[object RegExp]"
    

5.3 綜合檢測方法

  1. 判斷是否為基本類型
    function isPrimitive(value) {
      return (
        value === null ||
        value === undefined ||
        typeof value === "string" ||
        typeof value === "number" ||
        typeof value === "boolean" ||
        typeof value === "symbol" ||
        typeof value === "bigint"
      );
    }
    
  2. 判斷具體類型(推薦 Object.prototype.toString)
    function getType(value) {
      return Object.prototype.toString.call(value).slice(8, -1).toLowerCase();
    }
    getType("hello"); // "string"
    getType(42); // "number"
    getType([]); // "array"
    getType({}); // "object"
    getType(null); // "null"
    getType(undefined); // "undefined"
    getType(function() {}); // "function"
    getType(new Date()); // "date"
  3. 判斷是否為數(shù)組
    Array.isArray([]); // true
    [] instanceof Array; // true
    Object.prototype.toString.call([]) === "[object Array]"; // true
    
  4. 判斷是否為 null 或 undefined
    function isNullOrUndefined(value) {
      return value === null || value === undefined;
    }
    

5.4 檢測類型總結

檢測方式基本類型引用類型特殊情況
typeof?(除 null)??(function 除外)null 返回 “object”
instanceof??跨框架不準確
constructor?(除 new String() 等)?可被修改,null/undefined 報錯
Object.prototype.toString.call()??最準確
  • 推薦做法
    • 基本類型:優(yōu)先用 typeof + 特殊處理 null。
    • 引用類型:用 Object.prototype.toString.call() 或 Array.isArray() 等特定方法。
    • 避免 instanceof 和 constructor,除非明確知道它們的局限性。

到此這篇關于JavaScript基本類型與引用類型有什么區(qū)別的文章就介紹到這了,更多相關js 基本類型與引用類型區(qū)別內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • ES6解構賦值實例詳解

    ES6解構賦值實例詳解

    這篇文章主要介紹了ES6解構賦值,結合實例形式較為詳細的分析了ES6結構賦值的基本概念、原理與使用方法,需要的朋友可以參考下
    2017-10-10
  • JavaScript中的垃圾回收與內存泄漏示例詳解

    JavaScript中的垃圾回收與內存泄漏示例詳解

    這篇文章主要給大家介紹了關于JavaScript中垃圾回收與內存泄漏的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用JavaScript具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-05-05
  • JS實現(xiàn)點擊下拉菜單把選擇的內容同步到input輸入框內的實例

    JS實現(xiàn)點擊下拉菜單把選擇的內容同步到input輸入框內的實例

    下面小編就為大家分享一篇JS實現(xiàn)點擊下拉菜單把選擇的內容同步到input輸入框內的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01
  • Electron內嵌網(wǎng)頁實現(xiàn)打印預覽功能的示例代碼

    Electron內嵌網(wǎng)頁實現(xiàn)打印預覽功能的示例代碼

    這篇文章主要介紹了Electron內嵌網(wǎng)頁實現(xiàn)打印預覽功能的方式,文章通過代碼示例給大家講解的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下
    2025-06-06
  • 調試Javascript代碼(瀏覽器F12及VS中debugger關鍵字)

    調試Javascript代碼(瀏覽器F12及VS中debugger關鍵字)

    目前,常用的瀏覽器IE、Chrome、Firefox都有相應的腳本調試功能下面我就介紹如何在瀏覽器/VS中調試我們的JS代碼,感興趣的你可不要走開啊,希望本文對你有所幫助
    2013-01-01
  • javascript中break,continue和return語句用法小結

    javascript中break,continue和return語句用法小結

    break,continue和return這三個語句的用法新手們經(jīng)常弄混淆,至少在我學習c語言的時候經(jīng)常把它們的用法給搞錯。不過現(xiàn)在好了,我已徹底搞清楚它們之間的用法
    2012-05-05
  • JavaScript中的return語句簡單介紹

    JavaScript中的return語句簡單介紹

    return語句在js中起到舉足輕重的作用,該關鍵字不僅具有返回函數(shù)值得功能,還具有一些特殊的用法,有個清晰的把握是非常有必要的,下面通過本篇文章給大家簡單介紹下return語句的作用
    2015-12-12
  • 詳談JavaScript 匿名函數(shù)及閉包

    詳談JavaScript 匿名函數(shù)及閉包

    本文詳細介紹了匿名函數(shù)、閉包、并給出了詳細的例子以及詳細的注意事項,是篇非常非常不錯的文章,推薦給大家。
    2014-11-11
  • 深入理解Javascript中this的作用域

    深入理解Javascript中this的作用域

    這篇文章主要介紹了深入理解Javascript中this的作用域,本文用大量例子來深入探討this的作用域,需要的朋友可以參考下
    2014-08-08
  • 批量實現(xiàn)面向對象的實例代碼

    批量實現(xiàn)面向對象的實例代碼

    本文為大家詳細介紹下面向對象的繼承以及如何實現(xiàn)批量實現(xiàn)面向對象,感興趣的可以參考下哈,希望對大家有所幫助
    2013-07-07

最新評論

沁源县| 富平县| 乌鲁木齐市| 红安县| 吴忠市| 黄山市| 遵化市| 崇左市| 贺兰县| 武城县| 古蔺县| 渭源县| 余干县| 北安市| 资兴市| 丹巴县| 邻水| 汾西县| 康平县| 台州市| 武陟县| 河东区| 龙井市| 章丘市| 清丰县| 卢湾区| 正阳县| 广平县| 屏山县| 宜兴市| 墨玉县| 吉首市| 台南县| 江门市| 高台县| 夏邑县| 同心县| 香河县| 泸定县| 温宿县| 图们市|