Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/443.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 数组原型与文本_Javascript_Prototype - Fatal编程技术网

Javascript 数组原型与文本

Javascript 数组原型与文本,javascript,prototype,Javascript,Prototype,为什么以下条件为假(考虑上述陈述) 不涉及原型继承的东西 两个对象可以不同,但它们的某些属性可以引用相同的对象 Array.prototype === [] //output (false) var arr1 = [1,2,3]; var arr2 = [2,3,4]; Array.prototype是一个数组本身,对于任何空数组(在Chrome…)输出[] 严格相等运算符(==)比较两个数组和数组之间的引用。prototype与数组文字的引用不同。这是因为内存位置 例如,假设您有两个

为什么以下条件为假(考虑上述陈述)


不涉及原型继承的东西

两个对象可以不同,但它们的某些属性可以引用相同的对象

Array.prototype === [] //output (false)   
var arr1 = [1,2,3];
var arr2 = [2,3,4];

Array.prototype
是一个数组本身,对于任何空数组(在Chrome…)输出
[]


严格相等运算符(
==
)比较两个数组和
数组之间的引用。prototype
与数组文字的引用不同。

这是因为内存位置

例如,假设您有两个对象,
{A}
{B}
。是的,两者都属于
对象;然而,这并不意味着
{A}==={B}
。它们不一定具有相同的属性或存在于相同的内存位置

类似地,
Array.prototype
创建一个空白数组
[]
,就像键入数组文本一样,
[]
。然而,这两个调用在
数组中是不同的。prototype
返回所有数组的be all和end all,而
[]
只是在内存中实例化一个新数组。它们都在控制台中“返回”相同的内容,但实际上完全不同。这就是为什么
Array.prototype===Array.prototype
返回
true
,而
[]==[]
返回
false
。关于的MDN文章很好地解释了
.prototype
如何在JavaScript中工作

那么,考虑到
Array.prototype
返回
Array.prototype===Array.prototype
返回true,那么为什么
Array.prototype===[]
返回false呢?这就等于说
var-arr1=[]
var-arr2=[]
是相等的;他们不是

例如,当您有两个阵列时:

var same = {};
var a = {test: same};
var b = {test: same};
console.log(a.test === b.test); // true
console.log(a === b); // false
a.name = 'a';
console.log(b.name); // undefined, because b is a different object
a.same.name = 'arnold';
console.log(b.same.name); // arnold
如果(arr1==arr2)
,则不检查是否与
相等,因为这只会告诉您它们是否存在于同一内存位置。相反,您可以循环并比较元素。对于
Array.prototype==[]
,这是相同的概念,只是数组没有元素

之所以
Array.prototype.slice==[].slice
返回
true
,是因为它在比较两个函数,这两个函数恰好都是
.slice
,这意味着它们占用并引用相同的内存位置。只有当它们确实是同一事物时,它们才是平等的才有意义

Array.prototype === [] //output (false)   
var arr1 = [1,2,3];
var arr2 = [2,3,4];
尝试
Array.prototype.slice==[]拼接
-返回false。在两个不同的位置有两个不同的功能。那么
Array.prototype.slice()==[].slice()
呢?它返回false?什么?为什么?


因为相等运算符的每一侧引用两个不同的内存位置。您在两个不同的数组上调用了
.slice
,因此现在您正在比较两个不同数组的两个不同切片,因此返回
false

方法相同,因为它们指向相同的函数,对象不同,而不是相同的对象,
[]!==[]
我想你想了解原型链:如果你想更多地了解JavaScript中的原型和构造函数,那么下面的答案可能会有所帮助:它不包括Array.prototype是Array的一个实例(我以前不知道)但解释了什么是原型以及如何使用构造函数。“
Array.prototype
本身就是一个数组”
Array.prototype instanceof Array
->false@guest
instanceof
比较了原型,我想在原型上使用它会产生一些奇怪的结果,但是调用
Object.prototype.toString.call(Array.prototype)
输出
“[Object Array]”
。另外
Array.isArray(Array.prototype)
输出
true
@guest:“数组原型对象本身就是一个数组;它的[[Class]]是“数组”,它有一个长度属性(其初始值为+0)和15.4.5.1中描述的特殊[[DefineOwnProperty]]内部方法。”感谢链接,Felix。结果是一个数组(我猜是小写的a),一个对象需要将其[[Class]]内部属性设置为“array”()。这与OO模型中的数组对象不同。@MDN中的来宾:
instanceof操作符测试对象的原型链中是否有构造函数的原型属性。
Array.prototype在其原型链中没有Array.prototype。类似地,在本例中,Foo的
Foo属性
false
Foo=function(){};fooPrototype={};Foo.prototype=fooPrototype;Foo原型实例Foo请编辑。你是正确的,
[]=[]
是错误的,但是如果我理解正确的话,你第三段的第一句话是不正确的。“Array.prototype”不会“创建一个与键入
[]
效果相同的空白数组。有一个数组原型对象。因此
Array.prototype==Array.prototype
的计算结果为
true
@mheiber这是真的。我会修复它。