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"
答案 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
:
请注意,对于
call
和apply
,如果作为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"