java php js_【javascript/PHP】当一个JavaScripter初次进入PHP的世界,他将看到这样的风景...
本文將從以下11點(diǎn)介紹javascript和PHP在基礎(chǔ)語(yǔ)法和基本操作上的異同:
1.數(shù)據(jù)類(lèi)型的異同
2.常量和變量的定義的不同,字符串連接運(yùn)算符不同
3.對(duì)象的創(chuàng)建方法的不同
4.PHP與JS在變量聲明提升和函數(shù)聲明提升的差異
5.var在JS和PHP中使用的差異
6.PHP和JS在訪問(wèn)對(duì)象屬性時(shí)候使用的操作符不同
7.類(lèi)型檢測(cè)的方式不同
8.論P(yáng)HP和JS打印變量的方式的對(duì)比
9.PHP和JS中函數(shù)作用域和全局作用域的關(guān)系
10.引用傳遞還是值傳遞?
11.JS和PHP對(duì) “數(shù)組 ==數(shù)組”這一表達(dá)式截然不同的對(duì)待
1.數(shù)據(jù)類(lèi)型不同
JS:基本類(lèi)型:string,number,boolean,null,undefined 引用類(lèi)型:object, array,function,
(date,RegExp)
PHP:標(biāo)量類(lèi)型:string,float,integer,Boolean,復(fù)合類(lèi)型:object,array 特殊類(lèi)型:null,Resource
【注意】
? PHP里沒(méi)有Function類(lèi)型和undefined類(lèi)型!雖然PHP定義和使用的函數(shù)和JS類(lèi)似,但在這里函數(shù)在類(lèi)型上只能歸為Object類(lèi)型。同時(shí)undefined類(lèi)型也是不存在的
? Resource即資源類(lèi)型變量,它保存有為打開(kāi)文件、數(shù)據(jù)庫(kù)連接、圖形畫(huà)布區(qū)域等的特殊句柄
2.常量和變量的定義不同,字符串連接運(yùn)算符不同
對(duì)JS變量定義:var A =1 或let A =1; 常量定義:const A = 1;(ES6)
對(duì)PHP變量定義:在變量名稱(chēng)前加$ 常量定義: define(變量名稱(chēng)[字符串], $value[常量的值])
$b = '我是變量'//定義變量
?>
【注意】在PHP中使用變量和常量的區(qū)別在于變量在需要在前面加$,常量不需要
字符串連接要用“.”操作符而不是“+”操作符
JS:var str = '外婆的' + '彭湖灣';
PHP:在PHP中連接字符串時(shí)候,我們不能像JS中使用我們喜聞樂(lè)見(jiàn)的“+”運(yùn)算符了
運(yùn)行結(jié)果:
如你所見(jiàn),當(dāng)你試圖這樣做的時(shí)候,它只會(huì)返回0
而當(dāng)你改成:
3.對(duì)象的創(chuàng)建方法不同——在PHP中你無(wú)法使用在JS中司空見(jiàn)慣的對(duì)象字面量
JS中你可以這樣定義對(duì)象var person = {name:'penghwuan'}
在PHP中上述做法是種語(yǔ)法錯(cuò)誤:
如果你非要用對(duì)象字面量呢?你可能要這樣用:(下面只是示范,不推薦)
$obj = json_decode($obj_text);//將字符串解析成JSON對(duì)象
var_dump($obj);//打印對(duì)象
?>
運(yùn)行結(jié)果:
那么在PHP中應(yīng)該怎么創(chuàng)建對(duì)象呢?——定義一個(gè)類(lèi)并實(shí)例化對(duì)象
var $hometown = '廣東梅州';//定義方法
public functionget_name(){return $this->name;
}
}$person = new obj;//實(shí)例化對(duì)象
$hometown = $person->hometown;//通過(guò)對(duì)象訪問(wèn)成員變量
$name = $person->get_name();//通過(guò)對(duì)象調(diào)用方法
echo '我叫'.$name;echo "
";echo '我來(lái)自'.$hometown;?>
4.變量聲明提升和函數(shù)聲明提升
JS中最讓我們印象深刻的特點(diǎn)是它變量聲明提升和函數(shù)聲明提升的特點(diǎn),在解析所有代碼前,編譯器會(huì)優(yōu)先將所有的函數(shù)聲明和變量聲明執(zhí)行一遍,然后再執(zhí)行具體的代碼。
JS:存在變量和函數(shù)聲明提升
首先先說(shuō)一下變量聲明提升,而在這之前,先問(wèn)大家一個(gè)問(wèn)題,如果我們輸出一個(gè)沒(méi)有定義的變量會(huì)怎么樣?
運(yùn)行:
沒(méi)錯(cuò),會(huì)拋出變量未定義的錯(cuò)誤。如果我在輸出語(yǔ)句的下方加個(gè)聲明呢?
var bless = '雞年大吉'
根據(jù)猜測(cè),可能的結(jié)果三種:
1還是報(bào)錯(cuò)
2打印undefined
3打印“雞年大吉”
demo:
結(jié)果是undefined,已經(jīng)不會(huì)報(bào)錯(cuò)了,但也并沒(méi)有被賦值為“雞年大吉”,這告訴我們兩個(gè)結(jié)論:
1.JS中存在變量聲明提升,var聲明的變量會(huì)被提升至代碼頂部執(zhí)行(在下方聲明后不報(bào)未定義的錯(cuò)了)
2.JS中雖然存在變量聲明提升,但賦值操作卻不能被提升(輸出undefined而不是雞年大吉)
根據(jù)上述兩點(diǎn)的結(jié)論,
console.log(bless);//輸出一個(gè)尚且不存在的變量
var bless = '雞年大吉'
等價(jià)于:
var bless;//變量聲明被提升
console.log(bless);//輸出一個(gè)尚且不存在的變量
bless = '雞年大吉';//賦值操作未被提升
再說(shuō)一下函數(shù)變量提升:
console.log('祝你雞年大吉吧!')
}
在聲明一個(gè)函數(shù)前調(diào)用這個(gè)函數(shù)
這就是函數(shù)聲明提升
PHP:對(duì)PHP,存在函數(shù)聲明提升,但不存在變量聲明提升,讓我們看一下下面這個(gè)例子:
send_bless();//提前調(diào)用函數(shù)
$bless = '雞年大吉';//定義變量
function send_bless(){//通過(guò)聲明方式定義函數(shù)
echo '祝你雞年大吉吧'."
";
}?>
結(jié)果是什么呢?
這告訴我們,PHP里面存在函數(shù)聲明提升,而不存在變量聲明提升
5.關(guān)于var——在PHP中,你差不多可以忘記var了
我相信這三個(gè)var字母已經(jīng)被無(wú)數(shù)JSer書(shū)寫(xiě)過(guò)無(wú)數(shù)次了,但在PHP中還能不能用var呢?能!但var已經(jīng)被“打入冷宮,淪為擺設(shè)”
JS: var 變量 = 變量值
PHP:在PHP中var只能放在類(lèi)中,起到聲明成員變量的作用,放在類(lèi)以外的地方就會(huì)報(bào)錯(cuò):
運(yùn)行:
在類(lèi)中使用就不會(huì)報(bào)錯(cuò)啦!
}$me = newPerson();echo $me->word;?>
6.訪問(wèn)對(duì)象屬性時(shí)候使用的操作符不同
JS:使用“.”操作符
var obj = {name:'彭湖灣'};
console.log(obj.name);
PHP:使用“->”操作符
}
}$me = newPerson();echo $me->word;//通過(guò)->訪問(wèn)對(duì)象中的成員變量
echo "
";echo $me->echo_word();//通過(guò)->調(diào)用對(duì)象中的方法?>
7.類(lèi)型檢測(cè)的方法不同
在類(lèi)型檢測(cè)的方法中,我們一般將方法分成兩個(gè)思路:
思路1:檢測(cè)變量屬于哪種類(lèi)型。(返回string)
思路2:檢測(cè)變量是否屬于給定類(lèi)型,(返回boolean)
基于這一思路我來(lái)闡述JS和PHP的類(lèi)型檢測(cè)機(jī)制:
對(duì)JS:
思路1:typeof 變量 檢測(cè)變量類(lèi)型,能夠檢測(cè)所有JS基本類(lèi)型(除了null),也能檢測(cè)出引用類(lèi)型中的function和Object,缺陷:不能檢測(cè)出Array和普通對(duì)象,而會(huì)把它們都檢測(cè)為Object
var number =1,str ='字符串',bool =true,null_value = null,undefined_value =undefined;var fuc = function(){}, array = [1,2,3],obj ={};
console.log('number的類(lèi)型是',typeofnumber);
console.log('str的類(lèi)型是',typeofstr);
console.log('null_value的類(lèi)型是',typeofnull_value);
console.log('undefined_value的類(lèi)型是',typeofundefined_value);
console.log('fuc的類(lèi)型是',typeoffuc);
console.log('array的類(lèi)型是',typeofarray);
console.log('obj的類(lèi)型是',typeofobj);
從上面的例子可看出typeof的缺陷所在:不能檢測(cè)出Array和普通對(duì)象,而會(huì)把它們都檢測(cè)為Object;
【吐槽】:正所謂學(xué)而不思則罔,就在復(fù)習(xí)這個(gè)知識(shí)點(diǎn)的時(shí)候,我發(fā)現(xiàn)了一個(gè)極其有趣的現(xiàn)象!:null檢測(cè)的類(lèi)型是object!!是object!!!!
我還在知乎上找到了這樣一段答案:
思路2:[變量 instanceof 類(lèi)型] 能分別檢測(cè)出array,普通object和function
var fuc = function(){}, array = [1,2,3],obj ={};
console.log('fuc的類(lèi)型是Function',fuc instanceofFunction);
console.log('array的類(lèi)型是Array',array instanceofArray);
console.log('obj的類(lèi)型是Object',obj instanceofObject);
console.log('fuc的類(lèi)型是Object',fuc instanceofObject);
console.log('array的類(lèi)型是Object',array instanceofObject);
對(duì)PHP:
思路1:gettype(變量) 能區(qū)分出任意數(shù)據(jù)類(lèi)型
echo "
";var_dump(gettype($array_test));//檢測(cè)數(shù)組
echo "
";var_dump(gettype($string_test));//檢測(cè)字符串
echo "
";var_dump(gettype($int_test));//檢測(cè)數(shù)組
echo "
";var_dump(gettype($float_test));//檢測(cè)字符串
?>
思路2:is_array()、is_bool()、is_float()、is_integer()、is_null()、is_numeric()、is_object()能檢測(cè)任意數(shù)據(jù)類(lèi)型
echo "
";var_dump(is_array($array_test));//檢測(cè)數(shù)組
echo "
";var_dump(is_string($string_test));//檢測(cè)字符串
echo "
";var_dump(is_integer($int_test));//檢測(cè)數(shù)組
echo "
";var_dump(is_float($float_test));//檢測(cè)字符串
echo "
";var_dump(is_numeric("12"));//檢測(cè)是否為數(shù)字字符串或數(shù)字
echo "
";?>
8.論打印變量的方式:
JS:console.log()打印基本類(lèi)型的值,遇到對(duì)象或數(shù)組則打印對(duì)象屬性或數(shù)組元素
PHP:一般有幾種選擇方式:
1.echo(注意這TM可能是個(gè)坑):只能打印標(biāo)量:數(shù)字,字符串或布爾值,打印object或Array會(huì)報(bào)錯(cuò),而且打印布爾值的時(shí)候true打印1,false時(shí)候什么也不打印
2.var_dump打印更詳細(xì)變量的類(lèi)型和值,它在打印object或者array的時(shí)候,會(huì)連數(shù)組元素的類(lèi)型和值也打印出來(lái)(更暖更貼心)
? echo:
讓我們來(lái)看看為什么我說(shuō)它是個(gè)坑:
打印Array時(shí)報(bào)類(lèi)型轉(zhuǎn)換的警告,但仍能打印類(lèi)型:
打印object直接報(bào)錯(cuò),連類(lèi)型也不打印:
打印布爾值的時(shí)候若為true則打印1,若為false啥也不打印
<?php $true_value = true;$false_value =false;echo $true_value;echo "
";echo $false_value;?>
var_dump相比起來(lái)就良心多了:
}
}$obj = newclass_test();$array_test = [1,2,3];$string_test = '字符串';$int_test = 1;$float_test = 1.2;var_dump($obj);//檢測(cè)對(duì)象
echo "
";var_dump($array_test);//檢測(cè)數(shù)組
echo "
";var_dump($string_test);//檢測(cè)字符串
echo "
";var_dump($int_test);//檢測(cè)整型
echo "
";var_dump($float_test);//檢測(cè)浮點(diǎn)型
echo "
";?>
業(yè)界良心有沒(méi)有!
9.與JS相比,PHP沒(méi)有作用域鏈的概念。
和JS一樣,PHP也把作用域劃分為函數(shù)作用域和全局作用域。但是由于PHP沒(méi)有作用域鏈,所以函數(shù)作用域中不能訪問(wèn)全局作用域中的變量
JS:函數(shù)作用域能訪問(wèn)全局作用域中的變量,全局作用域不能訪問(wèn)函數(shù)作用域中的變量:
1函數(shù)作用域(最外層)能訪問(wèn)全局作用域中的變量
var global_variable = '全局變量';functionfuc(){
console.log(global_variable);
}
fuc();
運(yùn)行結(jié)果:
2全局作用域不能訪問(wèn)函數(shù)作用域中的變量:
functionfuc(){var area_variable = '局部變量'}
fuc();
console.log(area_variable);
運(yùn)行:
PHP:函數(shù)作用域(最外層)不能訪問(wèn)全局作用域中的變量,全局作用域也不能訪問(wèn)函數(shù)作用域中的變量
函數(shù)作用域不能訪問(wèn)全局作用域中的變量【友情提示:各位JSer不要因?yàn)閷?xiě)了太多JS就以為所有的語(yǔ)言都有作用域鏈哦~】
$variable = '變量';functionfuc (){echo $variable;
}
fuc();?>
全局作用域也不能訪問(wèn)函數(shù)作用域中的變量(這是當(dāng)然的啦):
functionfuc (){$variable = '函數(shù)作用域中變量';
}
fuc();echo $variable;?>
所以,PHP中兩個(gè)作用域間的訪問(wèn)只能通過(guò)函數(shù)參數(shù)這一個(gè)“接口”
【一張圖總結(jié)以上內(nèi)容】
10.使用函數(shù)參數(shù)時(shí),為引用傳遞還是值傳遞?
JS:只有值傳遞,沒(méi)有引用傳遞(注意是只有值傳遞)
對(duì)于基本類(lèi)型只有值傳遞
functionaddNum(value){return value = value +1;
}var my_value = 1;
addNum(my_value);
console.log(my_value);
輸出為1而不是2,這說(shuō)明,在運(yùn)行函數(shù)fuc時(shí)候,僅僅是把my_value的值拷貝給一個(gè)新創(chuàng)建的局部變量value而已,然后對(duì)這個(gè)新變量進(jìn)行操作,而不是針對(duì)原來(lái)定義的value變量
對(duì)于引用類(lèi)型也只有值傳遞!【這點(diǎn)極易混淆!】:
在上面的例子中,可能容易讓我們形成一種錯(cuò)誤的概念,即值傳遞 == 對(duì)傳入變量不會(huì)有影響,那是不是這樣呢?
functionchange_obj_name(obj){
obj.name= '不是彭湖灣'}var my_obj = {name:'彭湖灣'};
change_obj_name(my_obj);
console.log(my_obj.name);
運(yùn)行結(jié)果:
可能有人會(huì)想:怎么調(diào)用函數(shù)時(shí)對(duì)象的名稱(chēng)被修改了?!!不是說(shuō)好了JS是值傳遞嗎?
對(duì)!JS是值傳遞,但在這里,傳遞的參數(shù)并不是對(duì)象,而是對(duì)象的地址(或引用)!!也就是說(shuō)雖然存儲(chǔ)my_obj對(duì)象地址的變量把值傳遞給了函數(shù)中創(chuàng)建的局部變量obj(值傳遞),但這兩者仍然指向堆內(nèi)存中的同一個(gè)對(duì)象,所以上述例子中對(duì)象的值才被修改了。
PHP:既有值傳遞,也有引用傳遞(定義函數(shù)時(shí),function fuc($value){}是值傳遞,function fuc(&$value){}是引用傳遞)
先說(shuō)說(shuō)值傳遞:
}$num = 1;echo $num.' 是修改前的num';
add_num($num);echo "
";echo $num.' 是修改后的num';?>
再說(shuō)說(shuō)PHP引用傳遞:(習(xí)慣C語(yǔ)言的同學(xué)應(yīng)該很熟悉吧,其實(shí)就在參數(shù)前加個(gè)&而已啦。。。)
}$num = 1;echo $num.' 是修改前的num';
add_num($num);echo "
";echo $num.' 是修改后的num';?>
11.比較數(shù)組相等時(shí),對(duì)待==運(yùn)算符和===運(yùn)算符截然不同的表現(xiàn)
先上結(jié)論:
對(duì)JS,數(shù)組==數(shù)組(或===)比較的是兩個(gè)數(shù)組的地址,而對(duì)PHP,數(shù)組==數(shù)組(或===)比較的是兩個(gè)數(shù)組的“內(nèi)容”
? js
var array1 =[1,2,3];var array2 =[1,2,3];
console.log('兩個(gè)數(shù)組是否相等?',array1 ==array2);
console.log('兩個(gè)數(shù)組是否恒等?',array1 ==array2);
即使“內(nèi)容”相等,兩個(gè)數(shù)組也不相等,這說(shuō)明對(duì)JS,數(shù)組==數(shù)組(或===)比較的是兩個(gè)數(shù)組的地址
? php:
【吐槽】:作為一名寫(xiě)JS的剛寫(xiě)到這里不禁說(shuō)了句“臥槽!居然相等!”;
當(dāng)然,作為一名寫(xiě)JS的,你很容易理解在PHP中數(shù)組==數(shù)組和數(shù)組===數(shù)組的區(qū)別,
對(duì)數(shù)組==數(shù)組:各個(gè)數(shù)組項(xiàng)對(duì)應(yīng)的值相等,類(lèi)型可以不同,例如“12”和12是相等的
對(duì)數(shù)組===數(shù)組,各個(gè)數(shù)組項(xiàng)對(duì)應(yīng)的相等,類(lèi)型也相同,“12”和12不相等!
總結(jié)
以上是生活随笔為你收集整理的java php js_【javascript/PHP】当一个JavaScripter初次进入PHP的世界,他将看到这样的风景...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 卡尔曼_卡尔曼滤波最完整公式推导
- 下一篇: bool python 运算_pytho