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