javascript基礎(chǔ)
一.函數(shù)的arguments
- 偽數(shù)組:像數(shù)組,但不是數(shù)組
- 可以動態(tài)添加參數(shù)
//求任意個數(shù)的最大值
function fn(){
var max = arguments[0];
for(var i = 1;i< arguments[i];i++){
if(max < arguments[i]){
max = arguments[i]
}
}
return max;
}
var max = fn(12,34,56,890);
console.log(max);
二.函數(shù)的其他案例
// 翻轉(zhuǎn)數(shù)組 reserve(翻轉(zhuǎn))
function fn(arr){
var newArray = [];
for(var i = arr.length-1; i >= 0; i--){
newArray[newArray.length] = arr[i];
}
return newArray;
}
var arr1 = [12,34,56,1];
var newArray = fn(arr1);
console.log(newArray);
// 翻轉(zhuǎn)數(shù)組的方法 reverse()
var arr1 = [12,34,56,1]
console.log(arr1.reverse());
// 數(shù)組的冒泡排序的原理绪爸?
// 數(shù)組的兩兩比較把大值依次往后挪
// 外層循環(huán)一次取出比較值中的最大值一次,最后冒泡排序完成
// 注意做個開關(guān)提高效率
function getMp(arr){
var isSort;
for(var i = 0;i < arr.length-1;i++){
isSort = true;
for(var j = 0; j < arr.length-1-i;j++){
if(arr[j] > arr[j+1]){
isSort = false; //還沒有排序好,false
var temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
//定義一個開關(guān),如果true,跳出循環(huán)
if(isSort){
break;
}
}
return arr;
}
var arr = [12,23,190,89];
var le = getMp(arr);
console.log(le);*/
// var arr = [12,23,190,89];
// console.log(arr.sort()); //錯誤
// 輸入年份是否是閏年
function getYear(year){
var flag;
if(year % 4 ===0 && year % 100 !==0 || year % 400 ===0){
console.log(year+'是閏年');
flag = true;
} else{
console.log(year+'是平年');
flag = false;
}
return flag;
}
getYear(2016);
//閏年2
function fn(year){
var flag = false;
if(year % 4 === 0 && year % 100 !== 0 || year % 400 === 0){
console.log(year+'是閏年');
flag = true;
} else {
console.log(year+'是平年');
}
return flag;
}
fn(1998);
//獲取年月日 是當前年的多少天轴脐,中的難點是比如傳入的是5月遍歷1-5月天數(shù)累加
//一岸霹、三栖忠、五蝌戒、七、八碱工、十娃承、臘是31天,四怕篷、六历筝、九、十一是30天匙头。平年二月28閏年二月29天
function getDate(year,month,day){
var days = day;
for(var i = 1;i<month;i++){
if(i === 1 || i === 3 || i === 5 || i === 7 || i === 8 || i ==10 || i === 12){
days += 31;
} else if(i === 4 || i === 6 || i === 9 ||i === 11){
days += 30;
} else {
if(getYear(year)){ //if里面調(diào)用判斷閏年平年的函數(shù)
days += 29;
}else{
days += 28;
}
}
}
return days
}
var days = getDate(2018,3,2)
console.log(days);
//判斷2018.4.21
function getDate(year,month,day){
days = day;
for(var i = 0; i < month; i++){
if(i === 1 || i === 3 || i === 5 || i === 7 || i === 8 || i === 10 || i === 12){
days += 31;
} else if (i === 4 || i === 6 || i === 9 || i === 11) {
days += 30;
}else if (i === 2){
if(getYear(year)){
days += 29;
} else {
days += 28;
}
}
}
return days;
}
var days = getDate(2018,2,3);
console.log(days);
三.匿名函數(shù)和自調(diào)用函數(shù)
-
匿名函數(shù):沒有方法名的函數(shù)
注意點:
- 不可以獨立存在 :只能定義變量等于函數(shù)
var vvv = function(){ }
- 可以通過自調(diào)用函數(shù):自己調(diào)用自己
-
自調(diào)用函數(shù): 自己調(diào)用自己;
(function (){})(); +function (){}(); -function (){}(); *function (){}(); /function (){}();
四.作用域和作用域鏈
- 作用域
函數(shù)或者變量可以起作用訪問;
1.全局作用域:
在script或者一個獨立的js文件中漫谷,在全局作用域中定義的變量 全局變量。在任何位置都可以訪問.
2.局部作用域:
任何一個函數(shù)的內(nèi)部都有一個局部作用域蹂析,在局部作用域中定義的變量 局部變量舔示。局部變量只有在定義該變量的函數(shù)中可以訪問
// 全局變量
var a = 10;
function fn(){
// 局部變量
var b = 10;
//全局變量 ==> window.c = 30,但是不推薦這樣使用
c = 30;
console.log(a); // 10
console.log(c); // 30
console.log(b); // 10
}
fn();
console.log(c) // 30
console.log(a); // 10
console.log(b); // b is not defined
- 作用域鏈
就近原則
// 全局變量
var a = 10; //----->0級作用域鏈
function fn(){
// 局部變量
var a = 20; //----->1級作用域鏈
console.log(a); // 20
function fn1(){
// 局部變量 //----->2級作用域鏈
console.log(a) // 20
}
fn1();
}
fn();
console.log(a); // 10
五.預(yù)解析
- 函數(shù)提升:但是賦值不提升
- 變量提升:調(diào)用不提升
- 函數(shù)和變量同時存在,函數(shù)優(yōu)先
案例:
// 1.
var a = 25;
function abc (){
alert(a); //undefined
var a = 10;
}
abc();
//預(yù)解析
function abc(){
var a;
alert(a); //undefined
a = 10;
}
var a;
a = 25;
abc(); // 調(diào)用函數(shù)而已
//----------
// 2.
console.log(a); //打印函數(shù)a
function a() {
console.log('aaaaa');
}
var a = 1;
console.log(a);
// 解析
var a;
function a() {
console.log('aaaaa');
}
console.log(a); // 函數(shù)整體
a = 1;
console.log(a); // 1
//-------
var a = 18;
f1();
function f1() {
var b = 9;
console.log(a);
console.log(b);
var a = '123';
}
// 解析
var a;
function f1() {
var b = 9;
var a;
console.log(a); //undefined
console.log(b); // 9
a = '123';
}
a = 18;
f1();
六.對象概念
- 萬物皆對象电抚,對象是一個具體的事物惕稻,一個具體的事物就會有行為和特征。
- js中對象的語法格式
var student = {
name: '張飛', // key: value,
age: 18,
sex: '男',
sayHi: function () {
console.log('hello');
}
};
// 對象 具有 屬性和方法
// 屬性: 特征
// 方法: 行為
七.創(chuàng)建對象
- 對象字面量
var obj = {
name:'zs',
age: 18,
sayHi:function(){
console.log(obj.name+'hello');
}
}
console.log(obj);
- 用new Object 獲取對象
var obj = new Object;
obj.name = 'keke';
obj.age = 21;
obj.sex = '女';
obj.sayHi = function(){
console.log(obj.name+'hello');
}
console.log(obj)
- 當有多個對象就需要封裝函數(shù)-->工廠方法
function Creatstudent(name,age,sex,hobby){
var obj = new Object;
obj.name = name;
obj.age = age;
obj.sex = sex;
obj.hobby = hobby;
obj.sayHi = function(){
console.log(this.name+'hello');
}
return obj;
}
var stu1 = Creatstudent('張三',18,'男',['唱歌','跳舞','旅游']);
var stu2 = Creatstudent('李四',22,'男',['唱歌','攝影','旅游']);
console.log(stu1);
console.log(stu2);
stu1.sayHi();
stu2.sayHi();
- 構(gòu)造函數(shù) 函數(shù)名的第一個字母要大寫(帕斯卡命名)
function Student(name,age,sex,hobby){
this.name = name;
this.age = age;
this.sex = sex;
this.hobby = hobby;
this.sayHi = function(){
console.log(this.name+'hello');
}
}
var stu1 = new Student('張三',18,'男',['唱歌','跳舞','旅游']);
var stu2 = new Student('李四',22,'女',['繪畫','跳舞','旅游']);
console.log(stu1);
stu1.sayHi();
console.log(stu2);
stu2.sayHi();
八.new
- 創(chuàng)建一個空的對象Object;{}
- 讓構(gòu)造函數(shù)中的this指向當前對象
- 執(zhí)行構(gòu)造函數(shù)
- 返回這個對象(return);
九.this
- 在函數(shù)中 -----> 指向winndow;
function fn(){
console.log(this); //window
}
fn();
- 在方法中 -----> 指向當前方法創(chuàng)建的對象;
var stu = {
name:'keke',
age:18,
sex:'男',
sayHi:function(){
console.log(this.name+'hello');
console.log(this); //stu這個方法,包括里面所有的內(nèi)容
}
}
console.log(stu);
stu.sayHi();
- 在構(gòu)造函數(shù)中 -----> 指向構(gòu)造函數(shù)創(chuàng)建的對象;
function Student(name,age,sex){
this.name = name;
this.age = age;
this.sex = sex;
this.sayHi = function(){
console.log(this.name+':hello');
console.log(this); // Student 這構(gòu)造函數(shù)創(chuàng)建的方法
}
}
var stu1 = new Student('張三',18,'男');
console.log(stu1);
stu1.sayHi();
十.遍歷對象和刪除對象
// 1.遍歷對象
// 訪問對象的屬性: obj.name / obj['name']
var obj = {
name: 'keke',
age: 18,
sex: '男',
sayHi: function(){
console.log(this.name+':hello');
}
}
console.log(stu);
// for in
for(var key in obj){
console.log(key+'----->'+obj[key]);
}
// 動態(tài)添加對象
var kk = {};
for(var i = 0;i < 7; i++){
kk['a'+i] = i;
}
console.log(kk);
for(var key in kk){
console.log(key+':'+kk[key]);
}
// 刪除對象
var obj = {
name: 'keke',
age: 18,
sex: '女',
sayHi: function(){
console.log(this.name+':hello');
}
}
console.log(obj);
delete obj.name; //刪除對象
console.log(obj);
delete obj.sayHi; //刪除方法
console.log(obj);