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

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

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

1. 基本類型(Primitive Types)

1.1 特點(diǎn)

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

1.2 示例

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

1.3 關(guān)鍵行為

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

2. 引用類型(Reference Types)

2.1 特點(diǎn)

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

2.2 示例

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

2.3 關(guān)鍵行為

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

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

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

4. 常見場景與注意事項(xiàng)

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

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

4.2 深拷貝 vs 淺拷貝

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

4.3 性能優(yōu)化

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

5. 檢測方法

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

  1. typeof 運(yùn)算符
    • 適用于大多數(shù)基本類型,但 null 會(huì)返回 “object”(歷史遺留問題)。
      typeof "hello"; // "string"
      typeof 42; // "number"
      typeof true; // "boolean"
      typeof undefined; // "undefined"
      typeof Symbol("foo"); // "symbol"
      typeof 10n; // "bigint"
      typeof null; // "object" ?? 特殊情況
      
  2. 嚴(yán)格等于 === 檢測 null 和 undefined
    let x = null;
    let y = undefined;
    console.log(x === null); // true
    console.log(y === undefined); // true
    
  3. Object.prototype.toString.call()(最準(zhǔn)確)
    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 運(yùn)算符
    • typeof 對引用類型通常返回 “object”(除了 function):
      typeof {}; // "object"
      typeof []; // "object"
      typeof function() {}; // "function" ?? 特殊情況
      typeof new Date(); // "object"
      typeof /regex/; // "object"
      
  2. instanceof 運(yùn)算符
    • 檢測對象是否是某個(gè)構(gòu)造函數(shù)的實(shí)例:
      [] instanceof Array; // true
      {} instanceof Object; // true
      function() {} instanceof Function; // true
      new Date() instanceof Date; // true
      
    • 局限性:
      • 不能檢測基本類型(如 “str” instanceof String 返回 false)。
      • 跨框架(iframe)時(shí)可能不準(zhǔn)確(不同全局對象的構(gòu)造函數(shù)不同)。
  3. constructor 屬性
    • 返回對象的構(gòu)造函數(shù):
      "hello".constructor === String; // true
      (42).constructor === Number; // true
      [].constructor === Array; // true
      ({}).constructor === Object; // true
      
    • 局限性:
      • 如果對象是 null 或 undefined,會(huì)報(bào)錯(cuò)(Cannot read property ‘constructor’ of null)。
      • 可以被手動(dòng)修改(obj.constructor = Foo),不可靠。
  4. Object.prototype.toString.call()(最準(zhǔn)確)
    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 檢測類型總結(jié)

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

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

相關(guān)文章

最新評論

钟山县| 岑溪市| 仁寿县| 峨山| 蛟河市| 彩票| 黄冈市| 临夏市| 楚雄市| 来凤县| 九江县| 夏津县| 东乌| 凤山县| 卢湾区| 巨鹿县| 岳池县| 大悟县| 江源县| 武山县| 邓州市| 泗洪县| 天等县| 伊金霍洛旗| 固原市| 沐川县| 鹿邑县| 自贡市| 尉犁县| 吉木萨尔县| 瑞丽市| 汶上县| 衢州市| 安新县| 石渠县| 文化| 聂荣县| 海兴县| 西乌珠穆沁旗| 万源市| 泽普县|