-
//對于稀疏數組,一般并不含有從0開始的連續索引,一般的length這個屬性值比實際的元素個數多
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
//上面發現一個很奇怪的現象,其實你在用new創建數組的時候,如果你只輸入一個數字,那么這個時候就會默認這個數字是你的數組長度,但是如果你輸入了一大堆的東西就會認為是一個數組里面的元素
undefined
//當然上面不是我們關注的重點,重點是我們如果只創建的話其實沒有任何默認的賦值,甚至是undefined都沒有,而只是單純的申請了一點點的空間,所以用in方法的時候顯示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沒有
查看全部 -
//上面記錄的時候有點沒有頭腦,下面在記錄的時候一定要分清楚先后的順序,最好每個章節一起學習,并且要及時的復習
undefined
//這一章要學習數組,在JavaScript中的數組首先是一個“弱類型”的數組,就是說你可以在其中定義很多的東西,不一定非要是數字類型
undefined
var arr = [1,null,true,undefined,[1,1,2]];
undefined
//里面也可以定義對象,
undefined
//一、創建數組
undefined
//就像上面直接創建
undefined
var a = [,,];
undefined
//上面的方法不建議,創建了“兩個”undefined,數組創建的長度是從0~2的23次方
undefined
//2、還可以用object的方法創建
undefined
var arr = new Array(100,false);//可以在里面直接加
undefined
arr
(2) [100, false]
delete arr[0]
true
//但是刪除之后,長度是不變的,只是刪除的地方變成了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實在數組的頭部添加元素
undefined
arr.unshift(1)
3
arr
(3) [1, 1, 1]
//in
undefined
//in方法可以判斷數字是否在數組里面
undefined
1 in arr
true
//pop函數,刪除掉尾部的元素,也可以用length-1的方法
undefined
arr.pop()
1
arr
(2) [1, 1]
//shift()函數是在頭部刪除元素
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.
//以上可以看出來數組是動態的
undefined
//數組的遍歷:
undefined
//第一種方法就是for循環,這里重要的是forin循環,要注意的是數組也作為一個對象,其實里面的每個元素也可以理解為數組的屬性,但是同時原型鏈上的屬性也是作為一個數組的屬性會被輸出出來,這樣的話就會產生一些問題
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
//可以看到原型鏈上的屬性也被輸出出來了,而且要注意的是數組作為一個對象它的元素的名字就是相應的索引,而值就是里面的值
undefined
//當然可以用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]);}}
查看全部 -
標簽屬性和標簽函數自定義的應用,以及序列化的應用(序列化就是在對象和json之間進行轉換,stringfied和parse)
查看全部 -
//不能刷新,不能返回,不然全沒了
undefined
//對象標簽
undefined
//下面一個查看class的標簽
undefined
var toString = Object.prototype.toString;//宏定義成一個方便后續使用,以前也講過用with
undefined
function getType(o){return toString.call(o).slice(8,-1);}//這個是為了截取下來類型
undefined
toString.call(null)
"[object Null]"
//如果上面沒有截取就是顯示一個帶有括號的字符串
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"
//會發現上面給的不是object而是number,是因為這個是一個傳入的參數
undefined
getType([1,2])
"Array"
//extensible標簽表示對象是否可以擴展,是否可以繼續添加屬性
undefined
var obj = {x:1,y:2};
undefined
6008:1 Unchecked runtime.lastError: The message port closed before a response was received.
//當然這個extensible是一類標簽,他下面有很多方法來進行控制,首先是isExtensible還有seal還有freeze,我們會通過一個案例來進行判斷
undefined
Object.isExtensible(obj)
true
Object.preventExtensions(obj)//這個是主要函數,防止擴展
{x: 1, y: 2}
Object.isExtensible(obj)
false
obj.z = 10
10
obj.z
undefined
//上面就會發現不能擴展了
undefined
Object.isSealed(obj)
false
Object.isSealed(obj)//這個函數是查看是否可以刪除,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}
//上面就會發現里面的configureable都變成了false
undefined
Object.freeze(obj)//這個是凍結函數,這個可以進行將屬性凍結住,這樣這個對象下的所有屬性都不可以被改寫了
{x: 1, y: 2}
Object.getOwnPropertyDescriptor(obj,'x')
{value: 1, writable: false, enumerable: true, configurable: false}
//會發現上面的writable變成了false
undefined
//?。?!但是我們都是只凍結這個對象并不會凍結它的原型鏈
undefined
//
undefined
//
undefined
//
undefined
//下面序列化的一種方法
undefined
//所謂的序列化就是將obj的所有屬性變成一個json對象,這樣方便后臺進行操作
undefined
var obj = {val:undefined,a:NaN,b:Infinity,c:new Date()};
undefined
JSON.stringify(obj)//這個就是序列化的函數
"{"a":null,"b":null,"c":"2021-03-02T12:05:19.349Z"}"
//會發現輸出的結果里面不會顯示undefined的屬性,nun和infinity都會變成null,date會被另一種格式輸出
undefined
//單數不管怎么說,都是json的格式輸出出來了
undefined
//當然也可以逆變換,就是將json的格式變成obj形式
undefined
var obj2 = JSON.parse('{"x":1}');
undefined
obj2
{x: 1}
//注意json格式的書寫
undefined
//當然序列化也可以自定義,這個情況下就是需要在里面定義一個tojson的函數
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
//上面在屬性里面又另外添加了一個toJSON的屬性,所以再次序列化的時候就會調用里面的這個函數
undefined
JSON.stringify(obj3)
"{"x":1,"y":2,"o":3}"
//可以看到上面的o就是哦
undefined
//可以看到上面的o就是o1+o2
undefined
//以前講變量類型的時候只講過基本類型之間的轉換,但是對象也可以轉換成基本類型,這個涉及到對象的兩個方法,一個是toString方法,一個是valueOf方法,這兩個方法是將對象轉換成基本類型的常用方法,而且是可以自己進行調用的,你只需要設置
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;}
//上面就是對tostring的定義
undefined
obj3.toString = function(){return this.x+this.y;};
? (){return this.x+this.y;}
"Result"+obj3;//這個時候就會對這個對象進行隱士的轉換成基本類型
"Result3"
+obj3
3
obj3.valueOf = function(){return this.x*this.y;};
? (){return this.x*this.y;}
//上面就是將對象轉換成基本類型里面的數字,所以當我們想要轉換成數字的時候,例如進行+obj3的操作時候,就會先調用valueOf這個函數,如果報錯或者不存在就會尋找tostring這個函數,如果不存在就報錯
undefined
+obj3
2
//這個時候就會變成2
undefined
查看全部 -
可以
查看全部 -
//會發現上面是不能修改了configurable所以一定要進行判斷,在這里還有一個configurable和writable不同值情況下的操作情況,有些情況可以被操作,有些不能
undefined
//這集講解屬性的標簽
undefined
//一般都有writable表示是否可以寫入,enumerable表示是否可以被forin枚舉到,configurable表示是否可以刪除掉
undefined
//下面我們介紹一種可以進行訪問的函數,這個函數可以查看當前屬性下的所有的標簽
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下創建了兩個屬性,我們可以用keys去訪問person下所有的屬性,會發現只有type,是因為name2的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;//給自己加工資,這個下面是會更改當下的salary的
}
? ? ? ? ? ??
} ,?
}
})
VM16972:1 Uncaught ReferenceError: person is not defined
? ? at <anonymous>:1:25
(anonymous) @ VM16972:1
//上面在person下創建了兩個屬性,我們可以用keys去訪問person下所有的屬性,會發現只有type,是因為name2的enumerable是false
查看全部 -
//讀寫對象的屬性
undefined
//1、屬性讀寫
undefined
var obj = {x:2,y:3}
undefined
obj.x
2
//下面是屬性繼承和屬性枚舉的知識,首先是關于屬性繼承要求是你在創建的時候就要說明的,比如說是
undefined
//上面是兩種的方式
undefined
//當然也可以for in 去遍歷,但是問題就是會把原型鏈上的也弄出來,而且順序不一定
undefined
//還可以用hasOwnProperty
undefined
//這集講的是關于get和set的方法
undefined
//上集由于腦袋問題沒有錄上,氣死了
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
//這個里面就是有一個get和set進行賦值
undefined
//下面是一種更加高級的做法
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,//這個情況下就是將age作為一個可以改變的變量放在里面
? ? get age(){
? ? if(this.$age==undefined){
? ? ? ? this.$age = new Date().getFullYear()-2000;
? ? }
? ? return this.$age;
},//這個千萬不要忘記添加上,因為里面定義的函數也是作為一個元素放在里面
? ? set age(val){
? ? ?val = +val;//這里面的+操作是為了變成數字,隱式轉換
? ? ?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
//因為上面刪除掉了原來的本身obj上的z所以只能向上尋找z
undefined
//另外有一個上面刪掉的內容,就是create這個繼承的東西
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
//會發現上面依舊是1,是因為在默認情況下o里面的x是不可writeable的
undefined
//如果要改變這種狀態可以先創建一個x,這樣在原型鏈上的x就不會被先訪問到
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:該屬性是否可寫,可修改true/false
enumerable:該屬性是否可被枚舉,在for in中出現(是否可遍歷true/false)
configurable:該屬性的標簽是否可改變,是否可用delete將該屬性刪除true/false
查看全部 -
get/set與原型鏈:
查看全部 -
驗證對象的屬性:hasOwnProperty? ? ?obj.hasOwnProperty('a')
驗證對象的屬性和對象原型鏈內的屬性:in? ? ?'a' in obj
查看全部 -
嚴格模式:
查看全部 -
try語句如果拋出異常,則執行catch語句,否則不執行,無論有沒有異常,都執行finally語句;try語句必須跟catch或finally語句中至少一個組合使用。
try catch語句的嵌套語句執行順序:
1)如果內部嵌套的try語句拋出異常,但內部沒有相配套的catch語句,先執行內部的finally語句,然后跳到最近一層的catch語句執行。
2)如果內部嵌套的try語句拋出異常,內部有相配套的catch語句,先執行此語句處理異常,再執行內部的finally語句。不會再在外部處理異常。
3)如果內部嵌套的try語句拋出異常,內部有相配套的catch語句,并且catch語句也拋出異常,如果內部的catch語句有對異常的處理,先執行異常處理語句,然后執行內部的finally語句,最后執行離內部catch語句拋出異常最近一層的catch語句處理異常。查看全部 -
9
查看全部 -
//function
undefined
//對于函數有兩種思路,首先是直接聲明并配置好,就是我們一般的做法,但是也可以
undefined
var fe = fuction(){};
VM16933:1 Uncaught SyntaxError: Unexpected token '{'
var fe = function(){};
undefined
//但是這個時候就不能在它之前進行調用
undefined
//for
undefined
//for in語句
undefined
var p;
undefined
var obj = {x:1,y:2}
undefined
for(p in obj){
}
undefined
//上面的forin 語句可以調用一個obj里面的一些屬性對象,但是問題就是順序是不確定的,而且會受到原型鏈的影響,當enumerable為false時候不會出現
undefined
//with語句是一個用來限制作用域的語句,它的作用首先就是用with把語句限制在一定的范圍里面,然后在這個范圍里面有一個塊函數可以進行操作
undefined
with({x:1}){
console.log(x);}
VM18409:2 1
undefined
//會發現上面其實就不再需要進行調用obj。x了
undefined
//但是上面的那個也很雞肋,因為完全可以先把你的作用域定義給一個函數,然后再在這個函數下進行相關操作
undefined
查看全部 -
//運算符
undefined
//比較少見的有一個,運算符
undefined
var val = (1,2,3)
undefined
5804:1 Unchecked runtime.lastError: The message port closed before a response was received.
val
3
//,其實是每個都會計算,但是只輸出最后的一個
undefined
//2另外就是刪除這個
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
//這個時候就會發現里面的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這個屬性,因為x是在obj的prototype里面,所以也不會被檢測到
false
obj.__proto__.hasOwnProperty('x')
true
查看全部
舉報