-
//對(duì)于稀疏數(shù)組,一般并不含有從0開(kāi)始的連續(xù)索引,一般的length這個(gè)屬性值比實(shí)際的元素個(gè)數(shù)多
undefined
var arr1 = [undefined];
undefined
var arr2 = new Array(1);
undefined
0 in arr1
true
0 in arr2
false
1 in arr2
false
arr2
[empty]length: 1__proto__: Array(0)
var arr2 = new Array(3,2)
undefined
arr2
(2) [3, 2]
0 in arr2
true
//上面發(fā)現(xiàn)一個(gè)很奇怪的現(xiàn)象,其實(shí)你在用new創(chuàng)建數(shù)組的時(shí)候,如果你只輸入一個(gè)數(shù)字,那么這個(gè)時(shí)候就會(huì)默認(rèn)這個(gè)數(shù)字是你的數(shù)組長(zhǎng)度,但是如果你輸入了一大堆的東西就會(huì)認(rèn)為是一個(gè)數(shù)組里面的元素
undefined
//當(dāng)然上面不是我們關(guān)注的重點(diǎn),重點(diǎn)是我們?nèi)绻粍?chuàng)建的話其實(shí)沒(méi)有任何默認(rèn)的賦值,甚至是undefined都沒(méi)有,而只是單純的申請(qǐng)了一點(diǎn)點(diǎn)的空間,所以用in方法的時(shí)候顯示false
undefined
var arr3 = [1,2,3];
undefined
arr3.length = 100
100
arr[99] = 1;
VM8114:1 Uncaught ReferenceError: arr is not defined
? ? at <anonymous>:1:1
(anonymous) @ VM8114:1
arr3[99] = 1;
1
99 in arr3
true
98 in arr3
false
//上面給99賦值了所以有in,98沒(méi)有
查看全部 -
//上面記錄的時(shí)候有點(diǎn)沒(méi)有頭腦,下面在記錄的時(shí)候一定要分清楚先后的順序,最好每個(gè)章節(jié)一起學(xué)習(xí),并且要及時(shí)的復(fù)習(xí)
undefined
//這一章要學(xué)習(xí)數(shù)組,在JavaScript中的數(shù)組首先是一個(gè)“弱類(lèi)型”的數(shù)組,就是說(shuō)你可以在其中定義很多的東西,不一定非要是數(shù)字類(lèi)型
undefined
var arr = [1,null,true,undefined,[1,1,2]];
undefined
//里面也可以定義對(duì)象,
undefined
//一、創(chuàng)建數(shù)組
undefined
//就像上面直接創(chuàng)建
undefined
var a = [,,];
undefined
//上面的方法不建議,創(chuàng)建了“兩個(gè)”undefined,數(shù)組創(chuàng)建的長(zhǎng)度是從0~2的23次方
undefined
//2、還可以用object的方法創(chuàng)建
undefined
var arr = new Array(100,false);//可以在里面直接加
undefined
arr
(2) [100, false]
delete arr[0]
true
//但是刪除之后,長(zhǎng)度是不變的,只是刪除的地方變成了undefined
undefined
//push方法
undefined
var arr[];
VM2648:1 Uncaught SyntaxError: Unexpected token '['
var arr = [];
undefined
arr.[0] = 1
VM2722:1 Uncaught SyntaxError: Unexpected token '['
arr[0]= 1
1
arr.push(1)
2
//unshift方法
undefined
//unshift實(shí)在數(shù)組的頭部添加元素
undefined
arr.unshift(1)
3
arr
(3) [1, 1, 1]
//in
undefined
//in方法可以判斷數(shù)字是否在數(shù)組里面
undefined
1 in arr
true
//pop函數(shù),刪除掉尾部的元素,也可以用length-1的方法
undefined
arr.pop()
1
arr
(2) [1, 1]
//shift()函數(shù)是在頭部刪除元素
undefined
arr.shift
? shift() { [native code] }
arr.shift()
1
arr
[1]
6162:1 Unchecked runtime.lastError: The message port closed before a response was received.
//以上可以看出來(lái)數(shù)組是動(dòng)態(tài)的
undefined
//數(shù)組的遍歷:
undefined
//第一種方法就是for循環(huán),這里重要的是forin循環(huán),要注意的是數(shù)組也作為一個(gè)對(duì)象,其實(shí)里面的每個(gè)元素也可以理解為數(shù)組的屬性,但是同時(shí)原型鏈上的屬性也是作為一個(gè)數(shù)組的屬性會(huì)被輸出出來(lái),這樣的話就會(huì)產(chǎn)生一些問(wèn)題
undefined
arr.prototype.x = 1
VM4710:1 Uncaught TypeError: Cannot set property 'x' of undefined
? ? at <anonymous>:1:17
(anonymous) @ VM4710:1
Array.prototype.x = 1
1
Array.prototype.x = 'in'
"in"
for(i in arr){console.log(arr[i])}
VM4960:1 1
VM4960:1 in
undefined
//可以看到原型鏈上的屬性也被輸出出來(lái)了,而且要注意的是數(shù)組作為一個(gè)對(duì)象它的元素的名字就是相應(yīng)的索引,而值就是里面的值
undefined
//當(dāng)然可以用hasownproperty的方式判斷
undefined
for(i in arr){if(arr.hasOwnProperty(i){console.log(arr[i]);})}
VM5688:1 Uncaught SyntaxError: Unexpected token '{'
for(i in arr){if(arr.hasOwnProperty(i)){console.log(arr[i]);}}
查看全部 -
標(biāo)簽屬性和標(biāo)簽函數(shù)自定義的應(yīng)用,以及序列化的應(yīng)用(序列化就是在對(duì)象和json之間進(jìn)行轉(zhuǎn)換,stringfied和parse)
查看全部 -
//不能刷新,不能返回,不然全沒(méi)了
undefined
//對(duì)象標(biāo)簽
undefined
//下面一個(gè)查看class的標(biāo)簽
undefined
var toString = Object.prototype.toString;//宏定義成一個(gè)方便后續(xù)使用,以前也講過(guò)用with
undefined
function getType(o){return toString.call(o).slice(8,-1);}//這個(gè)是為了截取下來(lái)類(lèi)型
undefined
toString.call(null)
"[object Null]"
//如果上面沒(méi)有截取就是顯示一個(gè)帶有括號(hào)的字符串
undefined
getType(null)
"Null"
getType(1)
"Number"
getTp
VM18518:1 Uncaught ReferenceError: getTp is not defined
? ? at <anonymous>:1:1
(anonymous) @ VM18518:1
getType(new Number(1))
"Number"
//會(huì)發(fā)現(xiàn)上面給的不是object而是number,是因?yàn)檫@個(gè)是一個(gè)傳入的參數(shù)
undefined
getType([1,2])
"Array"
//extensible標(biāo)簽表示對(duì)象是否可以擴(kuò)展,是否可以繼續(xù)添加屬性
undefined
var obj = {x:1,y:2};
undefined
6008:1 Unchecked runtime.lastError: The message port closed before a response was received.
//當(dāng)然這個(gè)extensible是一類(lèi)標(biāo)簽,他下面有很多方法來(lái)進(jìn)行控制,首先是isExtensible還有seal還有freeze,我們會(huì)通過(guò)一個(gè)案例來(lái)進(jìn)行判斷
undefined
Object.isExtensible(obj)
true
Object.preventExtensions(obj)//這個(gè)是主要函數(shù),防止擴(kuò)展
{x: 1, y: 2}
Object.isExtensible(obj)
false
obj.z = 10
10
obj.z
undefined
//上面就會(huì)發(fā)現(xiàn)不能擴(kuò)展了
undefined
Object.isSealed(obj)
false
Object.isSealed(obj)//這個(gè)函數(shù)是查看是否可以刪除,sale是封裝的意思
false
Object.seal(obj)
{x: 1, y: 2}
Object.isSealed(obj)
true
Object.getOwnPropertyDescriptor(obj)
undefined
Object.getOwnPropertyDescriptor(obj,'x')
{value: 1, writable: true, enumerable: true, configurable: false}
//上面就會(huì)發(fā)現(xiàn)里面的configureable都變成了false
undefined
Object.freeze(obj)//這個(gè)是凍結(jié)函數(shù),這個(gè)可以進(jìn)行將屬性?xún)鼋Y(jié)住,這樣這個(gè)對(duì)象下的所有屬性都不可以被改寫(xiě)了
{x: 1, y: 2}
Object.getOwnPropertyDescriptor(obj,'x')
{value: 1, writable: false, enumerable: true, configurable: false}
//會(huì)發(fā)現(xiàn)上面的writable變成了false
undefined
//?。。〉俏覀兌际侵粌鼋Y(jié)這個(gè)對(duì)象并不會(huì)凍結(jié)它的原型鏈
undefined
//
undefined
//
undefined
//
undefined
//下面序列化的一種方法
undefined
//所謂的序列化就是將obj的所有屬性變成一個(gè)json對(duì)象,這樣方便后臺(tái)進(jìn)行操作
undefined
var obj = {val:undefined,a:NaN,b:Infinity,c:new Date()};
undefined
JSON.stringify(obj)//這個(gè)就是序列化的函數(shù)
"{"a":null,"b":null,"c":"2021-03-02T12:05:19.349Z"}"
//會(huì)發(fā)現(xiàn)輸出的結(jié)果里面不會(huì)顯示undefined的屬性,nun和infinity都會(huì)變成null,date會(huì)被另一種格式輸出
undefined
//單數(shù)不管怎么說(shuō),都是json的格式輸出出來(lái)了
undefined
//當(dāng)然也可以逆變換,就是將json的格式變成obj形式
undefined
var obj2 = JSON.parse('{"x":1}');
undefined
obj2
{x: 1}
//注意json格式的書(shū)寫(xiě)
undefined
//當(dāng)然序列化也可以自定義,這個(gè)情況下就是需要在里面定義一個(gè)tojson的函數(shù)
undefined
var obj3 = {
? ? x:1,
? ? y:2,
}
undefined
var obj3 = {
? ? x:1,
? ? y:2,
? ? o:{
? ? o1:1,
? ? o2:2,
? ? toJSON:function(){return this.o1+this.o2;}
? ??
},
}
undefined
obj3.o.o1
1
//上面在屬性里面又另外添加了一個(gè)toJSON的屬性,所以再次序列化的時(shí)候就會(huì)調(diào)用里面的這個(gè)函數(shù)
undefined
JSON.stringify(obj3)
"{"x":1,"y":2,"o":3}"
//可以看到上面的o就是哦
undefined
//可以看到上面的o就是o1+o2
undefined
//以前講變量類(lèi)型的時(shí)候只講過(guò)基本類(lèi)型之間的轉(zhuǎn)換,但是對(duì)象也可以轉(zhuǎn)換成基本類(lèi)型,這個(gè)涉及到對(duì)象的兩個(gè)方法,一個(gè)是toString方法,一個(gè)是valueOf方法,這兩個(gè)方法是將對(duì)象轉(zhuǎn)換成基本類(lèi)型的常用方法,而且是可以自己進(jìn)行調(diào)用的,你只需要設(shè)置
undefined
obj3
{x: 1, y: 2, o: {…}}
obj3.toString()
"[object Object]"
obj.toString() = function(){return this.x+this.y;};
VM25614:1 Uncaught ReferenceError: Invalid left-hand side in assignment
? ? at <anonymous>:1:5
(anonymous) @ VM25614:1
obj.toString = function(){return this.x+this.y;};
? (){return this.x+this.y;}
//上面就是對(duì)tostring的定義
undefined
obj3.toString = function(){return this.x+this.y;};
? (){return this.x+this.y;}
"Result"+obj3;//這個(gè)時(shí)候就會(huì)對(duì)這個(gè)對(duì)象進(jìn)行隱士的轉(zhuǎn)換成基本類(lèi)型
"Result3"
+obj3
3
obj3.valueOf = function(){return this.x*this.y;};
? (){return this.x*this.y;}
//上面就是將對(duì)象轉(zhuǎn)換成基本類(lèi)型里面的數(shù)字,所以當(dāng)我們想要轉(zhuǎn)換成數(shù)字的時(shí)候,例如進(jìn)行+obj3的操作時(shí)候,就會(huì)先調(diào)用valueOf這個(gè)函數(shù),如果報(bào)錯(cuò)或者不存在就會(huì)尋找tostring這個(gè)函數(shù),如果不存在就報(bào)錯(cuò)
undefined
+obj3
2
//這個(gè)時(shí)候就會(huì)變成2
undefined
查看全部 -
可以
查看全部 -
//會(huì)發(fā)現(xiàn)上面是不能修改了configurable所以一定要進(jìn)行判斷,在這里還有一個(gè)configurable和writable不同值情況下的操作情況,有些情況可以被操作,有些不能
undefined
//這集講解屬性的標(biāo)簽
undefined
//一般都有writable表示是否可以寫(xiě)入,enumerable表示是否可以被forin枚舉到,configurable表示是否可以刪除掉
undefined
//下面我們介紹一種可以進(jìn)行訪問(wèn)的函數(shù),這個(gè)函數(shù)可以查看當(dāng)前屬性下的所有的標(biāo)簽
undefined
var person{};
VM16631:1 Uncaught SyntaxError: Unexpected token '{'
Object.defineProperty(person,'name',{
? ? configurable : false;
? ??
})
VM16689:2 Uncaught SyntaxError: Unexpected token ';'
Object.defineProperty(person,'name',{
? ? configurable : false,
? ? writable: true,
? ? enumerable:false,
? ? value:"Yangdainyi",
? ??
})
VM16747:1 Uncaught ReferenceError: person is not defined
? ? at <anonymous>:1:23
(anonymous) @ VM16747:1
Object.defineProperty(person,'type',{
? ? value : "OBject",
? ? writable:true,
? ? enumerable:true,
? ? configuarable:false,
})
VM16824:1 Uncaught ReferenceError: person is not defined
? ? at <anonymous>:1:23
(anonymous) @ VM16824:1
//上面在person下創(chuàng)建了兩個(gè)屬性,我們可以用keys去訪問(wèn)person下所有的屬性,會(huì)發(fā)現(xiàn)只有type,是因?yàn)閚ame2的enumerable是false
undefined
Object.keys(person)
VM16922:1 Uncaught ReferenceError: person is not defined
? ? at <anonymous>:1:13
(anonymous) @ VM16922:1
Object.defineProperties(person,{
? ? salary:{value:50000,enumerable:true,writable:true},
? ? luck:{
? ? ? ? get:function(){
? ? ? ? return Math.random()>0.5? 'good':'bad';
},
? ? ?promote:{
? ? ? ? set:function(level){
? ? ? ? this.salary *= 1+level*0.1;//給自己加工資,這個(gè)下面是會(huì)更改當(dāng)下的salary的
}
? ? ? ? ? ??
} ,?
}
})
VM16972:1 Uncaught ReferenceError: person is not defined
? ? at <anonymous>:1:25
(anonymous) @ VM16972:1
//上面在person下創(chuàng)建了兩個(gè)屬性,我們可以用keys去訪問(wèn)person下所有的屬性,會(huì)發(fā)現(xiàn)只有type,是因?yàn)閚ame2的enumerable是false
查看全部 -
//讀寫(xiě)對(duì)象的屬性
undefined
//1、屬性讀寫(xiě)
undefined
var obj = {x:2,y:3}
undefined
obj.x
2
//下面是屬性繼承和屬性枚舉的知識(shí),首先是關(guān)于屬性繼承要求是你在創(chuàng)建的時(shí)候就要說(shuō)明的,比如說(shuō)是
undefined
//上面是兩種的方式
undefined
//當(dāng)然也可以for in 去遍歷,但是問(wèn)題就是會(huì)把原型鏈上的也弄出來(lái),而且順序不一定
undefined
//還可以用hasOwnProperty
undefined
//這集講的是關(guān)于get和set的方法
undefined
//上集由于腦袋問(wèn)題沒(méi)有錄上,氣死了
undefined
var man = {name:'Boso',weibo:'@Bosn',get age(){return new Date().getFullYear()-2000;},set age(val){console.log('Age can\'t be set to'+val);}}
undefined
console.log(man.age)
VM7522:1 21
undefined
man.age
21
man.age = 100
VM7469:1 Age can't be set to100
100
//這個(gè)里面就是有一個(gè)get和set進(jìn)行賦值
undefined
//下面是一種更加高級(jí)的做法
undefined
var man = {
? ? weibo:'@Bosn',
}
undefined
6006:1 Uncaught (in promise) DOMException: The play() request was interrupted by a call to pause(). https://goo.gl/LdLk22
var man = {
? ? weibo:'@Bosn',
? ? $age:null,//這個(gè)情況下就是將age作為一個(gè)可以改變的變量放在里面
? ? get age(){
? ? if(this.$age==undefined){
? ? ? ? this.$age = new Date().getFullYear()-2000;
? ? }
? ? return this.$age;
},//這個(gè)千萬(wàn)不要忘記添加上,因?yàn)槔锩娑x的函數(shù)也是作為一個(gè)元素放在里面
? ? set age(val){
? ? ?val = +val;//這里面的+操作是為了變成數(shù)字,隱式轉(zhuǎn)換
? ? ?if(!isNaN(val)&&val>0&&val<150){
? ? ? ? this.$age = +val;
}else{
? ? throw new Error('Incorrect val' + val);
}
}
}
undefined
man.age
21
man.age = 100
100
man.age
100
man.age = 160
function foo(){}
undefined
Object.defineProperty(foo.prototype,)
VM8890:1 Uncaught TypeError: Property description must be an object: undefined
? ? at Function.defineProperty (<anonymous>)
? ? at <anonymous>:1:8
(anonymous) @ VM8890:1
Object.defineProperty(foo.prototype,'z',{get:function(){return 1;}});
{constructor: ?}
var obj = new foo();
undefined
obj.z = 1
1
obj.z = 10
10
obj.z
1
Object.defineProperty(obj,'z',{value:100,configurable:true});
foo {z: 100}
obj.z
100
delete obj.z
true
obj.z
1
//因?yàn)樯厦鎰h除掉了原來(lái)的本身obj上的z所以只能向上尋找z
undefined
//另外有一個(gè)上面刪掉的內(nèi)容,就是create這個(gè)繼承的東西
undefined
var o = {};
undefined
Object.defineProperty(o,'x',{value:1});
{x: 1}
var n = Object.create(o);
undefined
n.x
1
o.x = 100
100
o.x
1
//會(huì)發(fā)現(xiàn)上面依舊是1,是因?yàn)樵谀J(rèn)情況下o里面的x是不可writeable的
undefined
//如果要改變這種狀態(tài)可以先創(chuàng)建一個(gè)x,這樣在原型鏈上的x就不會(huì)被先訪問(wèn)到
undefined
Object.cra
undefined
Object.defineProperty(n,'x',{value:1,writable:true});
{x: 1}
n.x = 100
100
n.x
100
//就可以更改了
查看全部 -
Object.getOwnPropertyDescriptor({pro:true},'pro')
value:屬性值
writable:該屬性是否可寫(xiě),可修改true/false
enumerable:該屬性是否可被枚舉,在for in中出現(xiàn)(是否可遍歷true/false)
configurable:該屬性的標(biāo)簽是否可改變,是否可用delete將該屬性刪除true/false
查看全部 -
get/set與原型鏈:
查看全部 -
驗(yàn)證對(duì)象的屬性:hasOwnProperty? ? ?obj.hasOwnProperty('a')
驗(yàn)證對(duì)象的屬性和對(duì)象原型鏈內(nèi)的屬性:in? ? ?'a' in obj
查看全部 -
嚴(yán)格模式:
查看全部 -
try語(yǔ)句如果拋出異常,則執(zhí)行catch語(yǔ)句,否則不執(zhí)行,無(wú)論有沒(méi)有異常,都執(zhí)行finally語(yǔ)句;try語(yǔ)句必須跟catch或finally語(yǔ)句中至少一個(gè)組合使用。
try catch語(yǔ)句的嵌套語(yǔ)句執(zhí)行順序:
1)如果內(nèi)部嵌套的try語(yǔ)句拋出異常,但內(nèi)部沒(méi)有相配套的catch語(yǔ)句,先執(zhí)行內(nèi)部的finally語(yǔ)句,然后跳到最近一層的catch語(yǔ)句執(zhí)行。
2)如果內(nèi)部嵌套的try語(yǔ)句拋出異常,內(nèi)部有相配套的catch語(yǔ)句,先執(zhí)行此語(yǔ)句處理異常,再執(zhí)行內(nèi)部的finally語(yǔ)句。不會(huì)再在外部處理異常。
3)如果內(nèi)部嵌套的try語(yǔ)句拋出異常,內(nèi)部有相配套的catch語(yǔ)句,并且catch語(yǔ)句也拋出異常,如果內(nèi)部的catch語(yǔ)句有對(duì)異常的處理,先執(zhí)行異常處理語(yǔ)句,然后執(zhí)行內(nèi)部的finally語(yǔ)句,最后執(zhí)行離內(nèi)部catch語(yǔ)句拋出異常最近一層的catch語(yǔ)句處理異常。查看全部 -
9
查看全部 -
//function
undefined
//對(duì)于函數(shù)有兩種思路,首先是直接聲明并配置好,就是我們一般的做法,但是也可以
undefined
var fe = fuction(){};
VM16933:1 Uncaught SyntaxError: Unexpected token '{'
var fe = function(){};
undefined
//但是這個(gè)時(shí)候就不能在它之前進(jìn)行調(diào)用
undefined
//for
undefined
//for in語(yǔ)句
undefined
var p;
undefined
var obj = {x:1,y:2}
undefined
for(p in obj){
}
undefined
//上面的forin 語(yǔ)句可以調(diào)用一個(gè)obj里面的一些屬性對(duì)象,但是問(wèn)題就是順序是不確定的,而且會(huì)受到原型鏈的影響,當(dāng)enumerable為false時(shí)候不會(huì)出現(xiàn)
undefined
//with語(yǔ)句是一個(gè)用來(lái)限制作用域的語(yǔ)句,它的作用首先就是用with把語(yǔ)句限制在一定的范圍里面,然后在這個(gè)范圍里面有一個(gè)塊函數(shù)可以進(jìn)行操作
undefined
with({x:1}){
console.log(x);}
VM18409:2 1
undefined
//會(huì)發(fā)現(xiàn)上面其實(shí)就不再需要進(jìn)行調(diào)用obj。x了
undefined
//但是上面的那個(gè)也很雞肋,因?yàn)橥耆梢韵劝涯愕淖饔糜蚨x給一個(gè)函數(shù),然后再在這個(gè)函數(shù)下進(jìn)行相關(guān)操作
undefined
查看全部 -
//運(yùn)算符
undefined
//比較少見(jiàn)的有一個(gè),運(yùn)算符
undefined
var val = (1,2,3)
undefined
5804:1 Unchecked runtime.lastError: The message port closed before a response was received.
val
3
//,其實(shí)是每個(gè)都會(huì)計(jì)算,但是只輸出最后的一個(gè)
undefined
//2另外就是刪除這個(gè)
undefined
var obj = {x:1};
undefined
obj.x
1
Object.defineProperties(obj,'x'{
? ? ? ? ? ? ? ? ? ? ? ? })
VM13336:1 Uncaught SyntaxError: missing ) after argument list
Object.defineProperties(obj,'x'{
? ? ? ? ? ? ? ? ? ? ? ? })
VM13340:1 Uncaught SyntaxError: missing ) after argument list
Object.defineProperties(obj,'x',{configurable
? ? ? ? ? ? ? ? ? ? ? ? })
VM13393:1 Uncaught ReferenceError: configurable is not defined
? ? at <anonymous>:1:34
(anonymous) @ VM13393:1
Object.defineProperty(obj,'x'{})
VM13539:1 Uncaught SyntaxError: missing ) after argument list
Object.defineProperty(obj,'x',{})
{x: 1}
Object.defineProperty(obj,'x',{
? ? configurable : false,
})
{x: 1}
delete obj.x
false
//這個(gè)時(shí)候就會(huì)發(fā)現(xiàn)里面的configurable是true
undefined
//in判斷符
undefined
window.x = 1
1
x in window
true
function Foo(){}
undefined
Foo
? Foo(){}
Foo.prototype.x = 1;
1
var obj = new Foo()
undefined
obj.x
1
obj.hasOwnProperty('x');//判斷在obj里面是否含有x這個(gè)屬性,因?yàn)閤是在obj的prototype里面,所以也不會(huì)被檢測(cè)到
false
obj.__proto__.hasOwnProperty('x')
true
查看全部
舉報(bào)