本文将从以下11点介绍javascript和PHP在基础语法和基本操作上的异同:
1.数据类型的异同
2.常量和变量的定义的不同,字符串连接运算符不同
3.对象的创建方法的不同
4.PHP与JS在变量声明提升和函数声明提升的差异
5.var在JS和PHP中使用的差异
6.PHP和JS在访问对象属性时候使用的操作符不同
7.类型检测的方式不同
8.论PHP和JS打印变量的方式的对比
9.PHP和JS中函数作用域和全局作用域的关系
10.引用传递还是值传递?
11.JS和PHP对 “数组 ==数组”这一表达式截然不同的对待
 
1.数据类型不同
JS基本类型:string,number,boolean,null,undefined 引用类型:object, array,function,
(date,RegExp)
PHP:标量类型:string,float,integer,Boolean,复合类型:object,array 特殊类型:null,Resource
【注意】
• PHP里没有Function类型和undefined类型!虽然PHP定义和使用的函数和JS类似,但在这里函数在类型上只能归为Object类型。同时undefined类型也是不存在的
• Resource即资源类型变量,它保存有为打开文件、数据库连接、图形画布区域等的特殊句柄
 
2.常量和变量的定义不同,字符串连接运算符不同
对JS变量定义:var A =1 或let A =1; 常量定义:const A = 1;(ES6)
对PHP变量定义:在变量名称前加$ 常量定义: define(变量名称[字符串], $value[常量的值])
<?php
define('a', '我是常量');//定义常量
$b = '我是变量'//定义变量
?>
【注意】在PHP中使用变量和常量的区别在于变量在需要在前面加$,常量不需要
 
字符串连接要用“.”操作符而不是“+”操作符
JS:var str = '外婆的' + '彭湖湾';
PHP:在PHP中连接字符串时候,我们不能像JS中使用我们喜闻乐见的“+”运算符了
<?php
var_dump( '外婆的'+'彭湖湾');
?>
运行结果:
 
如你所见,当你试图这样做的时候,它只会返回0
而当你改成:
<?php
var_dump( '外婆的'.'彭湖湾');
?>
 
 
 
3.对象的创建方法不同——在PHP中你无法使用在JS中司空见惯的对象字面量
JS中你可以这样定义对象var person = {name:'penghwuan'}
在PHP中上述做法是种语法错误:
<?php
$obj = {name:'penghwuan'};
var_dump($obj);
?>
 

如果你非要用对象字面量呢?你可能要这样用:(下面只是示范,不推荐)
<?php
$obj_text = '{"name":"penghwuan"}';//定义一个字面量形式的字符串
$obj = json_decode($obj_text);//将字符串解析成JSON对象
var_dump($obj);//打印对象
?>

运行结果:

那么在PHP中应该怎么创建对象呢?——定义一个类并实例化对象
<?php
class obj {
var $name = '彭湖湾';//定义成员变量
var $hometown = '广东梅州';//定义方法
public function get_name(){
return $this->name;
}
}
$person = new obj;//实例化对象
$hometown = $person->hometown;//通过对象访问成员变量
$name = $person->get_name();//通过对象调用方法
echo '我叫'.$name;
echo "<br/>";
echo '我来自'.$hometown;
?>

4.变量声明提升和函数声明提升
JS中最让我们印象深刻的特点是它变量声明提升和函数声明提升的特点,在解析所有代码前,编译器会优先将所有的函数声明和变量声明执行一遍,然后再执行具体的代码。
JS:存在变量和函数声明提升
首先先说一下变量声明提升,而在这之前,先问大家一个问题,如果我们输出一个没有定义的变量会怎么样?
<script type="text/javascript">
console.log(bless);//输出一个尚且不存在的变量
</script>
运行:
没错,会抛出变量未定义的错误。如果我在输出语句的下方加个声明呢?
<script type="text/javascript">
console.log(bless);//输出一个尚且不存在的变量
var bless = '鸡年大吉'
</script>
根据猜测,可能的结果三种:
1还是报错
2打印undefined
3打印“鸡年大吉”
 
demo:
结果是undefined,已经不会报错了,但也并没有被赋值为“鸡年大吉”,这告诉我们两个结论:
1.JS中存在变量声明提升,var声明的变量会被提升至代码顶部执行(在下方声明后不报未定义的错了)
2.JS中虽然存在变量声明提升,但赋值操作却不能被提升(输出undefined而不是鸡年大吉)
根据上述两点的结论,
console.log(bless);//输出一个尚且不存在的变量
var bless = '鸡年大吉'
等价于:
var bless;//变量声明被提升
console.log(bless);//输出一个尚且不存在的变量
bless = '鸡年大吉';//赋值操作未被提升
再说一下函数变量提升:
<script type="text/javascript">
send_bless();
function send_bless(){
console.log('祝你鸡年大吉吧!')
}
</script>
在声明一个函数前调用这个函数
这就是函数声明提升
 
PHP:对PHP,存在函数声明提升,但不存在变量声明提升,让我们看一下下面这个例子:
<?php
echo $bless;//提前输出变量
send_bless();//提前调用函数
$bless = '鸡年大吉';//定义变量
function send_bless(){//通过声明方式定义函数
echo '祝你鸡年大吉吧'."<br/>";
}
?>
结果是什么呢?
 
这告诉我们,PHP里面存在函数声明提升,而不存在变量声明提升
 
5.关于var——在PHP中,你差不多可以忘记var了
我相信这三个var字母已经被无数JSer书写过无数次了,但在PHP中还能不能用var呢?能!但var已经被“打入冷宫,沦为摆设”
JS: var 变量 = 变量值
PHP:在PHP中var只能放在类中,起到声明成员变量的作用,放在类以外的地方就会报错:
<?php
var $word = '算法要学好';
echo $word;
?>
运行:
 
在类中使用就不会报错啦!
<?php
class Person{
var $word ='算法要学好';
}
$me = new Person();
echo $me->word;
?>

 
6.访问对象属性时候使用的操作符不同
JS:使用“.”操作符
<script type="text/javascript">
var obj = {name:'彭湖湾'};
console.log(obj.name);
</script>
PHP:使用“->”操作符
<?php
class Person{
var $word ='算法要学好';
function echo_word(){
echo '数据结构也很重要';
}
}
$me = new Person();
echo $me->word;//通过->访问对象中的成员变量
echo "<br/>";
echo $me->echo_word();//通过->调用对象中的方法
?>

7.类型检测的方法不同
在类型检测的方法中,我们一般将方法分成两个思路:
思路1:检测变量属于哪种类型。(返回string)
思路2:检测变量是否属于给定类型,(返回boolean)
基于这一思路我来阐述JS和PHP的类型检测机制:
对JS:
思路1:typeof 变量 检测变量类型,能够检测所有JS基本类型(除了null),也能检测出引用类型中的function和Object,缺陷:不能检测出Array和普通对象,而会把它们都检测为Object
<script type="text/javascript">
var number =1,str ='字符串',bool =true,null_value = null,undefined_value =undefined;
var fuc = function(){}, array = [1,2,3],obj ={};
console.log('number的类型是',typeof number);
console.log('str的类型是',typeof str);
console.log('null_value的类型是',typeof null_value);
console.log('undefined_value的类型是',typeof undefined_value);
console.log('fuc的类型是',typeof fuc);
console.log('array的类型是',typeof array);
console.log('obj的类型是',typeof obj);
</script>

从上面的例子可看出typeof的缺陷所在:不能检测出Array和普通对象,而会把它们都检测为Object;
 
【吐槽】:正所谓学而不思则罔,就在复习这个知识点的时候,我发现了一个极其有趣的现象!:null检测的类型是object!!是object!!!!
我还在知乎上找到了这样一段答案:
 

思路2:[变量 instanceof 类型] 能分别检测出array,普通object和function
<script type="text/javascript">
var fuc = function(){}, array = [1,2,3],obj ={};
console.log('fuc的类型是Function',fuc instanceof Function);
console.log('array的类型是Array',array instanceof Array);
console.log('obj的类型是Object',obj instanceof Object);
console.log('fuc的类型是Object',fuc instanceof Object);
console.log('array的类型是Object',array instanceof Object);
</script>
 
对PHP:
 
思路1:gettype(变量) 能区分出任意数据类型

<?php
class class_test{};
$obj = new class_test();
$array_test = [1,2,3];
$string_test = '字符串';
$int_test = 1;
$float_test = 1.2;
var_dump(gettype($obj));//检测对象
echo "<br/>";
var_dump(gettype($array_test));//检测数组
echo "<br/>";
var_dump(gettype($string_test));//检测字符串
echo "<br/>";
var_dump(gettype($int_test));//检测数组
echo "<br/>";
var_dump(gettype($float_test));//检测字符串
?>

思路2:is_array()、is_bool()、is_float()、is_integer()、is_null()、is_numeric()、is_object()能检测任意数据类型
<?php
class class_test{};
$obj = new class_test();
$array_test = [1,2,3];
$string_test = '字符串';
$int_test = 1;
$float_test = 1.2;
var_dump(is_object($obj));//检测对象
echo "<br/>";
var_dump(is_array($array_test));//检测数组
echo "<br/>";
var_dump(is_string($string_test));//检测字符串
echo "<br/>";
var_dump(is_integer($int_test));//检测数组
echo "<br/>";
var_dump(is_float($float_test));//检测字符串
echo "<br/>";
var_dump(is_numeric("12"));//检测是否为数字字符串或数字
echo "<br/>";
?>
 
8.论打印变量的方式:
JS:console.log()打印基本类型的值,遇到对象或数组则打印对象属性或数组元素
PHP:一般有几种选择方式:
1.echo(注意这TM可能是个坑):只能打印标量:数字,字符串或布尔值,打印object或Array会报错,而且打印布尔值的时候true打印1,false时候什么也不打印
2.var_dump打印更详细变量的类型和值,它在打印object或者array的时候,会连数组元素的类型和值也打印出来(更暖更贴心)
 
• echo:
让我们来看看为什么我说它是个坑:
打印Array时报类型转换的警告,但仍能打印类型
<?php
$array = [1,2,3];
echo $array;
?> 
打印object直接报错,连类型也不打印:
<?php
class person{};
$obj = new person();
echo $obj;
?> 
打印布尔值的时候若为true则打印1,若为false啥也不打印
<?php
$true_value = true;
$false_value =false;
echo $true_value;
echo "<br/>";
echo $false_value;
?>

var_dump相比起来就良心多了:
<?php
class class_test{
var $value = '我是变量';
public function fuc(){
echo '我是方法';
}
}
$obj = new class_test();
$array_test = [1,2,3];
$string_test = '字符串';
$int_test = 1;
$float_test = 1.2;
var_dump($obj);//检测对象
echo "<br/>";
var_dump($array_test);//检测数组
echo "<br/>";
var_dump($string_test);//检测字符串
echo "<br/>";
var_dump($int_test);//检测整型
echo "<br/>";
var_dump($float_test);//检测浮点型
echo "<br/>";
?>

业界良心有没有!
 
9.与JS相比,PHP没有作用域链的概念。
和JS一样,PHP也把作用域划分为函数作用域和全局作用域。但是由于PHP没有作用域链,所以函数作用域中不能访问全局作用域中的变量
JS:函数作用域能访问全局作用域中的变量,全局作用域不能访问函数作用域中的变量:
1函数作用域(最外层)能访问全局作用域中的变量
<script type="text/javascript">
var global_variable = '全局变量' ;
function fuc(){
console.log(global_variable);
}
fuc();
</script>
运行结果:
2全局作用域不能访问函数作用域中的变量:
<script type="text/javascript">
function fuc(){
var area_variable = '局部变量'
}
fuc();
console.log(area_variable);
</script>
运行:

PHP:函数作用域(最外层)不能访问全局作用域中的变量,全局作用域也不能访问函数作用域中的变量
函数作用域不能访问全局作用域中的变量【友情提示:各位JSer不要因为写了太多JS就以为所有的语言都有作用域链哦~】
<?php
//在这里我们试图在函数作用域内访问全局作用域的变量
$variable = '变量';
function fuc (){
echo $variable;
}
fuc();
?>
全局作用域也不能访问函数作用域中的变量(这是当然的啦):
<?php
//在这里我们试图在全局作用域内访问函数作用域的变量
function fuc (){
$variable = '函数作用域中变量';
}
fuc();
echo $variable;
?>

所以,PHP中两个作用域间的访问只能通过函数参数这一个“接口”
 
【一张图总结以上内容】
 
10.使用函数参数时,为引用传递还是值传递?
JS:只有值传递,没有引用传递(注意是只有值传递)
对于基本类型只有值传递
<script type="text/javascript">
function addNum(value){
return value = value +1;
}
var my_value = 1;
addNum(my_value);
console.log(my_value);
</script>
输出为1而不是2,这说明,在运行函数fuc时候,仅仅是把my_value的值拷贝给一个新创建的局部变量value而已,然后对这个新变量进行操作,而不是针对原来定义的value变量
 
对于引用类型也只有值传递!【这点极易混淆!】:
在上面的例子中,可能容易让我们形成一种错误的概念,即值传递 == 对传入变量不会有影响,那是不是这样呢?

<script type="text/javascript">
function change_obj_name(obj){
obj.name = '不是彭湖湾'
}
var my_obj = {name:'彭湖湾'};
change_obj_name(my_obj);
console.log(my_obj.name);
</script>
运行结果:
可能有人会想:怎么调用函数时对象的名称被修改了?!!不是说好了JS是值传递吗?
对!JS是值传递,但在这里,传递的参数并不是对象,而是对象的地址(或引用)!!也就是说虽然存储my_obj对象地址的变量把值传递给了函数中创建的局部变量obj(值传递),但这两者仍然指向堆内存中的同一个对象,所以上述例子中对象的值才被修改了。
 
PHP:既有值传递,也有引用传递(定义函数时,function fuc($value){}是值传递,function fuc(&$value){}是引用传递)
先说说值传递:
<?php
function add_num($value){
$value = $value + 1;
}
$num = 1;
echo $num.' 是修改前的num';
add_num($num);
echo "<br/>";
echo $num.' 是修改后的num';
?>

再说说PHP引用传递:(习惯C语言的同学应该很熟悉吧,其实就在参数前加个&而已啦。。。)
<?php
function add_num(&$value){
$value = $value + 1;
}
$num = 1;
echo $num.' 是修改前的num';
add_num($num);
echo "<br/>";
echo $num.' 是修改后的num';
?>
 

11.比较数组相等时,对待==运算符和===运算符截然不同的表现
先上结论:
对JS,数组==数组(或===)比较的是两个数组的地址,而对PHP,数组==数组(或===)比较的是两个数组的“内容”
 
• js
<script type="text/javascript">
var array1 =[1,2,3];
var array2 =[1,2,3];
console.log('两个数组是否相等?',array1 == array2);
console.log('两个数组是否恒等?',array1 == array2);
</script>
即使“内容”相等,两个数组也不相等,这说明对JS,数组==数组(或===)比较的是两个数组的地址
• php:
<?php
$array1 = [1,2,3];
$array2 = [1,2,3];
var_dump($array1 == $array2);
?>
 

【吐槽】:作为一名写JS的刚写到这里不禁说了句“卧槽!居然相等!”;
当然,作为一名写JS的,你很容易理解在PHP中数组==数组和数组===数组的区别,
对数组==数组:各个数组项对应的值相等,类型可以不同,例如“12”和12是相等的
对数组===数组,各个数组项对应的相等,类型也相同,“12”和12不相等!
<?php
$array1 = [1,2,3];
$array2 = [1,'2',3];
echo "数组相等 ";
var_dump($array1 == $array2);
echo "数组恒等";
var_dump($array1 === $array2);
?>

当一个JavaScripter初次进入PHP的世界,他将看到这样的风景的更多相关文章

  1. 【javascript/PHP】当一个JavaScripter初次进入PHP的世界,他将看到这样的风景

     本文将从以下11点介绍javascript和PHP在基础语法和基本操作上的异同: 1.数据类型的异同 2.常量和变量的定义的不同,字符串连接运算符不同 3.对象的创建方法的不同 4.PHP与JS在变 ...

  2. 当React开发者初次走进React-Native的世界

    RN千机变 1.技术体系问题 RN和React共用一套抽象层,相对于前端,RN其实更接近Node的运行环境 ReactNative =React +IOS +Android 看RN文档时,我会发现入门 ...

  3. 一个可能是世界上最全的 API 接口集合库开源项目

    对于程序员来说,为自己的程序选择一些合适的API并不是那么简单,有时候还会把你搞得够呛,今天猿妹要和大家分享一个开源项目,这个项目汇集了各种开发的api,涵盖了音乐.新闻.书籍.日历等,无论你是从事W ...

  4. 精通Web Analytics 2.0 (5) 第三章:点击流分析的奇妙世界:指标

    精通Web Analytics 2.0 : 用户中心科学与在线统计艺术 第三章:点击流分析的奇妙世界:指标 新的Web Analytics 2.0心态:搞定它.新的闪亮系列工具:是的.准备好了吗?当然 ...

  5. 【Bugly干货分享】一起用 HTML5 Canvas 做一个简单又骚气的粒子引擎

    Bugly 技术干货系列内容主要涉及移动开发方向,是由Bugly邀请腾讯内部各位技术大咖,通过日常工作经验的总结以及感悟撰写而成,内容均属原创,转载请标明出处. 前言 好吧,说是“粒子引擎”还是大言不 ...

  6. 【移动适配】一个像素的border怎么实现

    一个像素里复杂纷扰的世界 文 | 啃先生 Mar.3rd.2016  首发于微信公众号(啃先生) 上一篇发了<[移动适配]移动Web怎么做屏幕适配> 壹 | Fisrt 在CSS的世界里P ...

  7. 一起用HTML5 canvas做一个简单又骚气的粒子引擎

    前言 好吧,说是"粒子引擎"还是大言不惭而标题党了,离真正的粒子引擎还有点远.废话少说,先看demo 本文将教会你做一个简单的canvas粒子制造器(下称引擎). 世界观 这个简单 ...

  8. NeHe OpenGL教程 第十课:3D世界

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  9. 嵌入式Linux开发系列之一: 走进嵌入式Linux的世界

    转载:http://www.ibm.com/developerworks/cn/linux/l-embed/part1/index.html   随着信息化技术的发展和数字化产品的普及,以计算机技术. ...

随机推荐

  1. xml转义符

    今天在看项目的UrlRewriteFilter(动态url静态化,有利于搜索引擎搜索)的配置文件urlrewrite.xml时,看到了“&”字符,查询之后才知道xml文件中的转义比html中的 ...

  2. STM32位带操作总结---浅显易懂

    正在准备做毕业设计,配置LED_Config()的时候,又看到了位带操作的宏定义,我又嘀咕了,什么是位带操作,一年前在使用位带操作的时候,就查阅过好多资料,Core-M3也看过,但是对于博主这种“低能 ...

  3. Luogu2723丑数Humble Numbers【归并排序】

    Luogu2723丑数Humble Numbers 题目背景 对于一给定的素数集合 S = {p1, p2, ..., pK},考虑一个正整数集合,该集合中任一元素的质因数全部属于S.这个正整数集合包 ...

  4. 老李推荐:第8章5节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-运行测试脚本

    老李推荐:第8章5节<MonkeyRunner源码剖析>MonkeyRunner启动运行过程-运行测试脚本   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化 ...

  5. 老李分享:《Linux Shell脚本攻略》 要点(八)

    老李分享:<Linux Shell脚本攻略> 要点(八)   1.打印进程 [root@localhost program_test]# ps -e | head  PID TTY     ...

  6. php 启动过程 - reqeust RINIT 过程

    php 启动过程 - reqeust RINIT 过程 概述 apache 接收到请求之后, 交给 php 处理 php 模块在接收到请求后, 会对请求进行初始化, 及 RINIT 过程 调用触发 a ...

  7. inform表单验证,正则表达式,用户名,身份证,密码,验证码

    最近利用空闲时间写了部分表单验证,包括用户名,身份证,密码,验证码,仅为自己巩固最近所学的知识 表单的样式使用的是table布局,因为觉得DIV布局定位比较麻烦,table有三列,分别为基本信息,输入 ...

  8. linux下删除乱码文件、目录

    由于编码原因,在linux服务器上上传.创建中文文件或目录时,会产生乱码,如果想删除它,发现用rm命令是删除不了的 这种情况下,用find命令可以删除乱码的文件或目录. 首先进入乱码文件或目录所在的目 ...

  9. Python数据处理——numpy_1

    python中数据处理最基础的一个包--numpy.它能很好的进行数据准备,类似与R语言中的数据框(DataFrame)一样.今天,就来从最基础的开始学习. import numpy as npdat ...

  10. 苹果笔记本只能上QQ,微信,任何浏览器不能打开网页的问题。

    我的笔记本一共遇到过两次这种情况.第一次是浏览器输入域名打不开网页,而输入ip地址可以打开.这就是DNS服务器的问题,解决方法很简单.在系统偏好设置里面找到网络,然后,点击正在连接的网络的高级选项,选 ...