數(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
原型圖示例

闡述
任何構(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樹

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)。