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

本文将从以下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对 “数组 ==数组”这一表达式截然不同的对待

de15c5f373ec89577119f2db465f0969.png

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即资源类型变量,它保存有为打开文件、数据库连接、图形画布区域等的特殊句柄

4d965ab9b97a99308259cc684cc05167.png

2.常量和变量的定义不同,字符串连接运算符不同

对JS变量定义:var A =1 或let A =1; 常量定义:const A = 1;(ES6)

对PHP变量定义:在变量名称前加$ 常量定义: define(变量名称[字符串], $value[常量的值])

$b = '我是变量'//定义变量

?>

【注意】在PHP中使用变量和常量的区别在于变量在需要在前面加$,常量不需要

字符串连接要用“.”操作符而不是“+”操作符

JS:var str = '外婆的' + '彭湖湾';

PHP:在PHP中连接字符串时候,我们不能像JS中使用我们喜闻乐见的“+”运算符了

运行结果:

c39de7deec3f4d6104564e13f5b06787.png

如你所见,当你试图这样做的时候,它只会返回0

而当你改成:

687b8149afddd81bd99c5cb6d0868deb.png

3.对象的创建方法不同——在PHP中你无法使用在JS中司空见惯的对象字面量

JS中你可以这样定义对象var person = {name:'penghwuan'}

在PHP中上述做法是种语法错误:

6511d0c74527ce73ba5081fa4fc10230.png

如果你非要用对象字面量呢?你可能要这样用:(下面只是示范,不推荐)

$obj = json_decode($obj_text);//将字符串解析成JSON对象

var_dump($obj);//打印对象

?>

运行结果:

07e1ebb3bb2c446abc9ea6c1b9c83b45.png

那么在PHP中应该怎么创建对象呢?——定义一个类并实例化对象

var $hometown = '广东梅州';//定义方法

public functionget_name(){return $this->name;

}

}$person = new obj;//实例化对象

$hometown = $person->hometown;//通过对象访问成员变量

$name = $person->get_name();//通过对象调用方法

echo '我叫'.$name;echo "
";echo '我来自'.$hometown;?>

096c042927853cd41f2377cb406c40f0.png

4.变量声明提升和函数声明提升

JS中最让我们印象深刻的特点是它变量声明提升和函数声明提升的特点,在解析所有代码前,编译器会优先将所有的函数声明和变量声明执行一遍,然后再执行具体的代码。

JS:存在变量和函数声明提升

首先先说一下变量声明提升,而在这之前,先问大家一个问题,如果我们输出一个没有定义的变量会怎么样?

运行:

2f85b5e862b2a00d0af0cac1c42eba29.png

没错,会抛出变量未定义的错误。如果我在输出语句的下方加个声明呢?

var bless = '鸡年大吉'

根据猜测,可能的结果三种:

1还是报错

2打印undefined

3打印“鸡年大吉”

demo:

8dcf606bc8535ffa10762f213783cfa9.png

结果是undefined,已经不会报错了,但也并没有被赋值为“鸡年大吉”,这告诉我们两个结论:

1.JS中存在变量声明提升,var声明的变量会被提升至代码顶部执行(在下方声明后不报未定义的错了)

2.JS中虽然存在变量声明提升,但赋值操作却不能被提升(输出undefined而不是鸡年大吉)

根据上述两点的结论,

console.log(bless);//输出一个尚且不存在的变量

var bless = '鸡年大吉'

等价于:

var bless;//变量声明被提升

console.log(bless);//输出一个尚且不存在的变量

bless = '鸡年大吉';//赋值操作未被提升

再说一下函数变量提升:

console.log('祝你鸡年大吉吧!')

}

在声明一个函数前调用这个函数

0a51fcfb3aa29b65bac561946feb4536.png

这就是函数声明提升

PHP:对PHP,存在函数声明提升,但不存在变量声明提升,让我们看一下下面这个例子:

send_bless();//提前调用函数

$bless = '鸡年大吉';//定义变量

function send_bless(){//通过声明方式定义函数

echo '祝你鸡年大吉吧'."
";

}?>

结果是什么呢?

e6d8c758d10e2667b52607345077d2ce.png

这告诉我们,PHP里面存在函数声明提升,而不存在变量声明提升

5.关于var——在PHP中,你差不多可以忘记var了

我相信这三个var字母已经被无数JSer书写过无数次了,但在PHP中还能不能用var呢?能!但var已经被“打入冷宫,沦为摆设”

JS: var 变量 = 变量值

PHP:在PHP中var只能放在类中,起到声明成员变量的作用,放在类以外的地方就会报错:

运行:

34cc19f430270eec31da7d28606a1af0.png

在类中使用就不会报错啦!

}$me = newPerson();echo $me->word;?>

4cc7ddfffeef87743e08ea851f5914cf.png

6.访问对象属性时候使用的操作符不同

JS:使用“.”操作符

var obj = {name:'彭湖湾'};

console.log(obj.name);

11a6f5fe6ecc33c2aeea3744a31bae0b.png

PHP:使用“->”操作符

}

}$me = newPerson();echo $me->word;//通过->访问对象中的成员变量

echo "
";echo $me->echo_word();//通过->调用对象中的方法?>

c8049701d193dd578ac76ab6f129fe47.png

7.类型检测的方法不同

在类型检测的方法中,我们一般将方法分成两个思路:

思路1:检测变量属于哪种类型。(返回string)

思路2:检测变量是否属于给定类型,(返回boolean)

基于这一思路我来阐述JS和PHP的类型检测机制:

对JS:

思路1:typeof 变量 检测变量类型,能够检测所有JS基本类型(除了null),也能检测出引用类型中的function和Object,缺陷:不能检测出Array和普通对象,而会把它们都检测为Object

var number =1,str ='字符串',bool =true,null_value = null,undefined_value =undefined;var fuc = function(){}, array = [1,2,3],obj ={};

console.log('number的类型是',typeofnumber);

console.log('str的类型是',typeofstr);

console.log('null_value的类型是',typeofnull_value);

console.log('undefined_value的类型是',typeofundefined_value);

console.log('fuc的类型是',typeoffuc);

console.log('array的类型是',typeofarray);

console.log('obj的类型是',typeofobj);

01015e30c3aa4e477c79c9943b7f40cd.png

从上面的例子可看出typeof的缺陷所在:不能检测出Array和普通对象,而会把它们都检测为Object;

【吐槽】:正所谓学而不思则罔,就在复习这个知识点的时候,我发现了一个极其有趣的现象!:null检测的类型是object!!是object!!!!

我还在知乎上找到了这样一段答案:

fa7335591a4dc81ea5227d87b8df74a5.png

a5dd2a501ddd3abb7dd00ed55ad46caf.png

思路2:[变量 instanceof 类型] 能分别检测出array,普通object和function

var fuc = function(){}, array = [1,2,3],obj ={};

console.log('fuc的类型是Function',fuc instanceofFunction);

console.log('array的类型是Array',array instanceofArray);

console.log('obj的类型是Object',obj instanceofObject);

console.log('fuc的类型是Object',fuc instanceofObject);

console.log('array的类型是Object',array instanceofObject);

3969a85faf382528ad511289333b6cc9.png

对PHP:

思路1:gettype(变量) 能区分出任意数据类型

echo "
";var_dump(gettype($array_test));//检测数组

echo "
";var_dump(gettype($string_test));//检测字符串

echo "
";var_dump(gettype($int_test));//检测数组

echo "
";var_dump(gettype($float_test));//检测字符串

?>

55da07150bfefb7e2dab99875054893c.png

思路2:is_array()、is_bool()、is_float()、is_integer()、is_null()、is_numeric()、is_object()能检测任意数据类型

echo "
";var_dump(is_array($array_test));//检测数组

echo "
";var_dump(is_string($string_test));//检测字符串

echo "
";var_dump(is_integer($int_test));//检测数组

echo "
";var_dump(is_float($float_test));//检测字符串

echo "
";var_dump(is_numeric("12"));//检测是否为数字字符串或数字

echo "
";?>

08433defe32571acd9b648923042933a.png

8.论打印变量的方式:

JS:console.log()打印基本类型的值,遇到对象或数组则打印对象属性或数组元素

PHP:一般有几种选择方式:

1.echo(注意这TM可能是个坑):只能打印标量:数字,字符串或布尔值,打印object或Array会报错,而且打印布尔值的时候true打印1,false时候什么也不打印

2.var_dump打印更详细变量的类型和值,它在打印object或者array的时候,会连数组元素的类型和值也打印出来(更暖更贴心)

• echo:

让我们来看看为什么我说它是个坑:

打印Array时报类型转换的警告,但仍能打印类型:

dd54439641c3ff2ebb28d12ec7e5de40.png

打印object直接报错,连类型也不打印:

275b5aa10a761f2934299a4c2bfd38f3.png

打印布尔值的时候若为true则打印1,若为false啥也不打印

<?php $true_value = true;$false_value =false;echo $true_value;echo "
";echo $false_value;?>

af07dc1ce3a1d05c1915418654742601.png

var_dump相比起来就良心多了:

}

}$obj = newclass_test();$array_test = [1,2,3];$string_test = '字符串';$int_test = 1;$float_test = 1.2;var_dump($obj);//检测对象

echo "
";var_dump($array_test);//检测数组

echo "
";var_dump($string_test);//检测字符串

echo "
";var_dump($int_test);//检测整型

echo "
";var_dump($float_test);//检测浮点型

echo "
";?>

da51050d25201cb3ca304775710dbb27.png

业界良心有没有!

9.与JS相比,PHP没有作用域链的概念。

和JS一样,PHP也把作用域划分为函数作用域和全局作用域。但是由于PHP没有作用域链,所以函数作用域中不能访问全局作用域中的变量

JS:函数作用域能访问全局作用域中的变量,全局作用域不能访问函数作用域中的变量:

1函数作用域(最外层)能访问全局作用域中的变量

var global_variable = '全局变量';functionfuc(){

console.log(global_variable);

}

fuc();

运行结果:

c43b90371bebdc00dbe577a3f3103538.png

2全局作用域不能访问函数作用域中的变量:

functionfuc(){var area_variable = '局部变量'}

fuc();

console.log(area_variable);

运行:

360d110ac0217d04ada4e36f476c426c.png

PHP:函数作用域(最外层)不能访问全局作用域中的变量,全局作用域也不能访问函数作用域中的变量

函数作用域不能访问全局作用域中的变量【友情提示:各位JSer不要因为写了太多JS就以为所有的语言都有作用域链哦~】

$variable = '变量';functionfuc (){echo $variable;

}

fuc();?>

全局作用域也不能访问函数作用域中的变量(这是当然的啦):

functionfuc (){$variable = '函数作用域中变量';

}

fuc();echo $variable;?>

5ff9d84d1016017f4cbe500511a1f8ec.png

所以,PHP中两个作用域间的访问只能通过函数参数这一个“接口”

【一张图总结以上内容】

77c34be913e5e260e0d5d3afdaa5cbd0.png

10.使用函数参数时,为引用传递还是值传递?

JS:只有值传递,没有引用传递(注意是只有值传递)

对于基本类型只有值传递

functionaddNum(value){return value = value +1;

}var my_value = 1;

addNum(my_value);

console.log(my_value);

c58bc7367967c5fde731273a66998124.png

输出为1而不是2,这说明,在运行函数fuc时候,仅仅是把my_value的值拷贝给一个新创建的局部变量value而已,然后对这个新变量进行操作,而不是针对原来定义的value变量

对于引用类型也只有值传递!【这点极易混淆!】:

在上面的例子中,可能容易让我们形成一种错误的概念,即值传递 == 对传入变量不会有影响,那是不是这样呢?

functionchange_obj_name(obj){

obj.name= '不是彭湖湾'}var my_obj = {name:'彭湖湾'};

change_obj_name(my_obj);

console.log(my_obj.name);

运行结果:

71abc6f9d2b6835e9973a714711e9d78.png

可能有人会想:怎么调用函数时对象的名称被修改了?!!不是说好了JS是值传递吗?

对!JS是值传递,但在这里,传递的参数并不是对象,而是对象的地址(或引用)!!也就是说虽然存储my_obj对象地址的变量把值传递给了函数中创建的局部变量obj(值传递),但这两者仍然指向堆内存中的同一个对象,所以上述例子中对象的值才被修改了。

PHP:既有值传递,也有引用传递(定义函数时,function fuc($value){}是值传递,function fuc(&$value){}是引用传递)

先说说值传递:

}$num = 1;echo $num.' 是修改前的num';

add_num($num);echo "
";echo $num.' 是修改后的num';?>

0b2f8e3eaf9a1236ff08fa2f6f35feb0.png

再说说PHP引用传递:(习惯C语言的同学应该很熟悉吧,其实就在参数前加个&而已啦。。。)

}$num = 1;echo $num.' 是修改前的num';

add_num($num);echo "
";echo $num.' 是修改后的num';?>

c66f2d41ded8772c6f5fe51b41b5e112.png

11.比较数组相等时,对待==运算符和===运算符截然不同的表现

先上结论:

对JS,数组==数组(或===)比较的是两个数组的地址,而对PHP,数组==数组(或===)比较的是两个数组的“内容”

• js

var array1 =[1,2,3];var array2 =[1,2,3];

console.log('两个数组是否相等?',array1 ==array2);

console.log('两个数组是否恒等?',array1 ==array2);

cfe03a0b8943184d3b2adc74edfcb5c3.png

即使“内容”相等,两个数组也不相等,这说明对JS,数组==数组(或===)比较的是两个数组的地址

• php:

d24d7dba8fdac6e536eaba2fa42ad18f.png

【吐槽】:作为一名写JS的刚写到这里不禁说了句“卧槽!居然相等!”;

当然,作为一名写JS的,你很容易理解在PHP中数组==数组和数组===数组的区别,

对数组==数组:各个数组项对应的值相等,类型可以不同,例如“12”和12是相等的

对数组===数组,各个数组项对应的相等,类型也相同,“12”和12不相等!

a21b3e4d880e980a661d3b2b2d781a83.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/558554.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从零开始学java 框架_从零开始学 Java - 搭建 Spring MVC 框架

如果创建一个 Spring 项目Spring MVC 框架在 Java 的 Web 项目中应该是无人不知的吧&#xff0c;你不会搭建一个 Spring 框架&#xff1f;作为身为一个刚刚学习Java的我都会&#xff0c;如果你不会的话&#xff0c;那可真令人忧伤。1.在 MyEclipse 创建项目后&#xff0c;可以以…

java 系统类型_Java获取操作系统类型

Java获取操作系统完整版系统枚举类&#xff1a;public enum EPlatform {Any("any"),Linux("Linux"),Mac_OS("Mac OS"),Mac_OS_X("Mac OS X"),Windows("Windows"),OS2("OS/2"),Solaris("Solaris"),SunOS…

azure mysql on vnet_管理 VNet 终结点 - Azure 门户 - Azure Database for MySQL | Microsoft Docs

您现在访问的是微软AZURE全球版技术文档网站&#xff0c;若需要访问由世纪互联运营的MICROSOFT AZURE中国区技术文档网站&#xff0c;请访问 https://docs.azure.cn.使用 Azure 门户创建和管理 Azure Database for MySQL VNet 服务终结点和 VNet 规则Create and manage Azure D…

java jmap jc_利用jmap命令查看JVM内存使用详情

介绍打印出某个java进程(使用pid)内存内的&#xff0c;所有‘对象’的情况(如&#xff1a;产生那些对象&#xff0c;及其数量)。它的用途是为了展示java进程的内存映射信息&#xff0c;或者堆内存详情。可以输出所有内存中对象的工具&#xff0c;甚至可以将VM 中的heap&#xf…

雅居乐万豪酒店java_“万豪,我心所属之地” | 上海雅居乐万豪酒店Terence Sun的实习故事...

​我叫孙庭骏&#xff0c;来自台北&#xff0c;目前就读瑞士恺撒里兹酒店管理学院&#xff0c;在来上海之前曾在瑞士苏黎世万豪酒店的餐饮部实习过两次&#xff0c;共一年的时间&#xff0c;所以万豪对我来说并不陌生。万豪一直深深吸引我的莫过于它的核心价值以及非凡待客之道…

java quartz spring_JavaLib-quartz | 基于Spring Boot Quartz开发的定时任务

基于Spring Boot Quartz开发的JavaLib-quartz&#xff0c;目的是帮你快速构建定时任务系统&#xff0c;你可以专心编写你的业务逻辑&#xff0c;而不必关注定时任务具体是如何实现的&#xff0c;他的性能如何&#xff0c;有没有异常以及异常处理&#xff0c;监控等等问题。这些…

java static 加载顺序_一个例子搞清楚Java类加载顺序

当我们new一个GirlFriend时&#xff0c;我们都做了什么&#xff1f;一个例子搞懂Java程序运行顺序public class Girl {Person person new Person("Girl");static{System.out.println("Girl static");}static Person staticPerson new Person("GirlS…

java 轻量数据库_DBTree是一个springboot2 + vue-element-template实现的轻量数据库表结构查看及管理工具...

DBTree简介DBTree是一个WEB版的轻量数据库表结构查看及管理工具&#xff0c;相比phpMyAdmin, DBTree只专注于方便开发查看表结构信息和 注释维护。通过树形展示库表结构&#xff0c;可以对表进行自定义归类&#xff0c;在线更新注释。你还可以使用它来部分替代mybatis generato…

java通用异常_Java常用异常整理

填坑&#xff0c;整理下Java的常用异常。正确使用异常在实际编码中非常重要&#xff0c;但面试中的意义相对较小&#xff0c;因为对异常的理解和应用很难通过几句话或几行代码考查出来&#xff0c;不过我们至少应答出三点&#xff1a;异常类的继承关系、常用异常类、常用异常类…

java 移动页面中的图片上传_移动端上传图片(ajax跨域请求)

第一次写项目开发经验&#xff0c;望担待。除了前端以外的事就不叨叨了&#xff0c;下面开始弄干活(两个页面首页、列表页)。项目开发简述项目需求&#xff1a;上传图片并展示。项目地址&#xff1a;项目的链接地址开发工具&#xff1a;sublime后台&#xff1a;java开发语言&am…

php session 反序列化,PHP SESSION反序列化本地样例分析

PHP SESSION反序列化本地样例分析0X00漏洞原因主要原因是&#xff1a; ini_set(‘session.serialize_handler’, ‘php_serialize’);ini_set(‘session.serialize_handler’, ‘php’);两者处理session的方式不同。0X01漏洞分析如果在PHP在反序列化存储的$_SESSION数据时使用的…

php 标题去重复思想,WordPress网站发布文章时如何防止发布重复标题的文章?

事实上&#xff0c;所有插件后端代码都等同于将代码片段添加到functions.php中&#xff0c;functions.php代码片段可以生成插件&#xff0c;然后插件可以自然地集成到functions.php中。插件主要易于管理&#xff0c;但也增加了静态资源请求的数量。如果您知道如何处理这些请求&…

无法连接iphone软件更新服务器_苹果发布了iphone、ipad和mac的新软件更新

苹果已经发布了三种操作系统的软件更新&#xff1a;用于iphone和ipod的iOS、ipad的iPadOS和Macs的macOS。这些更新很小&#xff0c;主要集中在bug修复上&#xff0c;而不是添加新功能。这些更新标记为iOS 13.6.1、iPadOS 13.6.1和macOS 10.15.6补充更新。通常&#xff0c;iOS或…

win10升级助手_关闭win10系统更新

为什么要拒绝更新系统呢&#xff1f;&#xff1f;&#xff1f;1.系统更新占用太多时间2.不合时宜的提醒更新严重影响了工作3.对绝大多数人完全没有必要更新系统微软强奸式的要求更新不合清理。同学们的电脑系统大多数是win10家庭版&#xff0c;可以采用下面方案关闭自动更新&am…

matlab 生成信号文件,生成的代码如何存储内部信号、状态和参数数据

浏览模型示例打开模型示例 rtwdemo_roll。open_system(rtwdemo_roll)该模型包含不连接到根级别 Inport 或 Outport 模块的内部信号。某些信号具有名称&#xff0c;例如 phiCmd 信号。该模型还包含一些维护状态数据的模块。例如&#xff0c;在 BasicRollMode 子系统中&#xff0…

苹果平板怎么卸载软件_怎么很好的卸载流氓软件!

我相信在生活当中&#xff0c;很多人都会在不知情或者不注意的情况下&#xff0c;被迫下载很多自己不想要的软件&#xff0c;而且删除之后总是出现&#xff0c;挥之不去。接下来我将会给大家分享几个下载此类软件的方法&#xff1a;一、通过控制面板卸载点击小图标&#xff0c;…

python 循环语句结果存储_python条件语句和循环语句

一、条件语句Python 条件语句跟其他语言基本一致的&#xff0c;都是通过一条或多条语句的执行结果&#xff08; True 或者 False &#xff09;来决定执行的代码块。 Python 程序语言指定任何非 0 和非空&#xff08;null&#xff09;值为 True&#xff0c;0 或者 null为 False。…

使用c++查看linux服务器某个进程正在使用的内存_精选20个常用的Linux命令

今天总结几个非常常用的Linux命令&#xff0c;其中有几个在面试中很可能问相关命令的原理&#xff0c;比如后台运行命令。希望对大家有所帮助&#xff0c;最好自己去尝试在Linux操作系统中实践一下。1 查看目录以及权限在windows中&#xff0c;使用dir查看当前目录中文件。在Li…

台式电脑可以连wifi吗_不使用WIFI,手机也可以通过电脑的网络上网

让手机通过电脑上网的方式有很多种&#xff0c;最常见的就是 WIFI 了&#xff0c;而且简单直接。但是有时候台式机没有 WIFI &#xff0c;或者电脑的 WIFI 设备已经连接到其他的网络了&#xff0c;这时候手机就不能通过电脑的 WIFI 连接到网络。那么还没有有办法连接到网络呢&a…

pgsql 前10条_未来3年,广州83条城中村、285个旧街区将迎来改造

文、图/羊城晚报全媒体记者 赵燕华 通讯员 穗建未来3年&#xff0c;广州83条城中村将实施改造&#xff0c;285个旧街区将迎来改造&#xff0c;推进176个旧厂房改造&#xff0c;将整治1.24亿平方米违建……9月25日&#xff0c;在广州市深化城市更新工作推进高质量发展政策培训暨…