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@guestinstanceof
比较了原型,我想在原型上使用它会产生一些奇怪的结果,但是调用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这是真的。我会修复它。