javascript
JS函数浅析(一)
?
1.萬物皆為對象
提起函數首先要知道對象,而對象又是js數據類型中的一種,所以我們從頭開始。
1)javascript數據類型有哪些?
? ? ? ? ? 原始數據類型:number,undefined,null,string,boolean
? ?引用數據類型:object
?
2)數據類型的檢測:
由于js中的變量是松散類型的,所以它提供了一種檢測當前變量的數據類型的方法,也就是typeof關鍵字.typeof 123 //Numbertypeof 'abc' //Stringtypeof true //Booleantypeof undefined //Undefinedtypeof null //Objecttypeof { } //Objecttypeof [ ] //Objecttypeof console.log() //Functionnull類型進行typeof操作符后,結果是object,原因在于,null類型被當做一個空對象引用。面試會遇到的坑:
? typeof(需要檢測的內容) -- number,string,boolean,function,object,undefined (返回的結果類型都是string類型)。?
? typeof(null)? 返回的結果類型為object
?
3)引用數據類型:
對象都有自己的屬性和方法:
function fun(a,b,c){ //函數類對象} console.log(fun) //fun它也是window對象底下的屬性 //fun自己的屬性console.log(fun.name) //輸出函數的函數名console.log(fun.length) //形參的個數console.log(fun.prototype) //原型//函數也是可以直接當成對象使用的 //對象的增刪查改fun.abc = 123; //增fun.bcd = function(){ //增一個特殊的元素console.log("hello")} fun.bcd(); fun.abc; //查fun.abc = 456; //改console.log(fun.abc);delete fun.abc; //刪
4)原始數據類型:
? 可以改變的引用類型,和不可以改變的原始類型(這個地方的改變和不改變表示的是存儲結構);
var s = 'hello'; s.toUpperCase(); //返回'HELLO',但是并沒有改變s的值 alert(s); //返回 hello; var a=1; //這行語句中包含了兩個量:一個是a,他叫變量,這個大多數人都知道;一個是1,他叫數值型常量,這個大多數人都會忽略,以為一個數字、字符串、布爾值跟常量變量扯不上關系。不要以為1不算“量”,1就是值恒為1的常量,2就是值恒為2的常量... var a=false; //同上,a是布爾型變量,false是布爾型常量,他的值不能被改變,false永遠代表false; var a='abc'; //同理,'abc'叫字符型常量,或者叫字符串常量。還記得經典的JS報錯“未結束的字符串常量”么?意思就是沒找到到一個字符串常量的結束符:引號。 //綜上,所有為固定值永恒不變的量就是常量,也就是不可變的量。 //其他很多語言可以用const關鍵字定義一個自己命名的常量,JS中沒有用const去定義一個常量的功能,可以定義一個變量當“常量”用,自己別改就行。?
? 原始類型屬性的添加;
var str = "hello world"; str.abc = 123; //自己添加屬性 console.log(str.length) //自己自帶的屬性console.log(str.abc) //原始類型不能添加屬性,如果添加,不會報錯,添加完成系統檢測為原始類型后馬上刪除? 當用new的方式創建一個字符串時:(此時為一個對象,數據類型自然變成了引用數據類型)
var str2 = new String("hello world"); //一定出來的是對象 console.log(str2.length) str2.abc = 456; console.log(str2.abc);number等其他類型也一樣:
var num = 123;num.abc = 456;console.log(num.abc)var numobj = new Number(123);numobj.abc = 456;console.log(numobj.abc)實例:
var str = "hello world";var len = typeof(str); if(len.length == 6){len.abc = "typeof檢測的結果為string類型"; }console.log(len.abc); //最后輸出的是什么? 輸出的是undefined,len.length=6可以走進循環,只是len是原始數據類型,可以添加,但是添加完成馬上就刪除了。2.函數作用域
在JavaScript中,ES6以前有三種情況:
?1.全局作用域
? 使用var聲明的變量不是全局就是局部,不是用var聲明的變量都是全局變量
? ?
? 2.函數作用域 (局部作用域)
function fun(){ num = 100; } fun(); console.log(num);? 函數如果不調用,永遠不會執行,管你里面的代碼是什么東西,再多的錯誤不執行也是不會拋出的
?
?3.es6中有塊級作用域
過去,javascript缺乏塊級作用域,var聲明時的聲明提升、屬性變量等行為讓人困惑。ES6的新語法可以幫助我們更好地控制作用域。(這一部分待后續完善)
?
3.函數聲明和函數表達式
函數聲明
function fun(){ //函數聲明}函數表達式
var abc = function fun(a,b,c,d){ //函數表達式console.log("hello")}// 調用abc?fun?
? ?abc();
? ?fun(); //會報錯
? ?console.log(abc.name) //除了這個地方可以看到fun以外,其他沒有任何用處
? ?console.log(fun.name)//會報錯
? ?console.log(abc.length)
? ?console.log(fun.length)
? abc這個時候就是一個函數,當abc變成了表達式以后,函數就會放棄自己的名字,所以要調用abc()。
函數表達式和函數聲明的區別:
function fun(){ //函數聲明console.log("hello");}()函數聲明是直接可以被執行符號執行的,在函數的前面可以加上+-!可以讓函數聲明變成函數表達式 +function fun(){ //函數聲明變成函數表達式console.log("hello");}()-function fun(){ console.log("hello");}()!function fun(){ console.log("hello");}()
?
?
4.立即執行函數
1.特點:
? 1.函數聲明了以后直接自己執行,用函數的返回值,適合做初始化的工作
? 2.避免寫全局變量,所有的內容全部都放在立即執行函數中
2.格式:
//1. (function(){})()//2. (function(){}())3.功能:
1)初始化
//1加到100的值 var he = (function(n){var num = 0;for(var i = 1;i<=n;i++){num+=i;}return num; })(100);?2)功能型
寫功能型的時候,在立即執行函數前面加上分號 ;(function(){ console.log(456)})()?
?
?
?
?
?
總結
- 上一篇: 红旗hs5变速箱是什么牌子
- 下一篇: 永修到姜堰汽车司机电话多少?