准确来说,javascript中我们需要称之为数组对象,因为数组就是对象,不信你看:

var a=[1,2,3];

//竟然会弹出object

alert(typeof(a));

之前学习php的时候也接触过php数组,包括索引数组和关联数组。

其中索引数组和js中的数组“表面”上是一样的,取值方式也是类似的。关联数组和js中的普通对象是差不多的。

一直这么认为,然后今天悲剧了,代码如下(千万被运行!):

var arr = brr = new Array();

arr[0] = 'a';

arr[1] = 'a';

arr[2] = 'a';

for(var i=1; i

brr.push(arr[i].replace('a', 'b'));

}

console.log(arr);

console.log(brr);

我只是想给brr填充一些数据而已,浏览器为何会卡死?难道是arr的长度太大了,可是我明明只给了3个元素。

于是我在循环中打印出arr的元素,结果让我震惊了。

var arr = brr = new Array();

arr[0] = 'a';

arr[1] = 'a';

arr[2] = 'a';

for(var i=1; i

brr.push(arr[i].replace('a', 'b'));

console.log(arr);

}

console.log(arr);

console.log(brr);

arr的元素竟然在无限增长,同时我的CPU占用也满了。之后我特意去重新学习了javascript中的数组对象,终于找到了问题的原因:

//例子一: 引用

var myArrayRef = new Array(0,1,2); //创建数组对象

var mySeconArrayRef = myArrayRef; // 对象复制.

myArrayRef[0] = 100; // 修改元素值

/**

* 输出 100; 学过其它语言的都应该知道这里应该输出的是0 为什么输出的是100呢?

* 上面程序通过把myArrayRef对象复制给了mySeconArrayRef这时就存在了2个独立的 但最初值是相同的对象

* 因为是独立的为什么修改myArrayRef会对别一个对象有影响呢?大家都知道只有当他们引用的是同一个对象时这时修改一个才会

* 对别一个产生影响.但是在javascript语言中创建的对象myArrayRef值中其时保存的是对象的引用(也就是一个地址).

* 也就是 我用 new Array生成的保存在内存中而new Array把它所在的地方告诉了myArrayRef,myArrayRef又把这地址告诉了mySeconArrayRef

* 他们两个都指向的是new Array生成对象的地址而不是把对象保存在myArrayRef中,所以通过其中的一个去修改值时其时是修改他们同指象的那对象.

*/

alert(mySeconArrayRef[0] );

//例子二: 赋值

var myVa = 'ABC'; //把ABC的值 赋予了myVa

var myVb = myVa; // myVa 赋值给 myVb

myVa = 'DEF'; //修改myVa

/**

* 输出的是:ABC. 因为是把值保存在了变量了 而不是保存的是引用地址,所以他们两个是相对独立的整体.

*/

alert(myVb);

原来在javascript中的对象赋值都是浅复制,只是传递了内存地址,并未在内存中复制新的拷贝。也就是说我们常常在dom编程中使用以下方式并占用太多的内存,因为他们始终代表同一个对象:function $(id){

return document.getElementById(id);

}

var one = document.getElementById(id);

var two = $("test");

//改变其中任何一个都会直接影响另一个

然而,在php中却没有这样的说法,如果按照下面的方式编写代码,并不会使用引用,而是在内存中直接复制一份:<?php

$arr = $brr = array();

$arr[0] = 'a';

$arr[1] = 'a';

$arr[2] = 'a';

for($i=1; $i

array_push($brr, str_replace('a', 'b', $arr[$i]));

}

var_dump($arr);

var_dump($brr);

var_dump($brr == $arr);

var_dump($brr === $arr);

如果你是在javascript中,还是老老实实分开初始化数组和对象吧:

var arr = new Array();

var brr = new Array();

arr[0] = 'a';

arr[1] = 'a';

arr[2] = 'a';

for(var i=0; i

brr.push(arr[i].replace('a', 'b'));

console.log(arr);

}

console.log(arr);

console.log(brr);

以上便是javascript数组与php数组的差异了。

=======================================================================

其实一开始初始化数组的时候,$arr和$brr已经位于内存中不同的地方了,所以在php中使用赋值语句的时候需要考虑到内存消耗的问题,如果$abcdefghijklmn即使是一个非常难记却又庞大的数组,你贸然使用$arr = $abcdefghijklmn;进行简写,势必会造成此处内存消耗翻倍。

那么php中的数组和普通常量都是直接拷贝一整份内容,那么php的对象呢?<?php

class test{

public $text = 'nothing';

function say()

{

echo $this->text."
";

}

}

//实例化一个a对象

$a = new test();

$a->text = "I am a's object";

$a->say();

//将$a对象直接赋值给$b

$b = $a;

//即使不设置b,输出I am a's object,说明b和a是指向同一份内存的

$b->say();

//改变b的设置a同样也会受到影响

$b->text = "I am b's object";

$a->say();

//我们看下$a===$b是个什么鬼,果然是true

var_dump($a===$b);

在对象的处理上,php和其他语言一样都认为是引用数据类型,唯有php数组被认为是复合数据类型(非引用),而像java这样的语言中数据也是引用数据类型。

另外,php中可以使用单例模式来保证每一次new出来的类指向同一份内存。<?php

//单例模式

class Test {

private $unique;

public $text = 'nothing';

static private $instance;//静态属性保存该类实例

private function __construct(){//构造方法私有(防止外界调用)

$this->unique=rand(0,20000);

}

static public function getInstance(){//静态方法提供对外接口(获取实例)

if(!self::$instance instanceof self){

self::$instance=new self();

}

return self::$instance;

}

private function __clone(){}//私有克隆方法,防止外界直接克隆该实例

}

$test=Test::getInstance();

$test2=Test::getInstance();

$test->text = 'test';

print_r($test);

print_r($test2);

if($test===$test2){

echo 'equal!';

}else{

echo 'not equal!';

}

这个getInstance有什么好处呢?实际上从new过渡到getInstance应该非常方便,只需要改动少量代码,并且无需浪费多余的内存,目前来看还是很不错的。

转载随意~请带上教程地址吧^^

php中不让数组初始化,javascript中数组与php数组初始化差异相关推荐

  1. html数组显示,javascript中怎么输出数组?

    作为一个程序员对于数组遍历大家都不是很陌生,在开发中我们也经常要处理数组.下面我们来看一下JavaScript如何输出数组. JavaScript中可以通过循环遍历数组,在循环中使用document. ...

  2. 如何快速找出找出两个数组中的_找出JavaScript中两个数组之间的差异

    LeetCode今天面临的挑战是在数组中查找所有消失的数字. 蛮力 我们的输入包括一个缺少数字的实际数组.我们想将该数组与相同长度的数组进行比较,其中没有遗漏的数字.所以如果给定的话[4,3,2,7, ...

  3. php检测数组类型,javascript中通过哪些方法来检测数组类型?

    typeof操作符. 对于Function.String.Number.Undefined这几种类型的对象来说,不会有什么问题,但是针对Array的对象就没什么用途了:alert(typeof nul ...

  4. javascript中索引_如何在JavaScript中找到数字在数组中所属的索引

    javascript中索引 Sorting is a very important concept when writing algorithms. There are all kinds of so ...

  5. html中验证密码中是包含字母,在JavaScript中确认密码验证

    在JavaScript中确认密码验证 在本章中,我们将讨论使用JavaScript进行密码验证.每当用户在任何网站或应用上创建帐户时,我们都需要验证密码.因此,我们必须验证有效的密码并进行确认密码验证 ...

  6. wpf绑定 dictionary 给定关键字不再字典中_为什么要在 JavaScript 中学习函数式编程?...

    请忘掉你认为你知道的有关 JavaScript 的任何东西,以初学者心态来接触这份资料. 为帮助你这样做,我们打算从头开始复习 JavaScript 的基础知识, 就好像你以前从来没有看到过 Java ...

  7. java中分支_[Java教程]JavaScript中的分支结构

    [Java教程]JavaScript中的分支结构 0 2016-06-30 23:03:37 说到JavaScript中的分支结构,我们就不得不提到流程控制这个词,我们所有的程序都是由数据和算法组成的 ...

  8. php中this的使用技巧,JavaScript中this关键字使用方法详解

    JavaScript中this关键字使用方法详解 在面向对象编程语言中,对于this关键字我们是非常熟悉的.比如C++.C#和Java等都提供了这个关键字,虽然在开始学习的时候觉得比较难,但只要理解了 ...

  9. js向html中指定位置追加文本,JavaScript中如何添加文本节点?

    在javascript中提供了很多操作DOM文档的方法,当然也包括创建一个节点,下面我们来看一下JavaScript如何创建一个创建一个文本节点(text). JavaScript中添加文本节点的方法 ...

最新文章

  1. HDD工作原理 导图
  2. AI最佳论文都在这里了!(非常全,快领!)
  3. Spring学习详解(1)——Spring入门详解
  4. 旋转角度_办公娱乐新神器!这款稳固的创意支架,360°旋转随便换角度
  5. shell 获取ora报错信息_频发:故障排除之又见 ORA-4031丨云和恩墨技术通讯
  6. 0330复利计算(修改版)
  7. React Hooks的使用(一)——useState、useEffect解析
  8. 阿里重启维护Dubbo了
  9. JMeter基础之组件的作用域与执行顺序
  10. python生成三维点云包围盒
  11. Python3教程--和小名一起学Python
  12. 计算机音乐我还是曾经那个少年,我还是曾经的那个少年什么歌曲
  13. 计算机组成原理--数制与编码(校验码,CRC,汉明码详解)
  14. 一个口 光纤 两条线 交换机 上 光纤 两条线 双纤 单纤 尾纤 分光器 双纤 双纤转单纤 接 分光器
  15. 【CSS基础】Sass预处理器个人学习使用记录
  16. 如何注册腾讯云个人账号(图文教程)
  17. 广东省公共资源交易平台逆向分析
  18. sklearn和libsvm吗_机器学习笔记(3)-sklearn支持向量机SVM
  19. MATLAB导入数据importdata功能
  20. nbs***bsp;是牛客的bug吗

热门文章

  1. “JavaSwing” ——简单使用
  2. 源码编译构建安装内核kernel
  3. Linux 原生异步 IO 原理与使用
  4. Linux内核:网络过滤器简介与示例代码
  5. python vs golang_Ruby vs Golang:四个维度对比,谁更胜一筹?
  6. javscript之数组(一)
  7. Java中的枚举类型学习
  8. Unity2020.1新功能探路:2D设计师工具相关更新
  9. OpenShift 4.3 - 获得ImageStream中使用的应用镜像离线包
  10. 项目管理工具project软件学习(六) - 设置里程碑、任务备注