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

資訊專欄INFORMATION COLUMN

深入理解javascript按值傳遞與按引用傳遞

陳江龍 / 2164人閱讀

摘要:引用類型參數的傳遞與引用類型的復制一樣,傳遞的是內存地址。指向一個新的地址,與不再指向同一個地址官方解釋來一發中所有函數的參數都是按值傳遞的。總結很簡單,函數參數都是按值傳遞都是棧內數據的拷貝。

基本類型與引用類型

值類型(基本類型):String,Number,Boolean,Null,Undefined。
引用類型:Array、Object、Function、Date等有多個值構成的可變長度的復雜類型。

基本類型與引用類型有什么區別?

(1)基本類型的變量保存的是變量值,引用類型的變量保存的是內存地址;
(2)基本類型長度固定,在內存中占據固定大小的空間,數據存放在棧內存中;引用類型可以給對象添加屬性和方法,長度不固定,數據存放在堆內存中。引用類型的存儲需要棧區和堆區(堆區是指內存里的堆內存)共同完成,棧區內存保存變量標識符和指向堆內存中該對象的指針,也可以說是該對象在堆內存的地址;
(3)基本類型在賦值的時候拷貝值,引用類型在賦值的時候只拷貝地址,不拷貝值。

基本類型與引用類型的復制
const num1 = 5;
const num2 = num1;

const obj1 = {};
const obj2 = obj1;

基本類型復制與引用類型復制,看不懂直接上代碼!!
// 測試引用類型傳值和數組類型傳值
const obj = {
  success: false,
  result: {
    name: "222"
  }
};
let name = obj && obj.result && obj.result.name; // name為一個str,具體的值為基礎類型,name這里保存的是變量值,而不是引用地址
console.log(name); // 222
name = "333";
console.log(obj.result.name); // 222, name為變量值,name的改變并不會影響到obj.result.name
obj.result.name = "44444";
console.log(obj.result.name); // 44444
console.log(name); // 333,name為變量值,而非引用地址,與obj.result.name相互不影響,因此obj.result.name的改變也不會引起name的變化
const obj = {
  success: false,
  result: {
    name: "222"
  }
};
let result = obj && obj.result;
console.log(result);  // { name: "222" },obj.result是一個Object類型,這里result存的是obj.result的引用地址,result和obj.result指向堆中的同一個地址,相互影響
obj.result.name = "44444";
console.log(obj.result.name); // "44444"
console.log(result); // { name: "44444" }
result.name = "xxxxx"; // 屬性修改,相互影響
console.log(obj.result); // { name: "xxxxx" }
// result重新賦值,指向一個新的引用地址,此時result與obj.result指向不同地址,不再相互影響
result = {
  name: "ooooo"
};
console.log(result); // { name: "ooooo" }
console.log(obj.result); // { name: "xxxxx" }
const obj = {
  success: false,
  result: [0, 1]
};
let result = obj && obj.result;
console.log(result); //[0, 1],obj.result為Array類型,result和obj.result指向堆中的同一個地址,相互影響
console.log(obj.result); // [0, 1]
result.push("aa"); // 數組的push操作是在原數組基礎上操作,并不生成一個新的數組,result和obj.result依然指向同一個地址,相互影響
console.log(result); // [0, 1, "aa"]
console.log(obj.result); // [0, 1, "aa"]
result = [0, 1, 2]; // result重新賦值,此時result指向堆中一個新的地址,result與obj.result指向不同地址,不再相互影響
console.log(obj.result); // [0, 1, "aa"]
console.log(result); // [0, 1, 2]
函數參數傳遞按值類型還是引用類型?

基本類型參數的傳遞與基本類型的復制一樣,傳遞的是變量值。

function addTen(num) {
   num = num + 10;
   return num;
}
var count = 20;
var result = addTen(count);
console.log(count); // 20
console.log(result); // 30

引用類型參數的傳遞與引用類型的復制一樣,傳遞的是內存地址。

function setName(obj){
   obj.name = "xxx";
   obj = {name: "ppp"}; // obj指向一個新的地址,與person不再指向同一個地址
   console.log(obj.name); // "ppp"
}
const person = {name : "oo"};
setName(person);
console.log(person.name); // ‘xxx’
官方解釋來一發:

ECMAScript中所有函數的參數都是按值傳遞的。

也就是說,把函數外部的值復制給函數內部的參數,就和把值從一個變量復制到另一個變量一樣。基本類型的傳遞如同基本類型的復制一樣,而引用類型值的傳遞,如同引用類型變量的復制一樣。

總結

很簡單,javascript函數參數都是按值傳遞(都是棧內數據的拷貝)。 
基本類型傳的是值本身(因為直接把值存在棧內),引用類型傳的是對象在內存里面的地址 (因為復雜對象存在堆內,所以在棧里存對象所在的堆地址)。
基本類型與引用類型的檢測

typeof是檢測基本數據類型的最佳工具,但是對檢測引用類型,返回的都是object,并不能確定是哪種類型的對象,沒有意義。

基本類型:基本類型中的null,返回為object,其他的都能正常檢測出準確的類型。
typeof("aa"); // "string"
typeof(123); // "number"
typeof(NaN); // "number"
typeof(cc); // "undefined" 未定義變量undefined
typeof(undefined); // "undefined"
typeof(true); // "boolean"
typeof(null); // "object"

引用類型:function是特殊類型,可以直接用typeof來判斷是否是function。
typeof([]); // "object"
typeof({}); // "object"
typeof(function(){}); // "function"
typeof總結:

instanceof操作符可以專門用來檢測引用類型,判斷當前對象是什么類型的對象。
alert({name: "aa"} instanceof Object); // true
alert([1, 2] instanceof Array); // true
alert(function(){} instanceof Function); // true
alert([1, 2] instanceof Object); // true 所有引用類型的值都是Object的實例,因此多帶帶的判斷instanceof Object并不能區分是數組,還是函數等,instanceof應該用來檢測真正的對象實例。
alert(13 instanceof Number); // false 使用instanceof檢測基本類型的值,始終返回false,因為基本類型不是對象。
new Number(12) instanceof Number; // true
javascript最準確且簡便的方法:

參考文獻

https://www.zhihu.com/questio...
https://www.cnblogs.com/focus...
https://www.cnblogs.com/telne...
https://www.jianshu.com/p/585...

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/92453.html

相關文章

  • 深入理解javascript按值傳遞與按引用傳遞

    摘要:引用類型參數的傳遞與引用類型的復制一樣,傳遞的是內存地址。指向一個新的地址,與不再指向同一個地址官方解釋來一發中所有函數的參數都是按值傳遞的。總結很簡單,函數參數都是按值傳遞都是棧內數據的拷貝。 基本類型與引用類型 值類型(基本類型):String,Number,Boolean,Null,Undefined。 引用類型:Array、Object、Function、Date等有多個值...

    hedzr 評論0 收藏0
  • JavaScript深入之參數按值傳遞

    摘要:深入系列第九篇,除了按值傳遞引用傳遞,還有第三種傳遞方式按共享傳遞定義在高級程序設計第三版,講到傳遞參數中所有函數的參數都是按值傳遞的。 JavaScript深入系列第九篇,除了按值傳遞、引用傳遞,還有第三種傳遞方式 —— 按共享傳遞 定義 在《JavaScript高級程序設計》第三版 4.1.3,講到傳遞參數: ECMAScript中所有函數的參數都是按值傳遞的。 什么是按值傳遞呢?...

    DataPipeline 評論0 收藏0
  • JS中的值是按值傳遞,還是按引用傳遞呢?

    摘要:按引用傳遞時,函數的形參接收實參的隱式引用,而不再是副本。探究值的傳遞方式的基本類型,是按值傳遞的。但這樣是否說明的對象是按引用傳遞的呢我們再看下面的例子仍然是并未被修改為如果是按引用傳遞,修改形參的值,應該影響到實參才對。 最近遇到個有趣的問題:JS中的值是按值傳遞,還是按引用傳遞呢? 在分析這個問題之前,我們需了解什么是按值傳遞(call by value),什么是按引用傳遞(ca...

    Jochen 評論0 收藏0
  • JS程序

    摘要:設計模式是以面向對象編程為基礎的,的面向對象編程和傳統的的面向對象編程有些差別,這讓我一開始接觸的時候感到十分痛苦,但是這只能靠自己慢慢積累慢慢思考。想繼續了解設計模式必須要先搞懂面向對象編程,否則只會讓你自己更痛苦。 JavaScript 中的構造函數 學習總結。知識只有分享才有存在的意義。 是時候替換你的 for 循環大法了~ 《小分享》JavaScript中數組的那些迭代方法~ ...

    melody_lql 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<