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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

obj: object是什么意思_面试官问你JavaScript基本类型时他想知道什么?

發布時間:2025/3/20 javascript 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 obj: object是什么意思_面试官问你JavaScript基本类型时他想知道什么? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文原載于SegmentFault專欄"前端小將"

整理編輯:SegmentFault

面試的時候我們經常會被問答js的數據類型。大部分情況我們會這樣回答包括:
1.基本類型(值類型或者原始類型): Number、Boolean、String、NULL、Undefined以及ES6的Symbol
2.引用類型:Object、Array、Function、Date等
作者曾經也是這樣回答的,并且一直覺得沒有什么問題。那么面試官問你Js數據類型時,他想知道什么呢?

1 、在內存中的位置不同

  • 基本類型: 占用空間固定,保存在棧中

  • 引用類型:占用空間不固定,保存在堆中

棧(stack)為自動分配的內存空間,它由系統自動釋放;使用一級緩存,被調用時通常處于存儲空間中,調用后被立即釋放。堆(heap)則是動態分配的內存,大小不定也不會自動釋放。使用二級緩存,生命周期與虛擬機的GC算法有關

當一個方法執行時,每個方法都會建立自己的內存棧,在這個方法內定義的變量將會逐個放入這塊棧內存里,隨著方法的執行結束,這個方法的內存棧也將自然銷毀了。因此,所有在方法中定義的變量都是放在棧內存中的;棧中存儲的是基礎變量以及一些對象的引用變量,基礎變量的值是存儲在棧中,而引用變量存儲在棧中的是指向堆中的數組或者對象的地址,這就是為何修改引用類型總會影響到其他指向這個地址的引用變量。

當我們在程序中創建一個對象時,這個對象將被保存到運行時數據區中,以便反復利用(因為對象的創建成本通常較大),這個運行時數據區就是堆內存。堆內存中的對象不會隨方法的結束而銷毀,即使方法結束后,這個對象還可能被另一個引用變量所引用(方法的參數傳遞時很常見),則這個對象依然不會被銷毀,只有當一個對象沒有任何引用變量引用它時,系統的垃圾回收機制才會在核實的時候回收它。

2、賦值、淺拷貝、深拷貝

  • 對于基本類型值,賦值、淺拷貝、深拷貝時都是復制基本類型的值給新的變量,之后二個變量之間操作不在相互影響。

  • 對于引用類型值,

賦值后二個變量指向同一個地址,一個變量改變時,另一個也同樣改變;

淺拷貝后得到一個新的變量,這個與之前的已經不是指向同一個變量,改變時不會使原數據中的基本類型一同改變,但會改變會原數據中的引用類型數據

深拷貝后得到的是一個新的變量,她的改變不會影響元數據

-和原數據是否指向同一對象第一層數據為基本數據類型原數據中包含子對象
賦值改變會使原數據一同改變改變會使原數據一同改變
淺拷貝改變不會使原數據一同改變改變會使原數據一同改變
深拷貝改變不會使原數據一同改變改變不會使原數據一同改變
var obj1 = { 'name' : 'zhangsan', 'age' : '18', 'language' : [1,[2,3],[4,5]], }; var obj2 = obj1; var obj3 = shallowCopy(obj1); function shallowCopy(src) { var dst = {}; for (var prop in src) { if (src.hasOwnProperty(prop)) { dst[prop] = src[prop]; } } return dst; } obj2.name = "lisi"; obj3.age = "20"; obj2.language[1] = ["二","三"]; obj3.language[2] = ["四","五"]; console.log(obj1); //obj1 = { // 'name' : 'lisi', // 'age' : '18', // 'language' : [1,["二","三"],["四","五"]], //}; console.log(obj2); //obj2 = { // 'name' : 'lisi', // 'age' : '18', // 'language' : [1,["二","三"],["四","五"]], //}; console.log(obj3); //obj3 = { // 'name' : 'zhangsan', // 'age' : '20', // 'language' : [1,["二","三"],["四","五"]], //};

2.1、淺拷貝

數組常用的淺拷貝方法有slice,concat,Array.from()?,以及es6的析構

var arr1 = [1, 2,{a:1,b:2,c:3,d:4}];var arr2 = arr1.slice();var arr3 = arr1.concat();var arr4 = Array.from(arr1);var arr5 = [...arr1];arr2[0]=2;arr2[2].a=2;arr3[0]=3;arr3[2].b=3;arr4[0]=4;arr4[2].c=4;arr5[0]=5;arr5[2].d=5;// arr1[1,2,{a:2,b:3,c:4,d:5}]// arr2[2,2,{a:2,b:3,c:4,d:5}]// arr3[3,2,{a:2,b:3,c:4,d:5}]// arr4[4,2,{a:2,b:3,c:4,d:5}]// arr5[5,2,{a:2,b:3,c:4,d:5}]

對象常用的淺拷貝方法Object.assign(),es6析構

var obj1 = { x: 1, y: { m: 1 }};var obj2 = Object.assign({}, obj1);console.log(obj1) //{x: 1, y: {m: 1}}console.log(obj2) //{x: 1, y: {m: 1}}obj2.x=2;obj2.y.m = 2; //修改obj2.y.mconsole.log(obj1) //{x: 1, y: {m: 2}}console.log(obj2) //{x: 2, y: {m: 2}}

我們自己實現一個淺拷貝

var obj = { a:1, arr: [2,3] };var shallowObj = shallowCopy(obj);var shallowCopy = function(obj) { // 只拷貝對象 if (typeof obj !== 'object') return; // 根據obj的類型判斷是新建一個數組還是對象 var newObj = obj instanceof Array ? [] : {}; // 遍歷obj,并且判斷是obj的屬性才拷貝 for (var key in obj) { if (obj.hasOwnProperty(key)) { newObj[key] = obj[key]; } } return newObj;}

2.2、深拷貝

比較簡單粗暴的的做法是使用JSON.parse(JSON.stringify(obj))

var arr = ['old', 1, true, ['old1', 'old2'], {old: 1}]var new_arr = JSON.parse( JSON.stringify(arr) );new_arr[4].old=4;console.log(arr); //['old', 1, true, ['old1', 'old2'], {old: 1}]console.log(new_arr); //['old', 1, true, ['old1', 'old2'], {old: 4}]

JSON.parse(JSON.stringify(obj))?看起來很不錯,不過MDN文檔?的描述有句話寫的很清楚:

undefined、任意的函數以及 symbol 值,在序列化過程中會被忽略(出現在非數組對象的屬性值中時)或者被轉換成 null(出現在數組中時)。

但是在平時的開發中JSON.parse(JSON.stringify(obj))已經滿足90%的使用場景了。
下面我們自己來實現一個

var deepCopy = function(obj) { if (typeof obj !== 'object') return; var newObj = obj instanceof Array ? [] : {}; for (var key in obj) { if (obj.hasOwnProperty(key)) { newObj[key] = typeof obj[key] === 'object' ? deepCopy(obj[key]) : obj[key]; } } return newObj;}

3、參數的傳遞

所有的函數參數都是按值傳遞。也就是說把函數外面的值賦值給函數內部的參數,就和把一個值從一個變量賦值給另一個一樣;

  • 基本類型

var a = 2;function add(x) { return x = x + 2;}var result = add(a);console.log(a, result); // 2 4
  • 引用類型

function setName(obj) { obj.name = 'laowang'; obj = new Object(); obj.name = 'Tom';}var person = new Object();setName(person);console.log(person.name); //laowang

很多人錯誤地以為在局部作用域中修改的對象在全局作用域中反映出來就是說明參數是按引用傳遞的。
但是通過上面的例子可以看出如果person是按引用傳遞的最終的person.name應該是Tom。
實際上當函數內部重寫obj時,這個變量引用的就是一個局部變量了。而這個變量會在函數執行結束后銷毀。(這是是在js高級程序設計看到的,還不是很清楚)

4、判斷方法

基本類型用typeof,引用類型用instanceof

特別注意typeof null是"object",?null instanceof Object是true;console.log(typeof "Nicholas"); // "string"console.log(typeof 10); // "number"console.log(typeof true); // "boolean"console.log(typeof undefined); // "undefined"console.log(typeof null); // "object"var items = [];var obj = {};function reflect(value){ return value;}console.log(items instanceof Array); // true;console.log(obj instanceof Object); // true;console.log(reflect instanceof Function); // true;Object.prototype.toString.call([]).slice(8, -1)有興趣的同學可以看一下這個是干什么的

5、總結


歡迎關注 SegmentFault 微信公眾號 :)

總結

以上是生活随笔為你收集整理的obj: object是什么意思_面试官问你JavaScript基本类型时他想知道什么?的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 日本男人天堂网 | 午夜无遮挡 | 字幕网在线 | 日韩精品一二三四区 | 浪潮av色 | 巨乳美女动漫 | 久久你懂的 | 初尝人妻少妇中文字幕 | 国产h视频 | 插久久 | 欧美性生活 | 另类尿喷潮videofree | 欧美日本国产在线 | 成人av电影天堂 | 在线看片| 91二区| xxx国产在线观看 | 麻豆视频在线观看免费网站 | 超碰青娱乐| 国产日韩一区二区 | 澳门免费av| av大片在线免费观看 | 午夜成人免费影院 | 日本福利在线观看 | 黄色一级片视频 | 精品国产制服丝袜高跟 | aaaa黄色 | jizz中国女人高潮 | 我们的生活第五季在线观看免费 | 爆乳熟妇一区二区三区霸乳 | 国产精品午夜在线 | 国产综合久久久久 | 啪啪啪一区二区 | 丁香花完整视频在线观看 | 成人综合在线观看 | 久久超级碰碰 | 自拍偷拍18p | 久久香蕉精品视频 | av每日更新 | 午夜影视体验区 | 亚洲天堂社区 | 国产成人99| 欧美成人国产精品一区二区 | 一区二区国产精品精华液 | 免费一级大片 | 一区二区三区精品视频 | 日本免费高清一区二区 | 福利网站在线 | 日韩一级成人 | 国产三级91 | 国产三级一区 | 成人国产片女人爽到高潮 | 国产精品久久久久久久久久东京 | 久久久久成人网 | 污视频免费在线观看网站 | 强开乳罩摸双乳吃奶羞羞www | 国产农村妇女精品久久久 | 亚洲一区精品视频在线观看 | 日日干夜夜爱 | 一区二区三区高清 | 一级欧美视频 | 天天爽夜夜爽一区二区三区 | 高清久久 | 久久青青草视频 | 国产成人无遮挡在线视频 | 天天干夜夜嗨 | 水多多在线 | 色婷婷久久一区二区三区麻豆 | 一区二区三区在线免费视频 | 91麻豆产精品久久久久久 | 国产精品美女久久久久av超清 | 午夜婷婷丁香 | 翔田千里一区二区 | 天堂俺去俺来也www久久婷婷 | 国语对白做受欧美 | 精品久久久久久久久久久久久久久久久 | 在线免费看黄色片 | 五月天丁香激情 | 午夜操操 | 午夜宅男网 | 艳母免费在线观看 | 少妇一边呻吟一边说使劲视频 | 国产成人精品一区二区在线观看 | 梦梦电影免费高清在线观看 | 无码粉嫩虎白一线天在线观看 | 这里只有精品在线观看 | 麻豆网站在线播放 | 天天射天天操天天干 | 妺妺窝人体色www婷婷 | 国产欧美一区二区三区在线看蜜臂 | 女性喷水视频 | 中文字幕一区二区三区精品 | 成人午夜视频免费 | 伊人成年网| 国产成人小视频在线观看 | 自拍偷拍精品视频 | 黄色国产片 | 特级大胆西西4444人体 | 国产网站免费在线观看 |