主頁 > 前端設計 > 零基礎快速掌握JavaScript(3)js作業原理、物件

零基礎快速掌握JavaScript(3)js作業原理、物件

2021-09-14 13:14:32 前端設計

目錄

上篇回顧

一.js作業原理

1.設計初衷

2.單執行緒

3.異步

4.JS同步模式

5.異步模式

6.js垃圾回識訓制

垃圾回收原因:

解決記憶體泄漏的方法:

回收方式:

變數被視為垃圾的情況:

變數不被視為垃圾的情況:

二.物件

1.如何創建物件

1.字面量方式

2.建構式方式

2.呼叫物件屬性及方法

3.如何洗掉、添加、修改物件屬性

4.如何遍歷物件

5.物件型別轉換

1.轉為布爾型別

2.轉為字串型別

3.轉為數值型別

4.重寫toString方法與valueOf方法

6.在物件中的檢測驗性和方法

1.檢測驗性方法

2.檢測物件是否在同一個原型鏈中

7.如何設定物件原始屬性

1.設定某一物件的某一原始屬性:Object.definePropertype()

2.一次設定一個物件的多個原始屬性 Object.definePropertys()

3.查看物件某個屬性的原始屬性 Object.getOwnPropertyDescriptor()

8.構造器屬性

9.值傳遞與參考傳遞(址傳遞)

10.物件序列化

1. 常規轉換

2. 轉換為json字串

3. 轉換為查詢字串


上篇回顧

一.js作業原理

1.設計初衷

js設計初衷為運行在瀏覽器端的腳本語言(主要就是操作dom

2.單執行緒

(若為多執行緒可能會為多個執行緒同時操作一個dom,導致bug頻出)

執行的代碼執行緒只有一個,任務量大執行任務需要排隊,如果某一個任務執行時間很長,那便會出現阻塞的問題,會導致用戶體驗差 ,為了解決阻塞問題,就出現了異步的方式,

3.異步

一般有兩種情況使用異步:

setTimeOut(倒計時)某些功能需要等待多少時間后執行;

Ajax請求 通常也視為異步(請求資料時,資料回傳時間不確定);

4.JS同步模式

5.異步模式

6.js垃圾回識訓制

垃圾回收原因

記憶體中存在一些不再需要的變數,這些 變數會產生垃圾,如果不處理便會一直積壓,會影響到用戶體驗,也會造成記憶體泄露,所以為了解決記憶體泄露,js就有了垃圾回識訓制

解決記憶體泄漏的方法

間隔的不定期的尋找不再使用的變數并釋放

回收方式

標記清除(在變數生成時會打上標記,之后會觀察變數是否需要,不需要時便會清除)

參考技術

變數被視為垃圾的情況:

沒有被參考;多個物件相互參考形成倍訓

變數不被視為垃圾的情況:

有具體的參考關系(閉包:函式內部含有函式,內部函式參考外部變數

全域變數(隨時會被使用,時刻待命

function test(){
    //在函式功能體中每一次執行完畢后,不被參考的變數會被銷毀
   var num = 0;
   console.log(++num);
}
test();//1
test();//1
test();//1

二.物件

js中萬物皆為物件

字串,布爾,數值皆為物件,它們都可以呼叫物件,即呼叫物件原始方法toString(通過原型鏈進行呼叫),其實是在我們Object物件中,它們之所以可以呼叫物件,是因為它們三種型別也是通過物件方法創建的,null、undefined比較特殊,不能呼叫原始方法toString

var str = 'xioaming';
str.toStrong();//可以直接呼叫是因為在呼叫時js會自動進行裝箱的操作,
//裝箱:即自動使用包裝器String()將str轉換為物件,然后再使用tostring方法呼叫
//裝箱后便會通過拆箱來回傳字串
var str1=new String('xioahong');//回傳一個物件型別的字串
console.log(str,str1);//xiaoming   [String: 'xioahong']

1.如何創建物件

1.字面量方式

var stu = {//通過大括號來創建,括號內放置物件的描述(屬性)和功能(方法)
        name:'xiaoming',
        height:180,
        weight:60,
        cook(){//方法,可以有多個
            console.log(this.name+'會做飯');
            //通過this指向本物件,加點屬性名即可呼叫物件的某個屬性
        },
}

2.建構式方式

使用Object或者使用自定義建構式來初始化物件(例如Student)

var stu2 = new Object();
stu2.name="xiaohong";
stu2.height=160;
stu2.weight=50;
stu2.sayHellow=function(){
    console.log(this.name+' say hello')
}
stu2.sayHellow();//xiaohong say hello

2.呼叫物件屬性及方法

訪問物件屬性

點表示法,右側必須是以屬性名稱命名的簡單識別符號

person.name

中括號表示法

中括號中必須是一個計算結果為字串的運算式,可以通過變數訪問屬性,如果屬性名中含語法錯誤的字符,或者屬性名使用的是關鍵字或保留字,可以使用中括號

person["first name"]

//訪問屬性的方式
console.log(stu.name);
console.log(stu['name'])
//[]內必須為字串,不加‘’時會被視為變數,然后全域查找這個變數

//方法呼叫
stu.cook();

3.如何洗掉、添加、修改物件屬性

洗掉屬性只能洗掉自定義屬性,不能洗掉繼承過來的屬性

當添加物件中沒有的屬性時為新增屬性,當物件有時,便為修改屬性

//洗掉
delete stu.height;
//新增
stu.height='180';
//修改
stu.height='170';

4.如何遍歷物件

/物件如何進行for  in 遍歷
//能被for in陳述句列印的屬性稱為可列舉屬性(默認情況下自定義的屬性都是可列舉的)

//不可列舉屬性:js中基本包裝型別的原型屬性是不可列舉的,如Object, Array, Number等
// var num = new Number();
//     for(var pro in num) {
//         console.log("num." + pro + " = " + num[pro]);
//     }
// 它的輸出結果會是空,這是因為Number中內置的屬性是不可列舉的,所以不能被for…in訪問到,

for (k in stu){//in的左側為屬性的鍵,右邊為需要遍歷的物件,里面有多少屬性就列印多少次
    console.log(stu.k);//呼叫失敗,不加括號被認為是變數
    console.log(stu[k]);//呼叫成功
//代表物件屬性的鍵,即name,weight,height等屬性名的統稱
//鍵的右側即為值,所以name:‘xm’稱為鍵值對
}

5.物件型別轉換

1.轉為布爾型別

// Object型別到Boolean型別
//空物件也可以直接轉
var obj={};
console.log(Boolean(obj));//true

// 除了空參考(null)會轉換為false,其他都被轉換為true

var obj = {
	name:"briup",
	age:12
};
console.log(Boolean(obj));//true

2.轉為字串型別

// Object型別轉換為String型別
console.log(obj.toString());//[object Object]
console.log(String(obj));//[object Object]

3.轉為數值型別

// Object型別轉換為Number型別
//如果沒有重寫valueOf,轉數值型別會回傳NaN,若重寫則優先呼叫valueOf
var obj = {
	name:"briup",
	age:12,}
console.log(Number(obj));//NaN

4.重寫toString方法與valueOf方法

//重寫一個物件toString();
var obj = {
	name:"briup",
	age:12,
	toString:function(){
	return this.name+"--"+this.age;
    }
};
console.log(obj.toString());//briup--12
console.log(String(obj));//briup--12
//重寫toString方法后,包裝器會自動呼叫toString,然后獲取toString的值并回傳
//所以在呼叫方法時要注意是否有重寫toString方法


// valueOf()   toString()
/*
1.兩個方法都為物件的原始方法
2.valueOf為物件原始值,通常不會顯示的呼叫,通常由js自動在后臺呼叫
3.toString本身作用就是做字串的轉換,也會進行自動呼叫
4.如果只重寫了valueOf()或者toString()方法,
無論是運算還是顯示都呼叫該方法,并將回傳值用Number()轉換,
5.如果兩個方法都重寫了,運算時優先呼叫valueOf(),
并將回傳值用Number()轉換,進行顯示時優先呼叫toString()
6.如果兩個方法都沒有重寫,則回傳NaN
*/ 

var obj = {
	name:"briup",
	age:12,
	toString:function(){
		return "100";
	},
	valueOf:function(){
		return 10;
	}
};

console.log(obj+2);//12
console.log(Number(obj));//10

var obj = {
	name:"briup",
	age:12,
	toString:function(){
		return "100";
	},
}
console.log(obj+2);//1002 字串型別的數值
console.log(Number(obj));//100

//可以通過valueOf實作累加,每次呼叫obj時,valueOf都會被呼叫
//因為num在valueOf中被參考,所以不會被垃圾回識訓制回收
var obj = {
    num:1,
    valueOf:function(){
        return this.num++
    }
}
console.log(obj==1);//true
console.log(obj==2);//true
console.log(obj==3);//true

6.在物件中的檢測驗性和方法

1.檢測驗性方法

//檢測驗性方法
//in 關鍵詞 檢測某個屬性是否是某個物件自有屬性或者繼承屬性,回傳布爾型別(true或false)
//hasOwnProperty(PropertyName)   檢測某個屬性是否是某個物件自有屬性,繼承的屬性不行
//propertyIsEnumerable()   檢測某個屬性是否是某個物件自有屬性,且可列舉
var obj  = {
    name:'xm'
}
console.log('name' in obj);//true
console.log(obj.hasOwnProperty('name'));//true
console.log(obj.propertyIsEnumerable('name'));//true
console.log(obj.hasOwnProperty('hhh'));//false 沒有的就回傳false

2.檢測物件是否在同一個原型鏈中

原型鏈是一種關系,是實體物件和原型物件之間的關系,這種關系是通過原型(proto)來聯系的,

//檢測物件是否在同一個原型鏈中(同一個家族,有層次,逐級向下)
//isPrototypeOf(object) 檢測一個物件是否存在與另一個物件的原型鏈上,
//在就回傳true反之false(原型的指向) 檢查傳入的物件的原型 
//instanceof  檢測一個物件是否是某個建構式的實體(new)
var str = new String('hh');
console.log(str instanceof String);//true
console.log(str instanceof Object);//true 沿著原型鏈一直向上找

function Animal(){}//自定義一個函式
var dog1 = new Animal();
console.log(dog1 instanceof Animal);//true
console.log(dog1 instanceof Object);//true 無論是什么物件它的頂層都是object

console.log(Animal.prototype.isPrototypeOf(dog1));//true
console.log(Object.prototype.isPrototypeOf(dog1));//true
function Dog(){}
var dog2 = new Dog();
console.log(Animal.prototype.isPrototypeOf(dog2));//false 不在一條原型鏈中
Dog.prototype = new Animal();//原型鏈繼承,將子類建構式的原型屬性,指向父類的實體
//new animal相當于建構式的父親,而animal相當于他的家族,
//之所以指向他而不是指向animal,是因為生它的是他的父親而不是家族
var dog2 = new Dog();
console.log(Animal.prototype.isPrototypeOf(dog2));//true

7.如何設定物件原始屬性

1.設定某一物件的某一原始屬性:Object.definePropertype()

//設定一個物件的原始屬性
//Object.defineProperty 只能設定某一個物件中的某一個屬性的原始屬性
var obj = {
	name:'xm',
	age:12,
	sex:'nan'
}
Object.defineProperty(obj,'name',{
	configurable:false,//原始屬性 默認可以被洗掉,false即不可被洗掉
	enumerable:false,//原始屬性  默認可以被列舉  false即不可以列舉
	writable:false,//原始屬性   默認可以被修改   false即不可以修改
	value:'lisi'
})
console.log(obj);
console.log(obj.name);//可以呼叫,但因為不可列舉,所以在node中不展示
delete obj.name;//不可被洗掉
obj.name = 'xm';//不可以修改
console.log(obj.name);//{ age: 12, sex: 'nan' } lisi
for(var k in obj){
	console.log(obj[k]);
}//不可列舉

2.一次設定一個物件的多個原始屬性 Object.definePropertys()

//一次設定物件的多個原始屬性
//Object.defineProperties
Object.defineProperties(obj,{
	age:{
		configurable:false
	},
	sex:{
		configurable:false
	}
})

3.查看物件某個屬性的原始屬性 Object.getOwnPropertyDescriptor()

//想知道某個屬性的原始屬性 Object.getOwnPropertyDescriptor()
var res = Object.getOwnPropertyDescriptor(obj,'name');
console.log(res);
// {value: 'lisi',writable: false,enumerable: false,configurable: false }

8.構造器屬性

可以重寫自定義屬性set與get方法

在物件中,我們可能會設定一些比較奇怪的屬性 _num、這種屬性我們稱為構造器函式,這種屬性我們不希望直接通過外部訪問 obj_num,我們希望自己去控制這個屬性的訪問邏輯 ,即obj_num可以訪問到,并且會對它進行一些邏輯改變

var obj = {
	_num:0
}
//obj_num可以訪問到,且會回傳數字:0
//構造器屬性:可以重寫自定義屬性set與get方法
Object.defineProperty(obj,'num',{
//當我們沒有設定這兩個屬性時,默認是隱式呼叫,如果設定了則會呼叫你設定的方法
	set(num){
		this._num = num
	},//在num的值被設定時,呼叫
	get(){
		return '數字:'+this._num
	}//在num的值被獲取時,呼叫
})

console.log(obj.num);//數字:0
obj.num=5;
console.log(obj.num);//數字:5

9.值傳遞與參考傳遞(址傳遞)

基本資料型別的變數:

可以直接操作保存在變數中的實際的值

引數傳遞的時候傳遞的是實際值

參考資料型別的變數:

不能直接操作物件的記憶體空間,實際上是在操作物件的參考,可以為參考型別變數添加屬性和方法,也可以改變和洗掉其屬性和方法,

引數傳遞的時候傳遞的是參考地址,

10.物件序列化

物件序列化是指將物件的狀態轉換為字串,也可以反序列化,將字串還原為物件函式,RegExp,Error物件,undefined值不能序列化和反序列化,

JSON.stringify(obj) 將物件序列化為Json字串,只能序列化物件可列舉的自有屬性

JSON.parse(jsonStr) 反序列化

1. 常規轉換

obj.toString()

2. 轉換為json字串

JSON.stringify(obj)

//用戶輸入資訊
var user_info = {
	username:'zs',
	password:'123321',
	age:'13'
}
//登錄介面需要json格式的資料
//JSON.stringify(obj)
var j_str = JSON.stringify(user_info);//{"username":"zs","password":"123321","age":"13"}
console.log(j_str);//{"username":"zs","password":"123321","age":"13"}
// 回傳json字串,是一種有規則的字串
//得到json字串如何轉回物件
var user_info2 = JSON.parse(j_str)//反序列化
console.log(user_info2);//{ username: 'zs', password: '123321', age: '13' }
console.log(user_info2.username);//zs

//自定義json字串反序列化為物件
var str = '{ "username": "zs"," password": "123321", "age": 13 }';
var str_obj = JSON.parse(str);
console.log(str_obj.age);//zs 13

3. 轉換為查詢字串

var qs = require('querystring')

qs.stringify(obj)

轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/299998.html

標籤:其他

上一篇:HTML第一篇

下一篇:微軟要給我30萬美元的額外獎勵,被我拒了!

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • vue移動端上拉加載

    可能做得過于簡單或者比較low,請各位大佬留情,一起探討技術 ......

    uj5u.com 2020-09-10 04:38:07 more
  • 優美網站首頁,頂部多層導航

    一個個人用的瀏覽器首頁,可以把一下常用的網站放在這里,平常打開會比較方便。 第一步,HTML代碼 <script src=https://www.cnblogs.com/szharf/p/"js/jquery-3.4.1.min.js"></script> <div id="navigate"> <ul> <li class="labels labels_1"> ......

    uj5u.com 2020-09-10 04:38:47 more
  • 頁面為要加<!DOCTYPE html>

    最近因為寫一個js函式,需要用到$(window).height(); 由于手寫demo的時候,過于自信,其實對前端方面的認識也不夠體系,用文本檔案直接敲出來的html代碼,第一行沒有加上<!DOCTYPE html> 導致了$(window).height();的結果直接是整個document的高 ......

    uj5u.com 2020-09-10 04:38:52 more
  • WordPress網站程式手動升級要做好資料備份

    WordPress博客網站程式在進行升級前,必須要做好網站資料的備份,這個問題良家佐言是遇見過的;在剛開始接觸WordPress博客程式的時候,因為升級問題和博客網站的修改的一些嘗試,良家佐言是吃盡了苦頭。因為購買的是西部數碼的空間和域名,每當佐言把自己的WordPress博客網站搞到一塌糊涂的時候 ......

    uj5u.com 2020-09-10 04:39:30 more
  • WordPress程式不能升級為5.4.2版本的原因

    WordPress是一款個人博客系統,受到英文博客愛好者和中文博客愛好者的追捧,并逐步演化成一款內容管理系統軟體;它是使用PHP語言和MySQL資料庫開發的,用戶可以在支持PHP和MySQL資料庫的服務器上使用自己的博客。每一次WordPress程式的更新,就會牽動無數WordPress愛好者的心, ......

    uj5u.com 2020-09-10 04:39:49 more
  • 使用CSS3的偽元素進行首字母下沉和首行改變樣式

    網頁中常見的一種效果,首字改變樣式或者首行改變樣式,效果如下圖。 代碼: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, ......

    uj5u.com 2020-09-10 04:40:09 more
  • 關于a標簽的講解

    什么是a標簽? <a> 標簽定義超鏈接,用于從一個頁面鏈接到另一個頁面。 <a> 元素最重要的屬性是 href 屬性,它指定鏈接的目標。 a標簽的語法格式:<a href=https://www.cnblogs.com/summerxbc/p/"指定要跳轉的目標界面的鏈接">需要展示給用戶看見的內容</a> a標簽 在所有瀏覽器中,鏈接的默認外觀如下: 未被訪問的鏈接帶 ......

    uj5u.com 2020-09-10 04:40:11 more
  • 前端輪播圖

    在需要輪播的頁面是引入swiper.min.js和swiper.min.css swiper.min.js地址: 鏈接:https://pan.baidu.com/s/15Uh516YHa4CV3X-RyjEIWw 提取碼:4aks swiper.min.css地址 鏈接:https://pan.b ......

    uj5u.com 2020-09-10 04:40:13 more
  • 如何設定html中的背景圖片(全屏顯示,且不拉伸)

    1 <style>2 body{background-image:url(https://uploadbeta.com/api/pictures/random/?key=BingEverydayWallpaperPicture); 3 background-size:cover;background ......

    uj5u.com 2020-09-10 04:40:16 more
  • Java學習——HTML詳解(上)

    HTML詳解 初識HTML Hyper Text Markup Language(超文本標記語言) 1 <!--DOCTYPE:告訴瀏覽器我們要使用什么規范--> 2 <!DOCTYPE html> 3 <html lang="en"> 4 <head> 5 <!--meta 描述性的標簽,描述一些 ......

    uj5u.com 2020-09-10 04:40:33 more
最新发布
  • 我的第一個NPM包:panghu-planebattle-esm(胖虎飛機大戰)使用說明

    好家伙,我的包終于開發完啦 歡迎使用胖虎的飛機大戰包!! 為你的主頁添加色彩 這是一個有趣的網頁小游戲包,使用canvas和js開發 使用ES6模塊化開發 效果圖如下: (覺得圖片太sb的可以自己改) 代碼已開源!! Git: https://gitee.com/tang-and-han-dynas ......

    uj5u.com 2023-04-20 07:59:23 more
  • 生產事故-走近科學之消失的JWT

    入職多年,面對生產環境,盡管都是小心翼翼,慎之又慎,還是難免捅出簍子。輕則滿頭大汗,面紅耳赤。重則系統停擺,損失資金。每一個生產事故的背后,都是寶貴的經驗和教訓,都是專案成員的血淚史。為了更好地防范和遏制今后的各類事故,特開此專題,長期更新和記錄大大小小的各類事故。有些是親身經歷,有些是經人耳傳口授 ......

    uj5u.com 2023-04-18 07:55:04 more
  • 記錄--Canvas實作打飛字游戲

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 打開游戲界面,看到一個畫面簡潔、卻又富有挑戰性的游戲。螢屏上,有一個白色的矩形框,里面不斷下落著各種單詞,而我需要迅速地輸入這些單詞。如果我輸入的單詞與螢屏上的單詞匹配,那么我就可以獲得得分;如果我輸入的單詞錯誤或者時間過長,那么我就會輸 ......

    uj5u.com 2023-04-04 08:35:30 more
  • 了解 HTTP 看這一篇就夠

    在學習網路之前,了解它的歷史能夠幫助我們明白為何它會發展為如今這個樣子,引發探究網路的興趣。下面的這張圖片就展示了“互聯網”誕生至今的發展歷程。 ......

    uj5u.com 2023-03-16 11:00:15 more
  • 藍牙-低功耗中心設備

    //11.開啟藍牙配接器 openBluetoothAdapter //21.開始搜索藍牙設備 startBluetoothDevicesDiscovery //31.開啟監聽搜索藍牙設備 onBluetoothDeviceFound //30.停止監聽搜索藍牙設備 offBluetoothDevi ......

    uj5u.com 2023-03-15 09:06:45 more
  • canvas畫板(滑鼠和觸摸)

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>canves</title> <style> #canvas { cursor:url(../images/pen.png),crosshair; } #canvasdiv{ bo ......

    uj5u.com 2023-02-15 08:56:31 more
  • 手機端H5 實作自定義拍照界面

    手機端 H5 實作自定義拍照界面也可以使用 MediaDevices API 和 <video> 標簽來實作,和在桌面端做法基本一致。 首先,使用 MediaDevices.getUserMedia() 方法獲取攝像頭媒體流,并將其傳遞給 <video> 標簽進行渲染。 接著,使用 HTML 的 < ......

    uj5u.com 2023-01-12 07:58:22 more
  • 記錄--短視頻滑動播放在 H5 下的實作

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 短視頻已經無數不在了,但是主體還是使用 app 來承載的。本文講述 H5 如何實作 app 的視頻滑動體驗。 無聲勝有聲,一圖頂百辯,且看下圖: 網址鏈接(需在微信或者手Q中瀏覽) 從上圖可以看到,我們主要實作的功能也是本文要講解的有: ......

    uj5u.com 2023-01-04 07:29:05 more
  • 一文讀懂 HTTP/1 HTTP/2 HTTP/3

    從 1989 年萬維網(www)誕生,HTTP(HyperText Transfer Protocol)經歷了眾多版本迭代,WebSocket 也在期間萌芽。1991 年 HTTP0.9 被發明。1996 年出現了 HTTP1.0。2015 年 HTTP2 正式發布。2020 年 HTTP3 或能正... ......

    uj5u.com 2022-12-24 06:56:02 more
  • 【HTML基礎篇002】HTML之form表單超詳解

    ??一、form表單是什么

    ??二、form表單的屬性

    ??三、input中的各種Type屬性值

    ??四、標簽 ......

    uj5u.com 2022-12-18 07:17:06 more