为什么Array.prototype.some()转换类型?是真的吗?

时间:2015-08-04 10:22:51

标签: javascript arrays prototype

var x = ["foo","bar"]
function eq2(elem) {return elem == this}
function eq3(elem) {return elem === this}

x.some(eq2, "foo") //true
x.some(eq3, "foo") //false

那么x[0]内发生的事情是==="foo"

3 个答案:

答案 0 :(得分:3)

因为您将"foo"作为thisArg to .some()传递,所以它不能将任意字符串用作this - 它需要是对象引用。为此,它会自动将其包装为对象,因此您的代码等同于:

var x = ["foo","bar"]
function eq2(elem) {return elem == this}
function eq3(elem) {return elem === this}

x.some(eq2, new Object("foo")) //true
x.some(eq3, new Object("foo")) //false

这将它变成字符串表示的对象,而不仅仅是原始字符串本身,因此使用类型的比较失败:

console.log("foo");
//foo
console.log(new Object("foo"));
//String {0: "f", 1: "o", 2: "o", length: 3, [[PrimitiveValue]]: "foo"}

答案 1 :(得分:3)

来自MDN on this

  

请注意,对于callapply,如果作为this传递的值不是对象,则会尝试使用内部{{1}将其转换为对象操作。

这导致将对象与原始值进行比较,其中包含:

ToObject

但是(正如Vohuman正确指出的那样):

new String('foo') == 'foo' // true

但是在strict mode中,原始值不会自动生成,因此可以在那里工作:



new String('foo') !== 'foo' // true




答案 2 :(得分:0)

阅读了所有有用的答案后,我最终使用了:

useradd -s /sbin/nologin -d /usr/local/elasticsearch -c "Elasticsearch User"