小趴菜的對象

數(shù)據(jù)是什么?

數(shù)據(jù)是具有特定形式的信息。
數(shù)據(jù)是可以被解析器處理的有效信息。
程序的運(yùn)行離不開數(shù)據(jù),數(shù)據(jù)是程序運(yùn)行過程中操作的值。

  // 146/:Uncaught SyntaxError: expected expression, got end of script 語法錯(cuò)誤
       // hello:Uncaught ReferenceError: hello is not defined 引用錯(cuò)誤
       true
       null
       undefined
       Symbol//新的數(shù)據(jù)類型,表示一種符號(hào)
       100+100
       console.log("hello"+100)//hello100
       console.log(true+100)//101:true進(jìn)行了數(shù)據(jù)類型轉(zhuǎn)換
       console.log(null/0)//NaN

數(shù)據(jù)類型是什么?

  • 計(jì)算機(jī)程序通過操作值或文本來工作。根據(jù)值的自身特點(diǎn),程序?qū)χ档牟僮鞯姆绞揭膊煌?。如:?shù)值可以用來計(jì)算,文本可以并接。
  • 數(shù)據(jù)類型用于表示不同特點(diǎn)的值的類型。

數(shù)據(jù)類型的分類

js定義了八種數(shù)據(jù)類型,其中七種是原始值

原始值(primitive values)

原始值是一種簡單的數(shù)據(jù)類型,它只包含一種類型的值。沒有屬性和方法的值就是原始值。
特點(diǎn)1.不可變,2.原始值在任何時(shí)候是沒有屬性和方法的,3.存儲(chǔ)在內(nèi)存棧中

  • 字符串 (String)

  • 布爾值(true false)

  • 數(shù)值(Mumber)

  • Symbol

  • Bihint

  • null

  • undefined

    對象值(object)

    對象值是一種復(fù)雜數(shù)據(jù)類型,它可以包含多種類型的值。
    特點(diǎn)1.可變值,2.對象有屬性和方法,3.對象存儲(chǔ)在內(nèi)存堆中。

  • 對象:變量的集合||對象是屬性的集合

  • 數(shù)組:值的有序集合

  • 函數(shù):語句的集合

  • Date:毫秒數(shù)

  • Math

  • ......

對象也是一種數(shù)據(jù)結(jié)構(gòu)。數(shù)據(jù)結(jié)構(gòu)就是一個(gè)放置復(fù)雜數(shù)據(jù)的容器。

值的有序集合,數(shù)據(jù)結(jié)構(gòu):數(shù)組

[1,2,3]

表示鍵值對,數(shù)據(jù)結(jié)構(gòu):對象

{x:1,y:2}

重復(fù)調(diào)用多條語句,數(shù)據(jù)結(jié)構(gòu):函數(shù)

function fn(){
//語句1
//語句2
//......
}

對象分類

按來源分類

  • 內(nèi)置對象
    Number String Boolean Object Function Array Math RegExp Date

  • 宿主對象

  • 自定義對象

    const arr = new Array()//內(nèi)置對象
          const obj = {x:1,y:2}//自定義
          const win = window//宿主對象
          const d = document//宿主對象
          const h = history//宿主對象
          const http = new XMLHttpRequest()//宿主對象
          //內(nèi)置對象 Number String Boolean Object Function Array Math RegExp Date
    

    創(chuàng)建對象

    • 字?量法

    • 構(gòu)造函數(shù)法

    • Object.create()

    對象字面量

    定義:使用花括號(hào)包含的一組逗號(hào)分割的名值對。
    注意對象字面量是一個(gè)表達(dá)式,每次求值都會(huì)創(chuàng)建并初始化一個(gè)新對象。

    //①花括號(hào) ②多個(gè)屬性?逗號(hào)分隔 ③屬性值可以是任意數(shù)據(jù)類型
    //④屬性名:必須是字符串或Symbol
    const obj = {
    name: '',
    age: 18,//建議寫上
    10:'hello',
    true:'haha',
    undefined:'hahaha',
    'a-b':'hehehehe',
    Symbol:'nihao'
    }
    obj.hobies = '游泳'
    console.log(obj['10']);
    console.log(obj.true);
    console.log(obj.undefined);
    console.log(obj['a-b']);
    console.log(obj.Symbol);
    const arr = ['a','b','c','d']
    console.log(arr['0']);
    

如何讀取對象的屬性

點(diǎn)語法

?括號(hào)法

如何修改/添加對象屬性

?法1:點(diǎn)語法賦值

?法2:?括號(hào)法賦值

?法3:Object.defineProperty()

定義

Object.defineProperty() 靜態(tài)?法直接在?個(gè)對象上定義?個(gè)新的屬性,或者修改?個(gè)對象上的現(xiàn)有屬性,并返回該對象。

語法

Object.defineProperty(obj, prop, descriptor)
Object.defineProperty(對象名, 屬性名, 屬性描述符)
Object.defineProperty(對象名, 屬性名, {
enumerable: true,//是否可枚舉
configurable: true,//是否可配置
writable: false,//是否可修改
value: 18,//設(shè)置屬性值
})
  • 對象名

  • 屬性名

  • 屬性描述符:是一個(gè)對象。用于描述屬性的細(xì)節(jié)

const obj = {
name: '張三'
}
obj.hobbies = '游泳' //通過點(diǎn)語法添加的屬性都是可枚舉的
Object.defineProperty(obj, 'age', {
enumerable: true,//是否可枚舉
configurable: true,//是否可配置
writable: false,//是否可修改
value: 18,//設(shè)置屬性值
})
Object.defineProperty(obj, 'age', {
enumerable: false,//是否可枚舉
configurable: false,//是否可配置
writable: false,//是否可修改
value: 18,//設(shè)置屬性值
})
console.log(obj);
obj.age = 100
console.log(obj.age);
for(key in obj)
console.log(key);

刪除對象屬性的方法

//刪除對象屬性的?法:delete操作符
delete student.age
//delete刪除對象的屬性,會(huì)全部刪除:屬性和屬性值
console.log(student.age);
//delete刪除數(shù)組元素,只刪除值,不刪除屬性
const arr = ['a','b','c','d']
console.log(delete arr['0']);
console.log(arr[0]);//
console.log(arr.length);//4 數(shù)組?度不變

遍歷數(shù)組的方法

遍歷數(shù)組的方法:

  • for循環(huán):工作原理是通過3個(gè)表達(dá)式來控制循環(huán)

  • 迭代法(for...of): 原理是通過數(shù)組內(nèi)部的 iterable (可迭代對象)進(jìn)?迭代。注意:對象內(nèi)部是沒有可迭代對象的。只有含有iterable 的數(shù)據(jù)可以使用迭代,

//遍歷數(shù)組:迭代法 (for...of)
const arr = ['a','b','c','d']
//for循環(huán): 利?三個(gè)表達(dá)式控制循環(huán)
let len = arr.length
for(let i = 0; i < len; i++)
console.log(arr[i]);
//for...of:?來迭代值
let i = 0
for(item of arr){
console.log(item,i);
i++
}

遍歷對象的方法

遍歷對象的方法

  • 枚舉法(for...in):枚舉(enumerable)是對象的內(nèi)部屬性、該屬性用于控制哪些屬性可遍歷。

  • 枚舉:枚舉是對象的內(nèi)部屬性,用于控制for...in中的輸出的屬性

//遍歷對象:枚舉法
const obj = {
name: '張三',
nickname: '法外狂徒',
age: 18,
gender: '男',
single: true,
hobbies: ['游泳','打架','拳擊'],
}
//for...in循環(huán)
for(key in obj)
console.log(key);

內(nèi)置對象/函數(shù)

let str = new String('hello') //創(chuàng)建字符串
let str2 = String(true)//普通函數(shù)調(diào)?:強(qiáng)制轉(zhuǎn)換成字符串
console.log(typeof str) //object
let str2 =
let num = new Number(100) //創(chuàng)建數(shù)字對象
let num2 = Number(true) //普通函數(shù)調(diào)? 強(qiáng)制轉(zhuǎn)換數(shù)值

undefined和null永遠(yuǎn)沒有屬性和?法

Object是對象還是函數(shù)

//萬物皆對象
let str = new String('hello') //創(chuàng)建字符串
console.log(typeof str) //object
let str2 = 'hello' //原始值
console.log(typeof str2);
console.log(str2.length);//5 包裝對象是?個(gè)臨時(shí)對象
let num = new Number(true) //創(chuàng)建數(shù)字 所有的屬性和?法定義在了構(gòu)造函數(shù)上
console.log(num);
let b = new Boolean()
//只有undefined和null沒有構(gòu)造函數(shù),他們永遠(yuǎn)沒有屬性和?法
console.log(typeof null);//null表示空對象
Number()
Object()
Boolean()
Array()
Date() 

靜態(tài)屬性是什么?

const arr = ['a','b','c','d']
console.log(delete arr['0']);
console.log(arr[0]);
console.log(arr.length);//4
function Abc(){ //?來構(gòu)造對象
this.name = 'hello'
}
Abc.age = 100 //添加到構(gòu)造函數(shù)身上的屬性稱為靜態(tài)屬性
let obj = new Abc()
console.log(obj);
// obj.age = 100
// console.log(obj)

構(gòu)造函數(shù)

什么是構(gòu)造函數(shù)

構(gòu)造函數(shù)就是構(gòu)造器函數(shù)(constructor function)。?個(gè)?于構(gòu)建多個(gè)對象的特殊函數(shù)

  • 首先,他是一個(gè)函數(shù)

  • 構(gòu)造函數(shù)的英文:constructor function

    • 構(gòu)造函數(shù)是一個(gè)構(gòu)造器
  • 構(gòu)造函數(shù)是一個(gè)用于構(gòu)造對象的函數(shù)

  • 構(gòu)造對象 === 創(chuàng)建對象

構(gòu)造函數(shù)的問題:

通過構(gòu)造器函數(shù)向?qū)ο筇砑?法的缺點(diǎn)是:當(dāng)創(chuàng)建多個(gè)對象實(shí)例時(shí), this.sayHi 被添加到每?個(gè)實(shí)例對象中,也就是說內(nèi)存使?效率降低:每個(gè)實(shí)例的 sayHi ?法會(huì)在內(nèi)存堆中創(chuàng)建存儲(chǔ)空間。

(缺點(diǎn):為每個(gè)實(shí)例對象添加方法,內(nèi)存使用效率低,每個(gè)實(shí)例方法在內(nèi)存堆創(chuàng)建空間)

可以使? prototype 屬性解決這個(gè)問題,把?法添加到構(gòu)造函數(shù)的 prototype 對象身上,讓所有的對象實(shí)例共享?法。

構(gòu)造函數(shù)的工作原理

基本上,使用new調(diào)用構(gòu)造函數(shù)執(zhí)行了一下操作:

  • 創(chuàng)建一個(gè)空對象,并為其分配給this

  • 為this添加屬性和方法

  • return this

原型圖示例

53f9c68878c547631eed3581f5260e8.png

闡述

  • 任何構(gòu)造函數(shù)內(nèi)部都有 prototype 屬性:該屬性指向?個(gè)被稱為 原型 的對象

  • 任何 原型 對象內(nèi)部都有?個(gè) constructor 屬性: 該屬性指向構(gòu)造函數(shù) User()

  • 通過關(guān)鍵詞 new 調(diào)?構(gòu)造函數(shù)User創(chuàng)建了實(shí)例對象 user1

    • 在創(chuàng)建實(shí)例對象的過程中,構(gòu)造函數(shù)?動(dòng)為實(shí)例對象分配了?個(gè)?級(jí)對象,這個(gè)?級(jí)對象就是實(shí)例對象的 原型 對象。
  • 任何實(shí)例對象上都有?個(gè) __proto__ 屬性,該屬性指向其 原型 對象。

prototype屬性是什么?

-當(dāng)使?new關(guān)鍵詞調(diào)?構(gòu)造函數(shù)創(chuàng)建對象實(shí)例時(shí),構(gòu)造函數(shù)會(huì)?動(dòng)為實(shí)例對象分配?個(gè)?級(jí)對象,這個(gè)?級(jí)對象就是實(shí)例對象的原型,

-并且實(shí)例對象會(huì)擁有這個(gè)它的原型的所有屬性和?法。

--每?個(gè)構(gòu)造函數(shù)都有?個(gè)prototype屬性,這個(gè)屬性就是實(shí)例對象的原型對象。

  • 所有的構(gòu)造函數(shù)內(nèi)部都有一個(gè)prototype屬性

  • prototype屬性指向一個(gè)對象。這個(gè)叫‘原型對象’

  • 構(gòu)造函數(shù)使用它指向的‘原型對象’創(chuàng)建實(shí)例。

  • ‘原型對象’:它也是一個(gè)對象?。。∫馕吨蛯ο蟆灿凶陨淼膶傩院头椒?。

  • ‘原型對象’有一個(gè)constructor屬性

原型對象的constructor屬性是什么?

  • 所有的”原型對象“身上有?個(gè) constructor 屬性

  • constructor 屬性指向?個(gè)構(gòu)造函數(shù)

實(shí)例對象的proto屬性是什么

  • 所有的實(shí)例對象身上都有?個(gè)?標(biāo)準(zhǔn)的 proto 屬性

  • proto 屬性指向它的原型對象

null

  • null表示到達(dá)了原型鏈的頂端

對象的方法

1.Object.getPrototypeOf()

Object.getPrototypeOf() 方法返回指定對象的原型

語法:

Object.getPrototypeOf(object)

參數(shù)object:是要指定的對象

返回值:對象的原型

2.Object.keys()

定義:將對象可以枚舉的屬性名返回到一個(gè)新數(shù)組

語法:

Object.keys(obj)

返回值:可枚舉屬性名數(shù)組

示例:

const obj = {
    key : value
}
Object.keys(obj) // [key]

3.Object.values()

定義:將對象可以枚舉的屬性值返回到一個(gè)新數(shù)組

語法:

Object.values(obj)

返回值:可枚舉屬性值數(shù)組

示例:

const obj = {
    key : value
}
Object.values(obj) // [value]

4.Object.entries()

定義:將對象可枚舉的屬性對返回到一個(gè)數(shù)組

語法:

Object.entries(obj)

返回值:屬性對數(shù)組

示例:

const obj = {
    x : 1
}
Object.entries(obj) // [[x,1]]

5.Object.hasOwnProperty()

定義:檢測一個(gè)屬性是否是自身屬性

語法:

obj.hasOwnProperty(prop)

返回值:布爾值

  • true:表示該屬性是對象的?身屬性

  • False: 表示該屬性不是對象的?身屬性

示例

obj.hasOwnProperty(prop)
對象.hasOwnProperty(屬性名)

6.Object.prototype.propertyIsEnumerable

定義:該?法?于檢測?身屬性是否可枚舉。

語法:

obj.propertyIsEnumerable(prop)

返回值:布爾值

示例:

//obj.propertyIsEnumerable(prop)
const obj = {
x:1,
y:2,
z:3,
}
//請把y改成不可枚舉 > 修改enumerable屬性 > Object.defineProperty()
Object.defineProperty(obj,'y',{
enumerable:false
})
const r1 = obj.propertyIsEnumerable('x')
const r2 = obj.propertyIsEnumerable('y')
console.log(r1,r2)

7.Object.assign()

定義:Object.assign()?法將所有可枚舉屬性從?個(gè)對象復(fù)制到另?個(gè)對象

語法:

Object.assign(obj1,obj2)

參數(shù):

  • obj1:目標(biāo)對象,接收源對象屬性的對象,也是修改后的返回值。

  • obj2:源對象

返回值:修改后的對象

示例:

const obj1 = { x: 1,y:5}
const obj2 = { y: 2, z: 3 }
obj2.__proto__.w = 4
Object.assign(obj1,obj2)
console.log(obj1) //輸出{x:1,y:2,z:3}

新數(shù)據(jù)類型

Symbol

  • Symbol是?種基本數(shù)據(jù)類型

  • Symbol是原始值

//1. Number(任意)=>原始值 2. new Number(任意)=>對象
const n1 = Number(100)
const n111 = Number(100)
console.log(n1=== n111);//
// const n2 = Number()
// console.log(n2);
// const n3 = Number(Infinity)
// console.log(n3);
// const n4 = Number(NaN)
// console.log(n4);
// const n5 = Number('100')
// console.log(n5);
// const n6 = Number('abc')
// console.log(n6);
// const n7 = Number({x:1})
// console.log(n7);
// const n8 = Number([])
// console.log(n8);
//1.String(任意) =>原始值 2.new String(任意) =>對象
const str1 = String('hello')
const str2 = String('hello')
console.log(str1 === str2);//true
//Symbol(字符串) 返回?個(gè)具有唯?性的標(biāo)識(shí)符
const sym1 = Symbol()
const sym2 = Symbol()
console.log(sym1 === sym2);//false
// const sym3 = new Symbol() //報(bào)錯(cuò)
const sym3 = Symbol()
const sym4 = Symbol()
const obj = {
x:1,
y:10,
 [sym3]: 'hello',
 [sym4]: 'world'
}
console.log(obj[sym3]);
console.log(obj[sym4]);

BigInt

含義:BigInt表示任意大的整數(shù)

語法:

//字?法定義bigint
const bi1 = 10000000000n
//內(nèi)置函數(shù)法
const bi2 = BigInt(1000000);//1000000n
const bi2 = BigInt('1000000');//1000000n

?法

  • ①symbol之間可以做運(yùn)算

  • ②不可以使?math?法

  • ③不能和number混合運(yùn)算

  • ④bigint可以和number做?較

示例

//BigInt表示任意?的整數(shù)
const b1 = -10n
const b2 = BigInt(20)
console.log(b2);//20n
console.log(b1 + b2);//30n①可以做symbol運(yùn)算
console.log(typeof b1);//bigint
//console.log(Math.abs(b1));//②不可以使?math?法
// console.log(b2 + 20);//③不能和number混合運(yùn)算
console.log(20n === 20);
console.log(20n == 20);//④bigint可以和number做?較
const bi1 = bigInt(100n)
const bi2 = BigInt(100)
const bi3 = BigInt(100n)
const bi7 = BigInt('100')
const bi4 = bigInt(100)
const bi5 = bigInt('100')
const bi6 = BigInt('100n')

DOM

JS包含哪幾部分?

  • ES:是一門語言,負(fù)責(zé)語法部分。學(xué)習(xí)ES學(xué)習(xí)的是語法(ECMA:歐洲計(jì)算機(jī)協(xié)會(huì) ECMAScript)

  • BOM:瀏覽器對象模型 用途:提供給ES一個(gè)接口來操作瀏覽器

  • DOM:文檔對象模型 用途:提供ES一個(gè)接口來操作文檔

BOM是什么?

  • BOM:Browser Object Model 瀏覽器對象模型

  • BOM把瀏覽器定義成一個(gè)對象模型。

    • Windeow:整個(gè)瀏覽器被定義成了window對象

      • document : 把文檔定義成一個(gè)對象

      • Histroy:把歷史記錄定義成一個(gè)對象

      • Screen:把顯示瀏覽器窗口的屏幕定義成一個(gè)對象

      • Location:把地址欄定義成一個(gè)對象

      • Navigator:把瀏覽器的介紹定義成一個(gè)對象

  • BOM:用途:允許ES操作瀏覽器的一切

DOM是什么?

  • DOM:Docoument Object Model 瀏覽器對象模型

  • 用途:DOM就是為了操作文檔用的

  • 在DOM眼里:整個(gè)文檔的內(nèi)容都是對象。

  • DOM把文檔的一切內(nèi)容都定義成了對象

    • 文檔對象(document)

    • 元素對象(elment)

    • 文本對象(text)

    • 屬性對象(Attribute)

    • 樣式對象

    • 節(jié)點(diǎn)對象(node)

  • DOM是W3C制定的一套規(guī)則。

DOM樹

微信截圖_20230211085016.png

Document對象

定義

  • document對象表示網(wǎng)頁文檔。

  • Document對象是DOM的核心對象。

  • Document對象是訪問文檔的入口

用途

Document對象主要用途是操作文檔。具體內(nèi)容如下:

  • 查:獲取元素

  • 增:創(chuàng)建元素

  • 刪:刪除元素

  • 改:替換元素

獲取元素的方法

  • 通過傳統(tǒng)方法

  • 通過id獲取元素document.getElementById('id')

window.document.getElementById('id')
// 可以不寫全局對象window
  • 通過標(biāo)簽名獲取元素document.getElementsByTagName('標(biāo)簽名')
window.document.getElementsByTagName('標(biāo)簽名')
// 可以不寫全局對象window
  • 通過標(biāo)簽名獲取元素element.getElementsByTagName('標(biāo)簽名')
Ezlement.getElementsByTagName('標(biāo)簽名')
// 可以不寫全局對象window

操作文檔內(nèi)容

在獲取完元素之后,接下來我們要學(xué)習(xí)元素對象hi見的關(guān)系。DOM定義了兩套API:

  • node PI

  • Element API

Node API

定義:

Node API把文檔中的一切對象看成是節(jié)點(diǎn) node

用途

  • 查找結(jié)點(diǎn)的基本信息:節(jié)點(diǎn)名稱、節(jié)點(diǎn)類型、節(jié)點(diǎn)的值

  • 查找節(jié)點(diǎn)之間的關(guān)系:父子、兄弟

  • 操作節(jié)點(diǎn):增、刪、改、查

三大基本屬性

Node.nodeType

定義:nodeType表示節(jié)點(diǎn)的類型。節(jié)點(diǎn)類型使用一個(gè)數(shù)字表示。Node API 把節(jié)點(diǎn)分為了9種

節(jié)點(diǎn)名稱 數(shù)字表示
元素節(jié)點(diǎn) 1
屬性節(jié)點(diǎn) 2
文本節(jié)點(diǎn) 3
注釋節(jié)點(diǎn) 8
文檔節(jié)點(diǎn) 9

Node.nodeName

Node.nodeValue

節(jié)點(diǎn)定義

  • 父節(jié)點(diǎn):一個(gè)節(jié)點(diǎn)之上的直接節(jié)點(diǎn)就是父節(jié)點(diǎn)

  • 子節(jié)點(diǎn):一個(gè)節(jié)點(diǎn)之下的直接節(jié)點(diǎn)就是子節(jié)點(diǎn)

  • 兄弟節(jié)點(diǎn):具有相同父節(jié)點(diǎn)的節(jié)點(diǎn)

  • 后代節(jié)點(diǎn):一個(gè)節(jié)點(diǎn)之下的所有層級(jí)節(jié)點(diǎn)

查找節(jié)點(diǎn)關(guān)系

  • Node.parentNode:返回當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn)對象

  • Node.childNodes:返回當(dāng)前節(jié)點(diǎn)的子節(jié)點(diǎn)列表

  • Node.nextSibling:返回當(dāng)前節(jié)點(diǎn)的下一個(gè)兄弟節(jié)點(diǎn)

  • Node.previousSibling:返回當(dāng)前節(jié)點(diǎn)的上一個(gè)兄弟節(jié)點(diǎn)

  • Node.firstChild:返回當(dāng)前節(jié)點(diǎn)的第一個(gè)子節(jié)點(diǎn)

  • Node.lastChild:返回當(dāng)前節(jié)點(diǎn)的最后一個(gè)子節(jié)點(diǎn)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容