日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

理解Javascritp中的引用

發布時間:2023/12/10 java 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 理解Javascritp中的引用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Author: bugall
Wechat: bugallF
Email: 769088641@qq.com
Github: https://github.com/bugall

一: 函數中的引用傳遞

我們看下下面的代碼的正確輸出是什么

function changeStuff(a, b, c) {a = a * 10;b.item = "changed";c = {item: "changed"}; }var num = 10; var obj1 = {item: "unchanged"}; var obj2 = {item: "unchanged"};changeStuff(num, obj1, obj2);console.log(num); // 10 console.log(obj1.item); // changed console.log(obj2.item); // unchanged

在javascript中除了基礎類型采用的是值(值類型有哪些)傳遞,而對象采用是引用傳遞。這就好理解為什么a的值沒有被修改。

那為什么obj1的值修改了,但是obj2的值卻沒有被覆蓋?當我們調用changeStuff函數的時候,參數b,c的值分別是obj1,obj2的引用。

當我們去修改的b的值的時候,因為b->obj1的引用關系沒有變,所以實際修改的是obj1的值。但是參數c的情況就不同了,因為我們在函數中對c進行了引用的重新綁定,c = {item: "changed"} 這時候的c中的對象引用已經改變,這里要清楚引用和指針的關系。

二: 邏輯判斷中的引用

通常我們會把==理解為值相同,把===理解為值相同且類型相同。

但是這種理解不是完全準確的。0=='' //true,直觀理解上0怎么會等于''空字符串呢?因為在做==邏輯判斷的時候js會把==兩邊的值做類型轉換,然后再比較。

另外在javascript中比較奇葩的就是關于null,我很難理解為什么null支持比較呢?比如在SQL中我們是不能對null值直接比較的,通常都會使用is null or is not null來做判斷。

如果我們把===理解為值相同,且類型相同那么就無法理解[1] === [1] // false的情況,因為[1]值相同,類型也相同。

我們應該怎么理解===

===不會判斷值是否相同,只會判斷===左右兩邊的變量保存的引用地址是否相同,我們一起看下例子

var a = [1,2,3]; var b = [1,2,3]; var c = a;var ab_eq = (a === b); // false 因為a,b的引用不同, // 或者理解為a,b引用的對象在堆上不是同一個對象。var ac_eq = (a === c); // true 因為a保存了一份對象的引用, // `c=a` c會把a的值copy一份,這是a,c的值(保存對象的引用)相同。 其實對于一個變量來說,包含了`左值`和`右值` 后面我會整理文章

類似的例子

var a = { x: 1, y: 2 }; var b = { x: 1, y: 2 }; var c = a;var ab_eq = (a === b); // false type) var ac_eq = (a === c); // true var a = { }; var b = { }; var c = a;var ab_eq = (a === b); // false var ac_eq = (a === c); // true

總結===的三種情況

對于整型 (numbers): a === b // 如果值相同返回true對于引用類型來說: a === b // 如果a,b保存的是同一個對象的引用返回true對字符串來說: a === b // 左右兩邊的字符相同返回true

var1 == var2 結果圖

三: const中的引用

我們首先看下官方的定義:

constant cannot change through re-assignment constant cannot be re-declared

簡單翻譯就是:const定義的變量不能被重新定義,不能被重新賦值。
const 只能確保定義的變量的引用地址不會被改變。但是如果引用指向的
是一個對象的話,你是可以對對象里的值進行修改的,因為沒有改變對象
自身的地址。

const x = {}; x = {foo: 'bar'}; // error - re-assigningconst y = ['foo']; const y = ['bar']; // error - re-declaringconst foo = 'bar'; foo = 'bar2'; // error - can not re-assign var foo = 'bar3'; // error - already declared function foo() {}; // error - already declared

但是對于值的修改是允許的

const x = {};x.foo = 'bar';console.log(x); // {foo : 'bar'}const y = [];y.push('foo');console.log(y); // ['foo'];

總結

以上是生活随笔為你收集整理的理解Javascritp中的引用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。