JS基礎(chǔ)語(yǔ)法
一岁经、類型轉(zhuǎn)換
很多時(shí)候隐锭,我們?cè)谶M(jìn)行數(shù)據(jù)運(yùn)算或輸出等操作時(shí)需要將數(shù)據(jù)在不同類型之間進(jìn)行轉(zhuǎn)換携悯,
在
JS 數(shù)據(jù)類型轉(zhuǎn)方法主要有三種: 利用 js 變量弱類型自動(dòng)轉(zhuǎn)換获询、
轉(zhuǎn)換函數(shù)雳灾、強(qiáng)制類型轉(zhuǎn)換漠酿。
1.自動(dòng)類型轉(zhuǎn)換
2、函數(shù)轉(zhuǎn)換
parseInt()
1谎亩、parseInt()在轉(zhuǎn)換之前炒嘲,首先會(huì)分析該字符串,判斷位置為 0
處的字符匈庭,判斷它是否是個(gè)有效數(shù)字夫凸,如果不是,則直接返回
NaN阱持,不再繼續(xù)夭拌,如果是則繼續(xù),直到找到非字符
2紊选、parseInt()方法還有基模式啼止,可以把二進(jìn)制、八進(jìn)制兵罢、十六進(jìn)制或其他任何進(jìn)制的字符串轉(zhuǎn)換成整數(shù)献烦。基是由
parseInt()方法的第二個(gè)參數(shù)指定的
3卖词、如果十進(jìn)制數(shù)包含前導(dǎo) 0巩那,那么最好采用基數(shù)
10,這樣才不會(huì)意外地得到八進(jìn)制的值
parseFloat()
parseFloat()方法與
parseInt()方法的處理方式相似此蜈,但是parseFloat()可以識(shí)別第一個(gè)小數(shù)點(diǎn)
3即横、顯示轉(zhuǎn)換
toString()函數(shù)將內(nèi)容轉(zhuǎn)換為字符串形式,其中 Number 提供的
toString()函數(shù)可以將數(shù)字以指定的進(jìn)制轉(zhuǎn)換為字符串裆赵,默認(rèn)為十進(jìn)制东囚。
Number 還提供了
toFixed()函數(shù)將根據(jù)小數(shù)點(diǎn)后指定位數(shù)將數(shù)字轉(zhuǎn)為字符串,四舍五入
4战授、強(qiáng)制轉(zhuǎn)換
JS 為 Number页藻、Boolean桨嫁、String
對(duì)象提供了構(gòu)造方法,用于強(qiáng)制轉(zhuǎn)換其他類型的數(shù)據(jù)份帐。
此時(shí)操作的是整個(gè)數(shù)據(jù)璃吧,而不是部分。
<script type="text/javascript">
// parseInt()
console.log(parseInt("123ab1c")); // 123
console.log(parseInt("123.4.5ab1c")); // 123
console.log(parseInt("0xA")); //returns 10
console.log(parseInt("22.5")); //returns 22
console.log(parseInt("blue111")); //returns NaN
console.log(parseInt("AF", 16)); //returns 175
console.log(parseInt("10", 2)); //returns 2
console.log(parseInt("10", 8)); //returns 8
console.log(parseInt("10", 10)); //returns 10
console.log(parseInt("010")); //returns 8
console.log(parseInt("010", 8)); //returns 8
console.log(parseInt("010", 10)); //returns 10
console.log("==========================");
// parseFloat()
console.log(parseFloat("123ab1c")); // 123
console.log(parseFloat("123.4ab1c")); // 123
console.log(parseFloat("0xA")); //returns 10
console.log(parseFloat("22.5")); //returns 22
console.log(parseFloat("blue111")); //returns NaN
console.log("====================顯式轉(zhuǎn)換==========");
var data = 10;
console.log(data.toString())
console.log(data.toString(2))
data = 1.4;
console.log(data.toFixed(0));
data = 1.49;
console.log(data.toFixed(1));
data = true;
console.log(data.toString());
console.log("===================強(qiáng)制轉(zhuǎn)換==========");
console.log(Number("1"));
console.log(Number("1.4"));
console.log(Number("123aabc"));
console.log(Number("abc"));
console.log(Number(true));
console.log(Number(false));
console.log(Number(19));
console.log(Number(new Object()));
console.log(Number(new Array()));
</script>
二废境、數(shù)組
1.數(shù)組(array)是按次序排列的一組數(shù)據(jù)畜挨,每個(gè)值的位置都有編號(hào)(從 0
開(kāi)始),整個(gè)數(shù)組
用方括號(hào)表示噩凹。 Js 中定義數(shù)組的三種方式如下(也可先聲明再賦值) :
var arr=[值 1,值 2,值 3]; //隱式創(chuàng)建
var arr=new Array(值 1,值 2,值 3); //直接實(shí)例化
var array=new Array(size); //創(chuàng)建數(shù)組并指定長(zhǎng)度
2.數(shù)組的特點(diǎn):
1)巴元、數(shù)組的長(zhǎng)度是可變的
2)、數(shù)組的類型可以不一樣
3)栓始、不存在下標(biāo)越界
3务冕、數(shù)組的遍歷
數(shù)組的遍歷即依次訪問(wèn)數(shù)組的每一個(gè)元素 ,JS 提供三種遍歷數(shù)組的方式:
1)幻赚、普通 for 循環(huán)遍歷
for(var i = 0; i < 數(shù)組名.length; i++) {
}
注:可以拿到undefinded的值禀忆,無(wú)法獲取數(shù)組中屬性對(duì)應(yīng)的值
2)、for ... in
for(var i in 數(shù)組) {
// i是下標(biāo)或?qū)傩悦?/p>
}
注:無(wú)法拿到undefinded的值落恼,可以獲取數(shù)組中屬性對(duì)應(yīng)的值
3)箩退、foreach
數(shù)組.foreach(function(element,index){
// element:元素;index:下標(biāo)
});
注:無(wú)法獲取屬性對(duì)應(yīng)的值與undefinded的值
* for -- 不遍歷屬性
* foreach -- 不遍歷屬性和索引中的 undefined
* for in -- 不遍歷索引中的 undefined
console.log("=======數(shù)組的遍歷=========");
// 1佳谦、普通 for 循環(huán)遍歷
for (var i = 0; i < arr1.length; i++) {
console.log(i + "----------" + arr1[i]);
}
console.log("===============");
// for... in
for (var i in arr1) {
console.log(i + '----------' + arr1[i]);
}
console.log("===============");
// foreach
arr1.forEach(function(elem,index){
console.log(index+ '----' + elem);
});
4戴涝、數(shù)組提供的方法
push 添加元素到最后
unshift 添加元素到最前
pop 刪除最后一項(xiàng)
shift 刪除第一項(xiàng)
reverse 數(shù)組翻轉(zhuǎn)
join 數(shù)組轉(zhuǎn)成字符串
indexOf 數(shù)組元素索引
slice 截取(切片)數(shù)組钻蔑,原數(shù)組不發(fā)生變化
splice 剪接數(shù)組啥刻,原數(shù)組變化,可以實(shí)現(xiàn)前后刪除效果
concat 數(shù)組合并
array.splice(index,howmany,item1,.....,itemX)
參數(shù) 描述
index 必需咪笑。規(guī)定從何處添加/刪除元素可帽。
該參數(shù)是開(kāi)始插入和(或)刪除的數(shù)組元素的下標(biāo),必須是數(shù)字窗怒。
howmany 必需映跟。規(guī)定應(yīng)該刪除多少元素。必須是數(shù)字扬虚,但可以是 "0"努隙。
如果未規(guī)定此參數(shù),則刪除從 index 開(kāi)始到原數(shù)組結(jié)尾的所有元素辜昵。
item1, ..., itemX 可選荸镊。要添加到數(shù)組的新元素
Type 描述
Array 如果從 arrayObject 中刪除了元素,則返回的是含有被刪除的元素的數(shù)組。
console.log("========數(shù)組提供的方法=======");
console.log(arr2);
arr2.push("dd"); // 數(shù)組的最后添加元素
arr2[arr2.length] = "ee";
console.log(arr2);
arr2.unshift("hello");
console.log(arr2);// 數(shù)組的最前面添加元素
// 分割數(shù)組
var str = arr2.join("-");
console.log(str);
// 將字符串轉(zhuǎn)換成數(shù)組
var strarr = str.split("-");
console.log(strarr);
三贷洲、 函數(shù)
函數(shù)收厨, 即方法。
就是一段預(yù)先設(shè)置的功能代碼塊优构,可以反復(fù)調(diào)用,根據(jù)輸入?yún)?shù)的不同雁竞,
返回不同的值钦椭。 函數(shù)也是對(duì)象。
1碑诉、函數(shù)的定義
定義方式有3種:
1)彪腔、函數(shù)聲明語(yǔ)句
function 函數(shù)名([形參]) {
}
調(diào)用:函數(shù)名([實(shí)參]);
2)、函數(shù)定義表達(dá)式
var 變量名/函數(shù)名 = function([形參]){
}
調(diào)用:變量名([實(shí)參])/函數(shù)名([實(shí)參]);
3)进栽、Function構(gòu)造函數(shù)
var 函數(shù)名 = new Function('參數(shù)1','參數(shù)2','函數(shù)的主體內(nèi)容');
調(diào)用:函數(shù)名([實(shí)參]);
注:構(gòu)造韓束的最后一個(gè)參數(shù)是函數(shù)體德挣。
注意:
1)、js 中的函數(shù)沒(méi)有重載快毛,同名的函數(shù)格嗅,會(huì)被后面的函數(shù)覆蓋。
2)唠帝、js 中允許有不定數(shù)目的參數(shù)屯掖,后面介紹 arguments 對(duì)象
函數(shù)名的提升(了解)
JavaScript 引擎將函數(shù)名視同變量名,所以采用 function
命令聲明函數(shù)時(shí)襟衰,整個(gè)函數(shù)會(huì)像變量聲明一樣贴铜,被提升到代碼頭部。所以瀑晒,下面的代碼不會(huì)報(bào)錯(cuò)
但是绍坝,如果采用賦值語(yǔ)句定義函數(shù),JavaScript 就會(huì)報(bào)錯(cuò)苔悦。
<script type="text/javascript">
/* 函數(shù)的定義 */
// 1轩褐、函數(shù)聲明語(yǔ)句
function fn1(a,b) {
console.log(a+b);
}
fn1(1,1);
// 2、函數(shù)定義表達(dá)式
var fn2 = function(x){
console.log(x);
}
console.log(fn2);
fn2(10);
// 3间坐、Function構(gòu)造函數(shù)
var fn3 = new Function('x','y','console.log(x+y);')
fn3(1,2);
fn4();
/*函數(shù)名的提升*/
function fn4() {
console.log("函數(shù)名的提升灾挨。。竹宋。劳澄。");
}
fn5();
var fn5 = function(){
console.log("函數(shù)名的提升...");
}
</script>
2. 函數(shù)的參數(shù)、調(diào)用和 return 語(yǔ)句
2.1參數(shù)
函數(shù)運(yùn)行的時(shí)候蜈七,有時(shí)需要提供外部數(shù)據(jù)秒拔,不同的外部數(shù)據(jù)會(huì)得到不同的結(jié)果,這種外部
數(shù)據(jù)就叫參數(shù)飒硅,定義時(shí)的參數(shù)稱為形參砂缩,調(diào)用時(shí)的參數(shù)稱為實(shí)參
?實(shí)參可以省略作谚,那么對(duì)應(yīng)形參為 undefined
?若函數(shù)形參同名(一般不會(huì)這么干):在使用時(shí)以最后一個(gè)值為準(zhǔn)。
?可以給參數(shù)默認(rèn)值: 當(dāng)參數(shù)為特殊值時(shí)庵芭,可以賦予默認(rèn)值妹懒。
?參數(shù)為值傳遞, 傳遞副本 双吆; 引用傳遞時(shí)傳遞地址,操作的是同一個(gè)對(duì)象好乐。
2.2函數(shù)的調(diào)用
1匾竿、常用調(diào)用方式:函數(shù)名([實(shí)參]);
存在返回值可以變量接收,若接收無(wú)返回值函數(shù)則為 undefined
2蔚万、函數(shù)調(diào)用模式
3岭妖、方法調(diào)用模式
4、call()和apply()
javascript 中函數(shù)也是對(duì)象反璃,函數(shù)對(duì)象也可以包含方法昵慌。 call()和 apply()方法可以用來(lái)間
接地調(diào)用函數(shù)。任何函數(shù)可以作為任何對(duì)象的方法來(lái)調(diào)用版扩,哪怕這個(gè)函數(shù)不是那個(gè)對(duì)象的方
法废离。兩個(gè)方法都可以指定調(diào)用的實(shí)參。 call()方法使用它自有的實(shí)參列表作為函數(shù)的實(shí)參礁芦,
apply()方法則要求以數(shù)組的形式傳入?yún)?shù)
注:誰(shuí)調(diào)用函數(shù)蜻韭,this就指向誰(shuí)
匿名函數(shù)立即調(diào)用
(1)匿名函數(shù):function ([參數(shù)]){}
(2)調(diào)用:(function ([形參]) {})([實(shí)參]);
在函數(shù)只被使用一次的情況下可以使用這種方式,簡(jiǎn)便省事
2.3 return 語(yǔ)句
函數(shù)的執(zhí)行可能會(huì)有返回值柿扣,需要使用 return 語(yǔ)句將結(jié)果返回肖方。return
語(yǔ)句不是必需的,
如果沒(méi)有的話未状,該函數(shù)就不返回任何值俯画,或者說(shuō)返回 undefined。
作用:在沒(méi)有返回值的方法中司草,用來(lái)結(jié)束方法艰垂。
有返回值的方法中,一個(gè)是用來(lái)結(jié)束方法埋虹,一個(gè)是將值帶給調(diào)用者猜憎。
<script type="text/javascript">
/* 參數(shù) */
// 1、實(shí)參可以省略搔课,那么對(duì)應(yīng)形參為 undefined
function fn1(a,b) {
console.log(a);
}
fn1();
fn1(1);
fn1(1,2);
// 2胰柑、若函數(shù)形參同名(一般不會(huì)這么干):在使用時(shí)以最后一個(gè)值為準(zhǔn)。
function fn2(x,x){
console.log(x);
}
fn2(10,20);
// 3、可以給參數(shù)默認(rèn)值:當(dāng)參數(shù)為特殊值時(shí)柬讨,可以賦予默認(rèn)值崩瓤。
function fn3(str) {
str = str || "Hello";
console.log(str);
}
fn3();
fn3("你好");
function fn4(str) {
(str !== undefined && str !== null) ? str = str : str = "值不存在";
console.log(str);
}
fn4();
fn4("你好呀");
// 4、參數(shù)為值傳遞踩官,傳遞副本 却桶;引用傳遞時(shí)傳遞地址,操作的是同一個(gè)對(duì)象
// 值傳遞
var num = 10;
function fn5(n) {
n = 20;
}
fn5(num);
console.log(num);
// 引用傳遞
var arr = [1,2,3];
var obj = {
uname:"zhangsan"
};
function fn6(a,b) {
a[0] = 100;
b.uname = "lisi";
}
fn6(arr,obj);
console.log(arr);
console.log(obj);
function fn7(a,b) {
a = [4,5,6];
b = {
uname:"wangwu"
};
}
fn7(arr);
console.log(arr);
console.log(obj);
console.log("===============函數(shù)的調(diào)用==============");
// 直接調(diào)用
function fn8() {
console.log(this); // Window對(duì)象
}
fn8();
// 函數(shù)調(diào)用模式
var fn9 = function() {
console.log(this); // Window對(duì)象
return 1;
}
var f = fn9();
console.log(f);
// 方法調(diào)用模式
var obj = {
uname:"zhangsan",
uage:18,
cats:["喵喵","貓貓"],
sayHello:function() {
console.log(this); // obj對(duì)象
console.log("你好呀~");
}
};
console.log(obj.sayHello);
obj.sayHello();
// 間接調(diào)用
var obj2 = {};
function fn10(x,y) {
console.log(x+y);
console.log(this);
}
fn10(1,2); // Window對(duì)象
fn10.call(); // Window對(duì)象
fn10.call(obj2); // obj2
fn10.call(obj2,10,20); // obj2
fn10.apply(obj2,[100,200]); // obj2
console.log("===============匿名函數(shù)立即調(diào)用==============");
(function(a,b) {
console.log(a-b);
})(10,2);
</script>
2.3. arguments 對(duì)象和函數(shù)的方法及屬性
arguments 對(duì)象中存放了調(diào)用該函數(shù)時(shí)傳遞的實(shí)際參數(shù)蔗牡。由于 JavaScript
允許函數(shù)有不定數(shù)目的參數(shù)肾扰,所以我們需要一種機(jī)制,可以在函數(shù)體內(nèi)部讀取所有參數(shù)蛋逾,這就是
arguments
對(duì)象的由來(lái) 。函數(shù)中可以使用 arguments 對(duì)象來(lái)獲取實(shí)參窗悯。
函數(shù)名.name 得到函數(shù)名稱
函數(shù)名.length 得到函數(shù)的形參數(shù)量
函數(shù)名.toString() 得到函數(shù)的源碼
<script type="text/javascript">
function fn1 (a,b,c) {
// arguments對(duì)象可以得到函數(shù)的實(shí)參數(shù)量
console.log(arguments.length);
console.log("函數(shù)....");
console.log(arguments);
}
fn1(1,2);
console.log(fn1.name);
console.log(fn1.length);
console.log(fn1.toString());
</script>
2.4函數(shù)的作用域
函數(shù)作用域:全局(global variable)和局部(local variable)
1)全局變量與局部變量同名問(wèn)題
2)在函數(shù)中定義變量時(shí)区匣,若沒(méi)有加 var 關(guān)鍵字,使用之后自動(dòng)變?yōu)槿肿兞?/p>
3)變量作用域提升
<script type="text/javascript">
var num = 1;
function fn() {
var num = 10; // 這是個(gè)局部變量蒋院,與全部變量毫無(wú)關(guān)系
console.log(num); // 就近原則
var b = 2; // 局部變量
c = 3; // 不用var修飾符聲明的變量時(shí)全局變量
}
fn();
console.log(num);
//console.log(b);
console.log(c);
function foo(x) {
if (x > 100) {
var tmp = x - 100;
}
console.log(tmp);
}
function foo(x) {
var tmp;
if (x > 100) {
tmp = x - 100;
}
console.log(tmp);
}
foo(1);
</script>
2.5 閉包
出于種種原因亏钩,我們有時(shí)候需要得到函數(shù)內(nèi)的局部變量。但是欺旧,正常情況下姑丑,這是辦不到
的,只有通過(guò)變通方法才能實(shí)現(xiàn)辞友。那就是在函數(shù)的內(nèi)部栅哀,再定義一個(gè)函數(shù)。
閉包就是能夠讀取其他函數(shù)內(nèi)部變量的函數(shù)称龙。由于在 Javascript
語(yǔ)言中留拾,只有函數(shù)內(nèi)部的\子函數(shù)才能讀取局部變量,因此可以把閉包簡(jiǎn)單理解成"定義在一個(gè)函數(shù)內(nèi)部的函數(shù)"鲫尊。所以痴柔,
在本質(zhì)上,閉包就是將函數(shù)內(nèi)部和函數(shù)外部連接起來(lái)的一座橋梁疫向。
閉包可以用在許多地方咳蔚。它的最大用處有兩個(gè),一個(gè)是前面提到的可以讀取函數(shù)內(nèi)部的變
量搔驼,另一個(gè)就是讓這些變量的值始終保持在內(nèi)存中谈火。
以及還可以避免變量名沖突的問(wèn)題。
閉包的形成:
1匙奴、外部函數(shù)內(nèi)部嵌套內(nèi)部函數(shù)
2堆巧、內(nèi)部函數(shù)中使用外部函數(shù)的環(huán)境
3、外部函數(shù)返回內(nèi)部函數(shù)
閉包的作用:
1、獲取函數(shù)內(nèi)部的變量
2谍肤、保存變量的值在內(nèi)存中
3啦租、避免變量名重復(fù)
<script type="text/javascript">
// 1、外部函數(shù)內(nèi)部嵌套內(nèi)部函數(shù)
function fn1() {
var a = "Hello!";
function fn2() {
// 2荒揣、內(nèi)部函數(shù)中使用外部函數(shù)的環(huán)境
console.log(a);
}
// 3篷角、外部函數(shù)返回內(nèi)部函數(shù)
return fn2;
}
var f = fn1();
console.log(f);
f();
function test() {
var num = 1;
num++;
console.log(num);
}
test();
test();
test();
console.log("====================");
// 1、外部函數(shù)內(nèi)部嵌套內(nèi)部函數(shù)
function outFn() {
var num = 1;
function inFn(){
// 2系任、內(nèi)部函數(shù)中使用外部函數(shù)的環(huán)境
num++;
console.log(num);
}
// 3恳蹲、外部函數(shù)返回內(nèi)部函數(shù)
return inFn;
}
var inF = outFn();
inF();
inF();
inF();
inF();
var inF1 = outFn();
inF();
console.log("===========澆水實(shí)例=========");
document.write("==========澆水實(shí)例=========<br>");
// 定義外部函數(shù),設(shè)置形參(水壺的容量)
function waterFlower(total) {
// 定義內(nèi)部函數(shù)俩滥,執(zhí)行澆水過(guò)程 (每次澆水嘉蕾,水容量減50ml)
function water(flower) {
// 當(dāng)水容量大于50ml則澆水
if (total >= 50) {
// 每次澆水減50
total = total - 50;
} else {
// 如果沒(méi)水,則自動(dòng)加水
document.write("<h4>正在重新裝水....</h4>");
total = 200;
// 澆水
total = total - 50;
//
}
document.write("給"+flower+"澆水50ml霜旧,剩余" + total + "ml的水错忱!<br>");
}
// 返回內(nèi)部函數(shù)
return water;
}
// 裝水
var t = waterFlower(200);
// 澆水
t("桃花");
t("蘭花");
t("玫瑰花");
t("菊花");
t("桂花");
</script>
2.6 JS 內(nèi)置對(duì)象
Arguments 只在函數(shù)內(nèi)部定義,保存了函數(shù)的實(shí)參
Array 數(shù)組對(duì)象
Data 日期對(duì)象挂据,用來(lái)創(chuàng)建和獲取日期
Math 數(shù)學(xué)對(duì)象
String 字符串對(duì)象以清,提供對(duì)字符串的一系列操作
String:
? charAt(idx):返回指定位置處的字符
? indexOf(Chr):返回指定子字符串的位置,從左到右崎逃。找不到返回-1
? substr(m,n):返回給定字符串中從 m 位置開(kāi)始掷倔,取 n 個(gè)字符,如果參數(shù) n 省略个绍,
則意味著取到字符串末尾勒葱。
? substring(m,n):返回給定字符串中從 m 位置開(kāi)始,到 n 位置結(jié)束障贸,如果參數(shù) n 省
略错森,則意味著取到字符串末尾。
? toLowerCase():將字符串中的字符全部轉(zhuǎn)化成小寫(xiě)篮洁。
? toUpperCase():將字符串中的字符全部轉(zhuǎn)化成大寫(xiě)涩维。
? length: 屬性,不是方法袁波,返回字符串的長(zhǎng)度瓦阐。
Math:
? Math.random()
? Math.ceil() :天花板 大于最大整數(shù)
? Math.floor() :地板 小于最小整數(shù) String
Date:
//獲取
? getFullYear()年, getMonth()月, getDate()日,
? getHours()時(shí),getMinutes()分,getSeconds()秒
//設(shè)置
? setYear(), setMonth(), ...
? toLoacaleString()
說(shuō)明
1.getMonth():得到的值: 0~11(1 月~12 月)
2.setMonth():設(shè)置值時(shí) 0~11
3.toLocaleString():可根據(jù)本地時(shí)間把 Date 對(duì)象轉(zhuǎn)換為字符串,并返回結(jié)果篷牌。
<script type="text/javascript">
// 得到系統(tǒng)當(dāng)前時(shí)間
var mydate = new Date();
console.log(mydate);
// toLocaleString():可根據(jù)本地時(shí)間把 Date 對(duì)象轉(zhuǎn)換為字符串睡蟋,并返回結(jié)果。
console.log(mydate.toDateString());
console.log(mydate.toLocaleString());
var mon = mydate.getMonth()+1;
if (mon < 10) {
mon = "0" + mon;
}
var newDate = mydate.getFullYear() + "-" + mon + "-" + mydate.getDate();
newDate += " " + mydate.getHours() + ":" + mydate.getMinutes() + ":" + mydate.getSeconds();
console.log(newDate);
</script>
2.7 JS 對(duì)象
對(duì)象(object)是 JavaScript 的核心概念枷颊,也是最重要的數(shù)據(jù)類型戳杀。
JavaScript 的所有數(shù)
據(jù)都可以被視為對(duì)象该面。 JavaScript 提供多個(gè)內(nèi)建對(duì)象,比如 String信卡、 Date隔缀、
Array 等等。對(duì)象是帶有屬性和方法的特殊數(shù)據(jù)類型傍菇。
簡(jiǎn)單說(shuō)猾瘸,所謂對(duì)象,就是一種無(wú)序的數(shù)據(jù)集合丢习,由若干個(gè)"鍵值對(duì)"(key-value)構(gòu)成牵触。通
過(guò) JavaScript 我們可以創(chuàng)建自己的對(duì)象。 JavaScript
對(duì)象滿足的這種"鍵值對(duì)"的格式我們成為JSON 格式咐低,
以后會(huì)見(jiàn)得非常多揽思,即偉大的 JSON 對(duì)象。
1见擦、定義對(duì)象
JS 創(chuàng)建自定義對(duì)象绰更,主要通過(guò)三種方式:
1)、字面量形式創(chuàng)建對(duì)象
var 變量名 = {}; // 空對(duì)象
var 變量名 = {鍵:值,....};
2)锡宋、通過(guò) new Object 對(duì)象創(chuàng)建
var 變量名 = new Object();
3)、通過(guò) Object 對(duì)象的 create 方法創(chuàng)建對(duì)象
var 變量名 = Object.create(null或?qū)ο?;
// 1特恬、字面量形式創(chuàng)建對(duì)象
var obj = {}; // 空對(duì)象
var obj2 = {
uname:"zhangsan",
uage:18
};
obj2.usex=true;
console.log(obj);
console.log(obj2);
// 2执俩、通過(guò) new Object 對(duì)象創(chuàng)建
var obj3 = new Object();
obj3.name = "Tom";
console.log(obj3);
// 3、通過(guò) Object 對(duì)象的 create 方法創(chuàng)建對(duì)象
var obj4 = Object.create(null);
console.log(obj4.uname);
var obj5 = Object.create(obj2);
console.log(obj5.uname);
// 2癌刽、通過(guò) new Object 對(duì)象創(chuàng)建
console.log('============序列化和反序列化============');
var str = '{"uname":"zhangsan", "uage":18 }';
// 反序列化:將字符串轉(zhuǎn)換成對(duì)象
var object1 = JSON.parse(str);
console.log(object1);
console.log(object1.uname);
// 序列化役首,將對(duì)象轉(zhuǎn)換成字符串
var json1 = JSON.stringify(object1)
console.log(json1);
console.log(json1.uname);
2、對(duì)象的序列化和反序列化
序列化即將 JS 對(duì)象序列化為字符串显拜,反序列化即將字符串反序列化為 JS 對(duì)象衡奥。
JS 中通過(guò)調(diào)用 JSON
方法,可以將對(duì)象序列化成字符串远荠,也可以將字符串反序列化成對(duì)象 矮固。
- 序列化對(duì)象,將對(duì)象轉(zhuǎn)為字符串
JSON.stringify(object)
- 反序列化譬淳,將一個(gè) Json 字符串轉(zhuǎn)換為對(duì)象档址。
JSON.parse(jsonStr)
console.log('============序列化和反序列化============');
var str = '{"uname":"zhangsan", "uage":18 }';
// 反序列化:將字符串轉(zhuǎn)換成對(duì)象
var object1 = JSON.parse(str);
console.log(object1);
console.log(object1.uname);
// 序列化,將對(duì)象轉(zhuǎn)換成字符串
var json1 = JSON.stringify(object1)
console.log(json1);
console.log(json1.uname);
3邻梆、eval()
1守伸、可借助 eval()動(dòng)態(tài)函數(shù),將參數(shù)字符串解析成 js
代碼來(lái)執(zhí)行浦妄,只接受原始字符串作為參數(shù)
eval("console.log('你好')");//控制臺(tái)輸出你好
2尼摹、可將 json 串轉(zhuǎn)為 json 對(duì)象
1)第一種解析方式:得到的 json 對(duì)象名就是 jsonObj
eval("var jsonObj = " + jsonStr);
2)第二種解析方式:對(duì)象中有多個(gè)屬性
var jsonObj = eval("(" + jsonStr + ")");
由于 json 是以{ }的方式來(lái)開(kāi)始以及結(jié)束的见芹,在 eval
中會(huì)被當(dāng)成一個(gè)語(yǔ)句塊來(lái)處理,故必
須強(qiáng)制將它轉(zhuǎn)換成一種表達(dá)式蠢涝。加上圓括號(hào)是使 eval
函數(shù)在處理時(shí)強(qiáng)制將括號(hào)內(nèi)的表達(dá)式轉(zhuǎn)化為對(duì)象而不作為語(yǔ)句來(lái)執(zhí)行玄呛。
3)第二種解析方式:對(duì)象中只有一個(gè)屬性
eval(jsonStr);
console.log("=============eval()============");
console.log('你好');
eval("console.log('你好')");//控制臺(tái)輸出你好
// 1)第一種解析方式:得到的 json 對(duì)象名就是 jsonObj
var ab = '{"uname":"zhangsan", "uage":18 }';
eval("var jsonObj = " + ab);
console.log(jsonObj);
// 2)第二種解析方式:對(duì)象中有多個(gè)屬性
var jsonObj2 = eval("(" +ab + ")");
console.log(jsonObj2);
var arrStr = "[1,'1a','fg']";
// 第一種解析方式eval("var arrObj = " + arrStr);
eval("var arr=" + arrStr);
console.log(arr);
// 第二種解析方式:eval(arrStr);
console.log(arrStr);
console.log(eval(arrStr));
2.8 this
**
**this 是 JavaScript 語(yǔ)言的一個(gè)關(guān)鍵字。
它代表函數(shù)運(yùn)行時(shí)惠赫,自動(dòng)生成的一個(gè)內(nèi)部對(duì)象把鉴,只能在函數(shù)內(nèi)部使用。
隨著函數(shù)使用場(chǎng)合的不同儿咱, this 的值會(huì)發(fā)生變化庭砍。但是有一個(gè)總的原則,那就是
this 指的
是混埠,調(diào)用函數(shù)的那個(gè)對(duì)象怠缸。
在函數(shù)中使用 this
**
**在函數(shù)中使用 this 屬于全局性調(diào)用,代表全局對(duì)象钳宪,通過(guò) window
對(duì)象來(lái)訪問(wèn)揭北。
function test () {
this.x = 1;
console.log(this.x);
}
test();
console.log(x);//相當(dāng)于定義在全局對(duì)象上的屬性
var x = 10;
console.log(x) // 10
function test (){
console.log(this.x) //10
this.x = 1;
console.log(this.x) //1
console.log(this)
}
test()
console.log(x) //1
console.log(this)